比較地理位置遠近
阿新 • • 發佈:2021-02-16
場景: 比如使用者購買商品,系統需要計算出離使用者收貨地址最近的倉庫發貨
智慧拆分訂單,實現最近的倉庫發貨
主要sql
SELECT id FROM (SELECT w.id, st_distance ( POINT (122.268278, 40.731062), POINT (w.lng, w.lat) ) * 111195 / 1000 AS distance FROM `t_warehouse` w JOIN `t_warehouse_sku` ws ON w.id = ws.`warehouse_id` WHERE ws.`sku_id` = 1 AND ws.`num` >= 1 ORDER BY distance LIMIT 1) t
虛擬碼
package cc.sunni.neti; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.mysql.cj.jdbc.Driver; import java.sql.*; import java.util.HashMap; /** * @author jl * @since 2021/2/15 20:00 */ public class BaiduMapDemo { public static void main(String[] args) { HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("address", "北京市海淀區上地十街10號"); paramMap.put("ak", "AVn7G3Wf9dj1f3HKPVAoGuw1eufazq14"); paramMap.put("output", "json"); String result = HttpUtil.get("http://api.map.baidu.com/geocoding/v3", paramMap); JSON json = JSONUtil.parse(result); // {"status":0,"result":{"location":{"lng":116.3084202915042,"lat":40.05703033345938},"precise":1,"confidence":80,"comprehension":100,"level":"門址"}} String lng = json.getByPath("result.location.lng", String.class); String lat = json.getByPath("result.location.lat", String.class); System.out.println("lng:" + lng); System.out.println("lat:" + lat); try { DriverManager.registerDriver(new Driver()); String url = "jdbc:mysql://127.0.0.1:3306/neti?serverTimezone=Asia/Shanghai"; String username = "root"; String password = "123456"; Connection con = DriverManager.getConnection(url, username, password); String sql = "SELECT\n" + " id\n" + "FROM\n" + " (SELECT\n" + " w.id,\n" + " st_distance (\n" + " POINT (?, ?),\n" + " POINT (w.lng, w.lat)\n" + " ) * 111195 / 1000 AS distance\n" + " FROM\n" + " `t_warehouse` w\n" + " JOIN `t_warehouse_sku` ws\n" + " ON w.id = ws.`warehouse_id`\n" + " WHERE ws.`sku_id` = ?\n" + " AND ws.`num` >= ?\n" + " ORDER BY distance\n" + " LIMIT 1) t"; PreparedStatement ps = con.prepareStatement(sql); // 使用者收貨地址經緯度 ps.setObject(1,lng); ps.setObject(2,lat); // skuId ps.setObject(3,1); // 購買數量 ps.setObject(4,5); ResultSet resultSet = ps.executeQuery(); while (resultSet.next()) { int id = resultSet.getInt("id"); System.out.println(id); } con.close(); } catch (Exception e) { e.printStackTrace(); } } }