?數(shù)據(jù)庫(kù)地址表設(shè)計(jì)
通用的區(qū)域街道地址表tz_sys_area
字段名稱類型備注
area_idbigint區(qū)域 ID
area_namevarchar(32)區(qū)域名稱
parent_idbigint所屬父區(qū)域 ID
levelint層級(jí)
typechar區(qū)域類型 0 國(guó)家 1 省份直轄市 2 地市 3 區(qū)縣
area_namevarchar(32)區(qū)域名稱
parent_idbigint所屬父區(qū)域 ID
levelint層級(jí)
后臺(tái)也可以做修改
四級(jí)區(qū)域地址數(shù)據(jù)來源我在網(wǎng)上找的 json 文件然后按照格式倒入到的數(shù)據(jù)庫(kù),需要的可以關(guān)注我的公眾號(hào)猿小叔
門店地址表tz_address
需求實(shí)現(xiàn)
這里計(jì)算距離就需要用到經(jīng)緯度
需要使用高德地圖 api 接口地理/逆地理編碼獲取地址經(jīng)緯度并保存
/**
? ? * 地理/逆地理編碼 (java項(xiàng)目大全 fhadmin.cn)
? ? * https://lbs.amap.com/api/webservice/guide/api/georegeo
? ? *
? ? * @return
? ? */
? ? public String addressToLongitude(String address) {
? ? ? ? String longitude = "";
? ? ? ? String urlString = "?key={key}&address={address}&output=JSON";
? ? ? ? String response = restTemplate.getForObject(ApiAction.API_GEOREGO_TEST + urlString, String.class, apiKey, address);
? ? ? ? if (StrUtil.isEmpty(response)) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? JSONObject jsonObject = JSON.parseObject(response);
? ? ? ? String code = jsonObject.getString("infocode");
? ? ? ? if (code.equals("10000")) {
? ? ? ? ? ? JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
? ? ? ? ? ? JSONObject jsonObject1 = (JSONObject) jsonArray.get(0);
? ? ? ? ? ? longitude = jsonObject1.get("location").toString();
? ? ? ? } else {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? return longitude;
? ? }
private Address setlngAndLat(Address address) {
? ? ? ? String addr = address.getProvince() + address.getCity() + address.getArea() + address.getAddr();
? ? ? ? String longitude = gaoDeService.addressToLongitude(addr);
? ? ? ? if (StrUtil.isBlank(longitude)) {
? ? ? ? ? ? throw new BusinessException("地址經(jīng)緯度識(shí)別識(shí)別");
? ? ? ? }
? ? ? ? String lat = longitude.split(",")[1];
? ? ? ? String lng = longitude.split(",")[0];
? ? ? ? address.setLat(lat);
? ? ? ? address.setLng(lng);
? ? ? ? return address;
? ? }
MySQL 根據(jù)經(jīng)緯度計(jì)算地址距離當(dāng)前位置
SELECT
? ? ? ? ? ? ? (
? ? ? ? ? ? ? ? ? ? ? 6371 * acos(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cos(radians(#{lat}))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? * cos(radians(lat))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? * cos(radians(lng) - radians(#{lng}))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + sin(radians(#{lat}))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? * sin(radians(lat))
? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ) AS distance
? ? ? ? FROM tz_user_addr where addr_id=#{storeAddrId}