数据的精度处理
from decimal import *
getcontext().prec = 9
自定义函数
法一:用三角函数+角度
from math import radians, cos, sin, asin, sqrt
def geodistance(lng1,lat1,lng2,lat2):
lng1 = Decimal(lng1)
lat1 = Decimal(lat1)
lng2 = Decimal(lng2)
lat2 = Decimal(lat2)
lng1, lat1, lng2, lat2 = map(radians, [lng1, lat1, lng2, 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
return distance
法2:公式不同
import math
def get_lng_lat(nj,nw,oj,ow):
nj = Decimal(nj)
nw = Decimal(nw)
ow = Decimal(oj)
oj = Decimal(ow)
C = math.cos(nw) * math.cos(ow) * math.cos(nj - oj) + math.sin(nw) * math.sin(ow)
R = 6371004
Dis = int(R * math.acos(C))
return Dis
这两种方法不知道哪种正确。但是根据导包的运算结果来说,第一种更准确点。
d
i
s
t
a
n
c
e
=
a
c
o
s
(
s
i
n
(
l
a
t
a
)
?
s
i
n
(
l
a
t
b
)
+
c
o
s
(
l
a
t
a
)
?
c
o
s
(
l
a
t
b
)
?
c
o
s
(
l
o
n
a
?
l
o
n
b
)
)
?
R
;
distance = acos( sin(lat_a) * sin(lat_b) + cos(lat_a) * cos(lat_b) * cos(lon_a - lon_b) ) * R;
distance=acos(sin(lata?)?sin(latb?)+cos(lata?)?cos(latb?)?cos(lona??lonb?))?R;
法3:
见联接: https://blog.csdn.net/zhuqiuhui/article/details/53180395
导包
from geopy.distance import geodesic
dic3=geodesic((32.054243,118.793547),(32.058552,118.797639)).m
print(dic3)
求1米对应的经纬度
地球半径:6378137米 任意地球经度周长:2 * 6378137米 * Math.PI = 40075016.68557849 米 南纬38度地球周长: 40075016.68557849 * Math.cos(32) = 33431515.091797758米 方法:360度/周长~~1米的度数 前提:为了简化计算,我们采用球形映射,而不是椭球体形状
a = 40075016.68557849 * math.cos(32)
print(a)
w = 100 *360/a
print(w)
|