根据经纬度坐标计算距离-python
一、两个坐标之间距离计算
参考链接:
python实现
案例1、2,因为都是用LBS 球面距离公式(haversine公式)结果完全相同, 且与 geopy相差不大。
geopy是一个关于地理编码的python库。主要有以下几个功能:(需要联网)
- 地理编码:将字符串转换为地理位置
- 逆地理编码:用于将地理坐标转换为具体地址
- 计算两个点的距离:经纬度距离和球面距离
代码:
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的更多相关文章
- 通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ
通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double ...
- 通过两个位置的经纬度坐标计算距离(C#版本)
/// <summary> /// 通过地图上的两个坐标计算距离(C#版本) /// Add by 成长的小猪(Jason.Song) on 2017/11/01 /// http://b ...
- Java 根据两个经纬度坐标计算距离
public class Distance{ private static final double EARTH_RADIUS = 6378137; private static double ...
- java 根据经纬度坐标计算两点的距离算法
/** * @Desc 根据经纬度坐标计算两点的距离算法<br> * @Author yangzhenlong <br> * @Data 2018/5/9 18:38 */ p ...
- 用墨卡托和GPS坐标计算距离时误差测试
iOS墨卡托和GPS坐标计算距离时误差测试,测试结果: 墨卡托和gps坐标来回转换没有误差. 墨卡托坐标计算出的距离比gps坐标计算出的距离大,100/92*100 = 108米,每100米多算出8米 ...
- Android给定坐标计算距离
给定两点的经纬度.计算两点之间的距离.这里要注意经纬度一定要依照顺序填写 1. 利用android中的工具获得,单位是米 float[] results=new float[1]; Location. ...
- PHP 根据两个坐标计算距离 圆形围栏的计算
可以应用于圆形电子围栏入 出围栏计算 圆形电子围栏的计算方式是: 根据圆心坐标和当前检查的坐标进行距离计算,如果距离长度超出围栏的半径,则判定为出围栏,反之是在围栏之内 <?php /** * ...
- 计算两个经纬度之间的距离(python算法)
EARTH_REDIUS = 6378.137 def rad(d): return d * pi / 180.0 def getDistance(lat1, lng1, lat2, lng2): r ...
- 根据坐标计算距离(mysql函数)
CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(lng1 ) BEGIN DECLARE result double; DECLARE ...
随机推荐
- JDK中的SimpleDateFormat线程非安全
在JDK中使用SimpleDateFormat的时候都会遇到线程安全的问题,在JDK文档中也说明了该类是线程非安全的,建议对于每个线程都创建一个SimpleDateFormat对象.如下面一个Case ...
- 【BZOJ2724】蒲公英(分块)
[BZOJ2724]蒲公英(分块) 题面 洛谷 谴责权限题的行为 题解 分块什么的都不会,根本就没写过几次. 复杂度根本不会分析,吓得我赶快来练练. 这题要求的是区间众数,显然没有什么很好的主席树之类 ...
- C++接口继承与实现继承的区别和选择
1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...
- 响应式开发(二)-----Bootstrap框架的介绍
简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架,是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的, ...
- 前端学习 --Css -- 子元素的伪类
:first-child 寻找父元素的第一个子元素,在所有的子元素中排序: :last-child 寻找父元素的最后一个子元素,在所有的子元素中排序: :nth-child 寻找父元素中的指定位置子元 ...
- C标准库函数--文件IO操作函数。
C标准库文件读写函数总结:都是对文件流进行输入输出的函数分为对文件的有格式读写以及无格式读写 一.文件的无格式读写根据每次读写字符的数量,分为三类:1.按字符读写文件 按字符读有三个函数:以下三个函数 ...
- [opencv] 图像几何变换:旋转,缩放,斜切
几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...
- Eclipse开发java程序里Test用不了,怎么导包?
1.右键项目Build Path->Add External JARs,选择要导入的jar包即可: 2.建立方法,引入junit. 3.ok
- apt代理设置
内网apt使用代理 /etc/apt/apt.conf Acquire::http::Proxy "http://guest:password@ip:port";
- python线程进程
多道技术: 多道程序设计技术 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬.软件资源.当一道程序因I/O请 ...