工作中我们经常遇到1经度或1纬度对应的距离,以及有了距离相应的经纬度差是多少
1、1公里对应的经纬度差
如果地球是个规则的球体,其周长是40076千米,那么1个360度的经度圈周长也是40076千米(和赤道圈一样),推断出1度经度的距离是40076/360=111千米;而1纬度的距离和它所在的纬度带有关。
import numpy as np
import math
# 区域范围
bound = {}
bound['min_lon'] = 102.2 # min_lon
bound['min_lat'] = 24.5 # min_lat
bound['max_lon'] = 103.5884 # max_lon
bound['max_lat'] = 26.5436 # max_lat
"""
目的:将此区域划按照1公里网格进行划分
转换:因为此处区域单位是经纬度,所以需要将距离(1公里)转换成经纬度
"""
grid_length=1 #网格边长是1公里
mid_lat=(bound['min_lat']+bound['max_lat'])/2#中间纬度
lon_to_km=111*np.cos(math.pi*mid_lat/180) #1经度差距离 角度转弧度: π/180×角度 1度纬度弧长=111*cos(纬度),1度弧长相当于1度経度差
lat_to_km=111 #1纬度差距离等于1经度长度
length_lon=grid_length/lon_to_km #1公里对应経度差
length_lon=grid_length/lat_to_km
#求此区域1公里对应的経度差、纬度差
grid_lon_arange=np.arange(bound['min_lon'],bound['max_lon'],lon_to_km)
grid_lat_arange=np.arange(bound['min_lat'],bound['max_lat'],lon_to_km)
2、有了距离求相应的经纬度差
from scipy.stats import norm # 提供高斯噪声
import numpy as np
import math
usages=np.array([[102.705443, 25.08218 ],
[102.919635, 25.086187],
[102.711445, 25.064534],
[102.652288, 25.093385],
[102.638036, 25.07871 ],
[102.816516, 24.983468]])
service_length=1 #标准差等于服务半径
min_lat=usages[0][1]
max_lat=usages[len(usages)-1][1]
mid_lat=(min_lat+max_lat)/2
bias1 = norm.rvs(scale=service_length, size=len(usages)) #经度偏离位置
bias1_lon=bias1*(1/(111*np.cos(math.pi*mid_lat/180)))
bias2 = norm.rvs(scale=service_length, size=len(usages)) #纬度偏离位置
bias2_lat=bias2*(1/111)
usages=usages+np.array([bias1_lon,bias2_lat]).T