如何用python计算两点之间的距离,Python计算两点距离

  如何用python计算两点之间的距离,Python计算两点距离

  问题描述:

  通常,为了得到一个地理位置上两点之间的实际距离(例如北京和杭州之间的实际距离),除了用经纬度计算两点之间的空间距离外,还要考虑地形因素。由于考虑地形引起的误差较大,采用微分法求解。简单来说,就是把两点细分成多个点之间的距离(当然,多个点是有限的)。

  图,计算AB之间的距离,可以计算中间多个点的距离(比如AC),然后计算在AB直线上的投影。在此之前,我们需要计算球面上两条直线的夹角和球面上两点之间的距离。

  1)球面上两条直线之间的角度

  方法一:简单版中,将球弧视为直角坐标系中的直线,采用矢量积。角度=弧cos (a1a2/a1a2)

  方法二:将球坐标系变换到三维笛卡尔坐标系,然后用矢量积计算角度。

  这里考虑到矢量的方向性和准确性,最好采用第二种方法。

  def latlong_to_3d(latr,lonr): 假定球体半径为1,将给定纬度和经度(以弧度表示)的点转换为三维空间。 Return NP . array((math . cos(latr)* math . cos(lonr),math.cos(latr) * math.sin(lonr),math . sin(latr))def angle _ between _ vectors _ degrees(u,v): 返回任意维空间中两个向量之间的角度,以度为单位。 return NP . degrees(math . acos(NP . dot(u,v)/(NP . linalg . norm(u)* NP . linalg . norm(v)))#将点转换为numpy纬度/经度弧度spacea=NP . radians(NP . array(A))B=NP . radians(NP . array(B))C=NP . radians(NP . array(C))# 3D space a3=latlong _ to _ 3D(* A)B3=latlong _中的点

  s=R arc cos[cos1 cos2 cos(1-2)sin1 sin2]

  详见球面两点间距离原理。

  或者使用谷歌地图方法:

  地球上任意两点的经度为A1和A2(E为正,W为负),纬度为B1和B2(N为正,S为负)。

  设A0=(A1-A2)2,B0=(双B2)2

  f=sinb 0sinb 0 cos B1cos B2Sina 0Sina 0

  S=2Rf

  依次计算各站在一条直线上的投影,再考虑两点之间的高程数据,累加得到AB之间的实际距离。

  附加的代码如下:

  从DBF导入熊猫作为PD读取从数学导入DBFimport OS导入numpy作为NP导入radians,cos,sin,asin,sqr导入mathdef地理距离(LNG 1,lat1,lng2,lat2): lng1,lat1,lng2,lat2=map(radians,[float(lng1),float(lat1),float(lng2),float(la T2)]#经纬度转换成弧度dlon=LNG 2-LNG 1 dlat=拉T2-拉t1 a=sin(dlat/2)* 2 cos(拉t1)* cos(拉T2)* sin(dlon/2)* 2 distance=2 * asin(sqrt(a))* 6371 * 1000 #地球平均半径,6371km # distance=round(distance/1000,3)回程距离def latlong _ to _ 3d(latr,lonr): 将给定纬度和经度(以弧度表示)的点转换为三维空间,假设球体半径为1。‘’返回NP。数组((数学。cos(latr)*数学。cos(lonr),math.cos(latr) * math.sin(lonr),math。sin(latr))def angle _ between _ vectors _ degrees(u,v): 返回任意维空间中两个向量之间的角度,以度为单位 返回NP。学位(数学。acos(NP。dot(u,v)/(NP。利纳格。norm(u)* NP。利纳格。norm(v)))path=r d:\ 2021 02 08 filetype= .dbf#指定文件类型total=[]def get_filename(path,filetype):name=[]final _ name=[]对于OS中的根、目录、文件。walk(path):for I in files:if filetype in I:name。append(I . replace(filetype, ))#生成不带csv 后缀的文件名组成的列表final _ name=[item].名称中项目的" DBF]#生成csv 后缀的文件名组成的列表返回final_name#输出由有csv 后缀的文件名组成的列表path_all=get_filename(path,filetype)for j in path _ all:table=DBF(path / j)#,encoding=GBK) df=pd .数据帧(ITER(表))total _ distance=0.0 total _ distance _ plain=0.0 A=(df[ POINT _ Y ][0],df[POINT_X][len(df)-1],df[ POINT _ X ][len(df)-1])A=NP。弧度(NP。array(A))B=NP。弧度(NP。数组(B))对于范围内的n(len(df)-1):C=。求2D空间中向量之间的角度角度3 deg _ A=角度_ between _ Vectors _ degrees(b3vec,d3vec)# 3D空间中向量a3vec=a3-D3 C3 vec=C3-D3如果C==A:角度3 deg _ d=0否则:#求2D空间中向量之间的角度角度3 deg _ d=角度_ between _ Vectors _ degrees(a3vec,C3 vec)如果角度3 deg _ d 90:角度3 deg=角度3 deg _ A角度3 deg _ d否则:角度3 deg=1地表距离total _ distance _ plain=total _ distance _ plain x #弧面距离total.append((j,total_distance))打印(总计)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: