在GIS开发过程中,空间直角坐标系与求坐标系内的点坐标互相转化是很经常的事情,比如:给你两个点以及这两个点各自的经纬度数据,需要求解给定两点在空间坐标系内的直线距离以及两点之间的方位角,方位角就是从正北方向顺时针旋转到两点连线位置处的夹角值;又或者,给定你一点的经纬度数据以及另一点与该点的方位角和直线距离值,求解另一点所处位置的经纬度数据,等等,这样的转化求解需求还有很多。
今天,正好有一个小的需求就是:给你两个点以及这两个点各自的经纬度数据,需要求解给定两点在空间坐标系内的直线距离以及两点之间的方位角。这里基于Python实现了当前的需求,记录一下。
实现的思想是很简单的,具体实现如下:
def geoDistance(lng1,lat1,lng2,lat2):
'''
公式计算两点间距离(m)
'''
#经纬度转换成弧度
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,3)
return distance
def geoDegree(lng1,lat1,lng2,lat2):
'''
公式计算两点间方位角
方位角:是与正北方向、顺时针之间的夹角
'''
lng1,lat1,lng2,lat2=map(radians,[float(lng1),float(lat1),float(lng2),float(lat2)])
dlon=lng2-lng1
y=sin(dlon)*cos(lat2)
x=cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dlon)
brng=degrees(atan2(y,x))
brng=(brng+360)%360
return brng
接下来在地图上选择两点来进行实验,具体如下:
lat1,lon1=[35.290352,115.494621]
lat2,lon2=[35.2001683095097,115.38481076966019]
print('distance: ',geoDistance(lon1,lat1,lon2,lat2))
print('degree: ',geoDegree(lon1,lat1,lon2,lat2))
结果如下:
('distance: ', 14142.205)
('degree: ', 224.87151378652962)
结果几乎是十分地准确了哈,记录一下!