ホームページ >データベース >mysql チュートリアル >Mysql を使用して住所の経度、緯度、距離、リアルタイムの位置を計算する
最近、あるプロジェクトに取り組んでいたときに、このような要望に遭遇しました。
クリックすると、カード パッケージ内のカードとクーポンが使用されます。カードとクーポンが使用される近くの店舗を表示する必要があります。
#アイデアデータベース アドレス テーブルの設計タイプ | 備考 | |
---|---|---|
bigint | エリアID | |
varchar( 32) | エリア名 | |
bigint | は親エリアID | #に属します |
int | Level | |
char | 地域タイプ 0 国 1州 市区町村 2 県市 3 郡 郡 | |
varchar(32) | エリア名 | ## parent_id |
親領域の ID | level | |
Level |
背景も変更できます
第 4 レベルの地域のソースアドレス データは、オンラインで見つけた json ファイルを形式に従ってデータベースに注ぎ込んだものです。
#要件の実現/** * 地理/逆地理编码 * 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("地址经纬度识别识别"); } String lat = longitude.split(",")[1]; String lng = longitude.split(",")[0]; address.setLat(lat); address.setLng(lng); return address; }
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}
以上がMysql を使用して住所の経度、緯度、距離、リアルタイムの位置を計算するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。