Maison  >  Article  >  base de données  >  Utilisez MySQL pour calculer la longitude, la latitude, la distance et la localisation en temps réel de l'adresse

Utilisez MySQL pour calculer la longitude, la latitude, la distance et la localisation en temps réel de l'adresse

王林
王林avant
2023-06-03 16:19:041559parcourir

    Avant-propos

    Lorsque je travaillais sur un projet récemment, j'ai rencontré un besoin comme celui-ci,

    Utilisez MySQL pour calculer la longitude, la latitude, la distance et la localisation en temps réel de ladresse

    Cliquez sur le paquet de cartes pour utiliser les coupons, et vous devez afficher les magasins à proximité où les coupons sont utilisés,

    idées

    Conception de la table d'adresses de la base de données

    • Table universelle des adresses postales régionales tz_sys_area

    Nom du champ type Remarques
    sont a_id bigint identifiant de zone
    area_name varchar (32) Region name
    parent_id bigint L'ID de la région parent
    level int level
    type char Région Type 0 Pays 1 Province Municipalité 2 Préfecture, ville, district et comté
    area_name varchar(32) area name
    parent_id bigint parent Area ID
    level int Niveaux

    Utilisez MySQL pour calculer la longitude, la latitude, la distance et la localisation en temps réel de ladresse

    L'arrière-plan peut également être modifié

    Utilisez MySQL pour calculer la longitude, la latitude, la distance et la localisation en temps réel de ladresse

    La source des données d'adresse régionale de quatrième niveau est le fichier json que j'ai trouvé en ligne puis versé dans la base de données selon le format

    • Table d'adresses du magasin tz_address

    Utilisez MySQL pour calculer la longitude, la latitude, la distance et la localisation en temps réel de ladresse

    Exigences Pour implémenter

    • ici, vous devez utiliser la longitude et la latitude

    Vous devez utiliser l'interface API Amap géographie/géocodage inversé pour obtenir la latitude de l'adresse et la longitude et enregistrez-la

     /**
         * 地理/逆地理编码
         * 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;
        }

    Utilisez

     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;
        }
    • MySQL pour calculer la distance de l'adresse actuelle en fonction de la longitude et de la latitude Emplacement

     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}

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer