经纬度距离计算 python_Python已知两坐标求距离

经纬度距离计算 python_Python已知两坐标求距离#coding:utf-8#封装函数importmathdefcal_dis(latitude1,longitude1,latitude2,longitude2): latitude1=(Math.PI/180)*latitude1 latitude2=(Math.PI/180)*latitude2 longitude1=(Math.PI/180)*longitu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

#coding: utf-8
#封装函数
import math
def cal_dis(latitude1, longitude1,latitude2, longitude2):
	latitude1 = (Math.PI/180)*latitude1
	latitude2 = (Math.PI/180)*latitude2
	longitude1 = (Math.PI/180)*longitude1
	longitude2= (Math.PI/180)*longitude2
	#因此AB两点的球面距离为:{arccos[sinb*siny+cosb*cosy*cos(a-x)]}*R
	#地球半径
	global R = 6378.1;
	d =  math.acos(math.sin(latitude1)*math.sin(latitude2)+\
		 math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1))*R
	return d;
	}

实现了根据输入两点经纬度,计算这两点距离的函数,但是在实际操作过程中,出现了报错:

ValueError: math domain error

下面是测试数据,这部分是正确的数据

print cal_dis(39.762146, -104.98248,39.758066, -104.902431)
print cal_dis(39.77455175, -105.01426466666665,39.76241472, -104.90343176000002)
print "横向一个纬度的距离:",cal_dis(39, -104,40, -104)
print "纵向一个经度的距离:",cal_dis(39, -105,39, -104)
print cal_dis(39.772779500000006, -104,39.762146, -104)

下面是会报错的数据集:

print "error"
print cal_dis(-6.174444, 106.829444, -6.174444, 106.82944400000001)
print cal_dis(59.439339, 24.74682, 59.439339, 24.74682)
print cal_dis(59.439339, 24.74682, 59.439339, 24.74682)
print cal_dis(59.439339, 24.74682, 59.439339, 24.74682)
print cal_dis(37.647464, -77.624973, 37.647464, -77.624973)

经过搜索相关文章,最终发现是由于acos(x)中的x越界引起的。

语法

以下是acos()方法的语法:

?
1
acos(x)

注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math的静态对象来调用这个函数。
参数

  •     x — 这必须是在范围内的数字值-1到1,如果x大于1,则它会产生一个错误。

返回值

此方法返回的X反余弦,以弧度表示。

解决方案:

查看越界代码,使用repr将数字转化为字符串显示、查看

temp = math.sin(latitude1)*math.sin(latitude2)+\
		 math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1)
<pre name="code" class="python">temp=math.sin(latitude1)*math.sin(latitude2)+\
		 math.cos(latitude1)*math.cos(latitude2)*\
		 math.cos(longitude2-longitude1)
	print temp,repr(temp)


发现打印结果是:1.0
1.0000000000000002

也就是实际的acos()函数的自变量是1.0000000000000002, 已经超出1的范围,由于精度问题只显示了1.0

	if temp>1.0:		print format(temp,".19e")

可看出在科学计数法下的输出

>>1.0000000000000002220e+00

推导公式本身出问题的机率很小,但计算机中的浮点数舍入误差会放大、缩小数据,从而溢出。因此代码改为:

#coding: utf-8#封装函数import mathdef cal_dis(latitude1, longitude1,latitude2, longitude2):	latitude1 = (math.pi/180.0)*latitude1	latitude2 = (math.pi/180.0)*latitude2	longitude1 = (math.pi/180.0)*longitude1	longitude2= (math.pi/180.0)*longitude2	#因此AB两点的球面距离为:{arccos[sina*sinx+cosb*cosx*cos(b-y)]}*R  (a,b,x,y)	#地球半径	R = 6378.1	temp=math.sin(latitude1)*math.sin(latitude2)+\		 math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1)	if repr(temp)>1.0:		 temp = 1.0	d = math.acos(temp)*R	return d;	

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193577.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java sdk安装及配置[通俗易懂]

    Java sdk安装及配置[通俗易懂]1.安装JavaSDK开发环境。首先去官网下载JavaSDK,http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,下载完成之后,开始安装。点击下一步,安装完成。2.配置JavaSDK环境变量单击“计算机-属性-高级系统设置”,单击“环境变

  • 关系图谱在反欺诈场景中的应用及实践「建议收藏」

    关系图谱在反欺诈场景中的应用及实践「建议收藏」关系图谱概要随着近几年互联网金融的发展,玲琅满目的信贷产品早已被羊毛党盯上,层出不穷的营销活动更是让欺诈分子有了可乘之机,伪造资料、恶意注册大量虚假账号、团伙包装、刷单、抢红包、套返利等等,他们的欺诈技术手段也越来越高明(群控、云控),成本也越来越低。为了限制这些欺诈用户,信贷机构通过建立反欺诈团队和风控防范体系,使用专家规则和预测模型来拦截欺诈份子。但是道高一尺魔高一丈,再严密的规则也…

  • ideaIU-2021.12.13 激活码【中文破解版】

    (ideaIU-2021.12.13 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 使用treeNMS管理及监控Redis

    使用treeNMS管理及监控Redis

  • JavaSE综合项目演练

    JavaSE综合项目演练光阴似箭日月如梭,大家学习已经有了一段时间了,转眼间,从刚开始如何配置JDK已经到了现在快学完网络编程了。学了这么多,眼看就要进入下一个阶段了,数据库编程了,那么在进入下个阶段前,我们来完成一个综合性比较强的结业项目,告别JavaSE阶段,学完JavaSE,大家已经对编程这块相信已经有了一个很深的理解,但是仅仅是JavaSE还是不够的,我们还需要学习更多的,更全面知识才足以在接下来的生活中过五关斩…

  • laravel之跨域请求(一)「建议收藏」

    laravel之跨域请求(一)「建议收藏」laravel之跨域请求(一)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号