经纬度距离计算 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;	

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UCI数据集整理(附论文常用数据集)

    UCI数据集整理(附论文常用数据集)摘要:UCI数据集作为标准测试数据集经常出现在许多机器学习的论文中,为了更方便使用这些数据集有必要对其进行整理,这里整理了论文中经常出现的数据集,并详细介绍如何使用MATLAB将数据集文件整理成自己需要的格式以及如何使用数据集文件。要点如下UCI数据集介绍用程序整理数据集如何使用数据集文件点击跳转至UCI数据集下载页1.前言UCI数据集是一个常用的机器…

    2022年6月28日
    42
  • SSM-Mybatis(1)[通俗易懂]

    SSM-Mybatis(1)[通俗易懂]Mybatis什么是MybatisMyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。第一个Mybatis程序搭建环境数据库CREATE DATABASE mybatis;uesr mybatis

    2022年8月8日
    4
  • jsp基础入门教程(自学素描基本入门教程)

    JSP 教程JSP与PHP、ASP、ASP.NET等语言类似,运行在服务端的语言。JSP(全称JavaServerPages)是由SunMicrosystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了

    2022年4月16日
    33
  • c++常量指针和指针常量_指针指向二维数组

    c++常量指针和指针常量_指针指向二维数组**一:常量**常量指针,指针常量,常量指针常量a)常量定义:不可修改的值,例如250,’A’b)const关键字功能:将变量常量化,四种形式(1)const可以修饰普通变量,一旦修饰该变量,该变量就当做常量看待,不可再更改Constinta=250;//将变量a常量化A=200;//gcc编译器报错(2)常量指针:不能通过指针变量来修改指向的内存区域的数据,主要…

    2022年8月30日
    1
  • qi接收启动协议_基于QI协议的无线充电通信系统「建议收藏」

    qi接收启动协议_基于QI协议的无线充电通信系统「建议收藏」龙源期刊网http://doc.docsou.com基于QI协议的无线充电通信系统作者:胡江浩张中炜来源:《中国新通信》2016年第03期【摘要】无线充电技术的学名又叫做无线电能传输,其原理非常类似于变压器,都是通过发射电路产生一个交变电流通过初级线圈,从而在初级线圈上感应出一个交变电磁场,次级线圈通过接收该交变电磁场从而产生感应电流,通过电磁感应实现能源的传输。该文主要介绍了一种无线充电领域中…

    2022年6月16日
    29
  • linux修改文件内容如何保存退出

    linux修改文件内容如何保存退出1.进入文件vim文件名(vimtest.txt)2.编辑完成之后,按ESC键跳到命令模式(命令前面冒号是必要的):  :w保存文件但不退出vi  :wfile将修改另外保存到file中,不退出vi  :w!强制保存,不推出vi  :wq保存文件并退出vi  :wq!强制保存文件,并退出vi  :q不保存文件,退出vi  :q!不保存文件,强制退出vi  :e!放弃所有修改,从上次保存文件开始再编辑…

    2022年7月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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