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

参考链接:

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):

根据经纬度坐标计算距离-python的更多相关文章

  1. 通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ

    通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double ...

  2. 通过两个位置的经纬度坐标计算距离(C#版本)

    /// <summary> /// 通过地图上的两个坐标计算距离(C#版本) /// Add by 成长的小猪(Jason.Song) on 2017/11/01 /// http://b ...

  3. Java 根据两个经纬度坐标计算距离

    public class Distance{ private static final double EARTH_RADIUS = 6378137;    private static double  ...

  4. java 根据经纬度坐标计算两点的距离算法

    /** * @Desc 根据经纬度坐标计算两点的距离算法<br> * @Author yangzhenlong <br> * @Data 2018/5/9 18:38 */ p ...

  5. 用墨卡托和GPS坐标计算距离时误差测试

    iOS墨卡托和GPS坐标计算距离时误差测试,测试结果: 墨卡托和gps坐标来回转换没有误差. 墨卡托坐标计算出的距离比gps坐标计算出的距离大,100/92*100 = 108米,每100米多算出8米 ...

  6. Android给定坐标计算距离

    给定两点的经纬度.计算两点之间的距离.这里要注意经纬度一定要依照顺序填写 1. 利用android中的工具获得,单位是米 float[] results=new float[1]; Location. ...

  7. PHP 根据两个坐标计算距离 圆形围栏的计算

    可以应用于圆形电子围栏入 出围栏计算 圆形电子围栏的计算方式是: 根据圆心坐标和当前检查的坐标进行距离计算,如果距离长度超出围栏的半径,则判定为出围栏,反之是在围栏之内 <?php /** * ...

  8. 计算两个经纬度之间的距离(python算法)

    EARTH_REDIUS = 6378.137 def rad(d): return d * pi / 180.0 def getDistance(lat1, lng1, lat2, lng2): r ...

  9. 根据坐标计算距离(mysql函数)

    CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(lng1 ) BEGIN DECLARE result double; DECLARE ...

随机推荐

  1. 【poj1743】 Musical Theme

    http://poj.org/problem?id=1743 (题目链接) 题意 给出n个音符的乐谱,求其中不重叠的重复最长连续段,重复连续段的定义为两段音符起伏相同. Solution 论文题,相邻 ...

  2. WEB入门三 CSS样式表基础

    学习内容 Ø        CSS的基本语法 Ø        CSS选择器 Ø        常见的CSS样式 Ø        网页中3种使用CSS的方式 能力目标 Ø        理解CSS的 ...

  3. python入门:求1-2+3-4+5...99的所有数的和

    #!/usr/bin/env python # -*- coding:utf-8 -*- #求1-2+3-4+5...99的所有数的和 """ 给start赋值为1,su ...

  4. Chapter4(表达式) --C++Prime笔记

    1.重载运算符:为已经存在的运算符赋予另外一层含义. 2.左值与右值:   ①当一个对象被用作右值的时候,用的是对象的值(内容):当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置). ②在 ...

  5. unicode utf8 学习记录

    显示器- unicode -系统- utf8 -存储设备 Unicode是一套复杂的字符编码标准,简单来说就是将人类使用的每个所谓字符与一个非负整数对应,并且保证不同的字符对应的整数一定不同.UTF- ...

  6. RGB色彩对照表

    RGB色彩对照表   #FFFFFF   #FFFFF0   #FFFFE0   #FFFF00   #FFFAFA   #FFFAF0   #FFFACD   #FFF8DC   #FFF68F   ...

  7. jQuery.Validator Sample

    <!DOCTYPE html> <html> <head> <title></title> <script src="./j ...

  8. python核心编程笔记——Chapter5

    好吧,开始第五章习题: 5-2.又是老调重谈,raw_input这个函数真是非常麻烦,返回是str类型,没办法,只能在函数里面使用int内建.(就只是一道简单的两数相乘,哭了) #!/usr/bin/ ...

  9. 点击搜索条件提交form表单

    思路:点击搜索,javascript跳转提交方法,提交整个表单. //组员下拉框选择分组事件 $('#s-member').change(function(){ $('#logForm').submi ...

  10. (转)Oracle 字符集的查看和修改

    一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...