• 根据经纬度坐标计算距离-python


     一、两个坐标之间距离计算

    参考链接:

    python实现

    1、Python 根据地址获取经纬度及求距离

    2、python利用地图两个点的经纬度计算两点间距离

      LBS 球面距离公式   

           美团app筛选“离我最近” 之 地理空间距离计算优化   

    案例1、2,因为都是用LBS 球面距离公式(haversine公式)结果完全相同, 且与 geopy相差不大。

    原文:geopy在python中的使用

    geopy是一个关于地理编码的python库。主要有以下几个功能:(需要联网)

    1. 地理编码:将字符串转换为地理位置
    2. 逆地理编码:用于将地理坐标转换为具体地址
    3. 计算两个点的距离:经纬度距离和球面距离

    代码:

    from math import radians, cos, sin, asin, sqrt

    #公式计算两点间距离(m)

    def geodistance(lng1,lat1,lng2,lat2):
      #lng1,lat1,lng2,lat2 = (120.12802999999997,30.28708,115.86572000000001,28.7427)
      lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)]) # 经纬度转换成弧度
      dlon=lng2-lng1
      dlat=lat2-lat1
      a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
      distance=2*asin(sqrt(a))*6371*1000 # 地球平均半径,6371km
      distance=round(distance/1000,3)
      return distance

    # 返回 446.721 千米

    #调用geopy包中的方法

    from geopy.distance import geodesic

    print(geodesic((30.28708,120.12802999999997), (28.7427,115.86572000000001)).m) #计算两个坐标直线距离
    print(geodesic((30.28708,120.12802999999997), (28.7427,115.86572000000001)).km) #计算两个坐标直线距离
    # 返回 447.2497993542003 千米


    # 南昌:华东交通大学(120.12802999999997,30.28708)
    # 杭州:浙江工商大学(115.86572000000001,28.7427)
    # 用百度地图测量结果:447.02km


     

      

    二、中文位置 转 经纬度坐标

    1. 地理编码/逆地理编码 ★★★ (日6000次)

      (地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力。) Python程序参考

      高德接口:https://lbs.amap.com/api/webservice/guide/api/georegeo

     

    2. 搜索POI   ★★★★★  (日2000次)

      (搜索服务API是一类简单的HTTP接口,提供多种查询POI信息的能力,其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。)

      高德接口:https://lbs.amap.com/api/webservice/guide/api/search

    3. 调用geopy包 

      结果偏差,可能使用的google api;且只能按照 省市区(县),无法到 乡镇。且速度慢。

    import requests
    #使用高德API-地理/逆地理编码:https://lbs.amap.com/api/webservice/guide/api/georegeo
    def geocodeG(address):
        key = '07ac12a00f830764ebfdee2fd0bc96fd'
        par = {'address': address, 'key': key}
        base = 'http://restapi.amap.com/v3/geocode/geo'
        response = requests.get(base, par)
        answer = response.json()
        return answer['geocodes'][0]['location']
    
    address='原阳县酒楼' #非结构化的位置,返回结果不准(结构化的数据效果很好)
    print(geocodeG(address))
    输出:113.912220,35.386060
    #使用高德API-搜索POI:https://lbs.amap.com/api/webservice/guide/api/search def geocodeG2(address): key = '07ac12a00f830764ebfdee2fd0bc96fd' par = {'keywords': keywords, 'key': key,'offset':1} base = 'https://restapi.amap.com/v3/place/text' response = requests.get(base, par) answer = response.json() return answer['pois'][0]['location'] address='原阳县酒楼' #模糊匹配、关键词搜索 效果很好 print(geocodeG2(address))

    输出:113.961655,35.057336

    from geopy.geocoders import Nominatim
    # 结果的经纬度,与高德有1-2公里偏差; 且只能按照 省市区(县),无法到 乡镇; 且速度慢
    def geocodeN(address):
        gps=Nominatim(user_agent="my-application")
        location=gps.geocode(address)
        return location.longitude,location.latitude
    
    
    address = "四川乐山市峨眉山市"
    print(geocodeN(address))
    address = "四川乐山市峨眉山市高桥镇"
    print(geocodeN(address))

    输出:

    (103.48222, 29.60173)
    Traceback (most recent call last):

  • 相关阅读:
    数据库的单表查询Ⅰ
    数据库的基本操作Ⅲ
    数据库基本操作Ⅱ
    数据库的基本操作Ⅰ
    MYSQL的三种安装方式
    操作系统学期小结二
    操作系统学期小结一
    MAP接口课堂练习
    关于list接口和set接口的示例应用
    课堂作业整理三 (集合:list接口)
  • 原文地址:https://www.cnblogs.com/andylhc/p/9481636.html
Copyright © 2020-2023  润新知