Maison > base de données > tutoriel mysql > 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

王林
Libérer: 2023-06-03 16:19:04
avant
1632 Les gens l'ont consulté

    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;
        }
    Copier après la connexion

    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;
        }
    Copier après la connexion
    • 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}
    Copier après la connexion

    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!

    Étiquettes associées:
    source:yisu.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal