首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在我的函数中,计算一个新的纬度/经度坐标的错误在哪里?

在我的函数中,计算一个新的纬度/经度坐标的错误在哪里?
EN

Stack Overflow用户
提问于 2019-04-14 00:57:20
回答 2查看 124关注 0票数 0

我编写了一个函数,从方位和距离计算新的纬度/经度坐标。然而,它正在返回错误的结果,我不明白为什么。我在https://www.movable-type.co.uk/scripts/latlong.html上使用了公式,但是当我用页面上的计算器测试它时,它给出了错误的结果。例如,NewLatLong(0, 0, 500, "K", 45)的纬度为5.54656612024095E-02,经度为0。在将纬度转换为与页面上的计算器进行比较之后,纬度是正确的,但是为什么经度返回为零?NewLatLong的参数是原始纬度和经度,距离,距离单位(K =公里),顺时针方向,以度为单位。

MS Access不具备所需的所有三角函数。我提供了新的。这些已分别测试,并似乎功能正确。

我看不出我的代码有什么问题。有人能帮上忙吗。

代码语言:javascript
运行
AI代码解释
复制
Public Function NewLatLong(latD As Double, longD As Double, distance As Double, unit As String, bearingD As Double) As Double()
    Dim latlong(2) As Double
    Dim latR As Double, bearingR As Double
    latR = Radians(latD)
    bearingR = Radians(bearingD)
    Dim cosAngDistance As Double, sinAngDistance As Double
    cosAngDistance = Cos(distance / EarthRadius(unit))
    sinAngDistance = Sin(distance / EarthRadius(unit))
    latlong(0) = ArcSine(Sin(latR) * cosAngDistance + Cos(latR) * sinAngDistance * Cos(bearingR))
    latlong(1) = (Radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0))) + 540) Mod 360 - 180
    NewLatLong = latlong
    Debug.Print latlong(0) & " " & latlong(1)
End Function

Public Function EarthRadius(unit As String) As Double
    If (unit = "M") Then
        EarthRadius = 3963
    ElseIf (unit = "K") Then
        EarthRadius = 6371
    Else
        EarthRadius = 3443.753
    End If
End Function


Public Function Pi() As Double
    Pi = 4 * Atn(1)
End Function

Public Function ArcCosine(value As Double) As Double
    ArcCosine = Atn(-value / Sqr(-value * value + 1)) + 2 * Atn(1)
End Function

Public Function ArcSine(value As Double) As Double
    ArcSine = Atn(value / Sqr(-value * value + 1))
End Function

Public Function ArcTan2(y As Double, x As Double) As Double
    If x > 0 Then
        ArcTan2 = Atn(y / x)
    ElseIf x < 0 Then
        ArcTan2 = Sgn(y) * (Pi() - Atn(Abs(y / x)))
    ElseIf y = 0 Then
        ArcTan2 = 0
    Else
        ArcTan2 = Sgn(y) * Pi() / 2
    End If
End Function

Public Function Radians(degrees As Double) As Double
    Radians = degrees * Pi() / 180
End Function
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-14 06:47:51

好消息和坏消息。好消息是您的代码工作得几乎完美,坏消息是Mod操作符总是返回一个整数,而不管它的参数类型如何(为什么是Microsoft!?)为什么!?)。

不要使用latlong(1) = (Radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0))) + 540) Mod 360 - 180,而是使用下面的代码来查找经度

代码语言:javascript
运行
AI代码解释
复制
Dim tempLong As Double
tempLong = Radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0)))
' set longitude if calculated value less than 1
If tempLong < 1 Then
    latlong(1) = tempLong
' if greater than 1, add decimal part back to modulus result
Else
    Dim decLong As Double
    decLong = tempLong
    While decLong > 1
        decLong = decLong - 1
    Wend
    latlong(1) = ((tempLong + 540) Mod 360 - 180) + decLong
End If
票数 2
EN

Stack Overflow用户

发布于 2019-04-14 12:58:29

我添加了我自己的mod函数,它可以正确地工作在双倍的情况下。

代码语言:javascript
运行
AI代码解释
复制
Public Function ModDouble(dividend As Double, divisor As Double) As Double
    Dim x As Double
    x = Int(dividend / divisor)
    ModDouble = dividend - (x * divisor)
End Function

这使得原始代码运行良好,使用

代码语言:javascript
运行
AI代码解释
复制
latlong(1) = ModDouble(radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0))) + 540, 360) - 180

但是我要标记BankBuilder的答案是正确的,因为他基本上发现了错误,这是我永远也找不到的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55673582

复制
相关文章
\[vscode issue\] Golang Debug 无法命中断点
Kevinello
2023/10/18
6391
\[vscode issue\] Golang Debug 无法命中断点
MySQL的order by该如何避免“未命中索引“
  要学会如何使用,你先要搞清楚:1、怎么看SQL是否用上了索引;2、怎么写SQL能避开出错点。
陈哈哈
2022/05/31
2.6K0
MySQL的order by该如何避免“未命中索引“
GPU编程(四): 并行规约优化
如果之前没有用过gdb, 可以速学一下, 就几个指令. 想要用cuda-gdb对程序进行调试, 首先你要确保你的gpu没有在运行操作系统界面, 比方说, 我用的是ubuntu, 我就需 要用sudo service lightdm stop关闭图形界面, 进入tty1这种字符界面. 当然用ssh远程访问也是可以的. 接下来, 使用第二篇中矩阵加法的例子. 但是注意, 编译的使用需要改变一下, 加入-g -G参数, 其实和gdb是相似的.
sean_yang
2019/03/04
1.7K1
GPU编程(四): 并行规约优化
CUDA编程.内核调用
首先我说一下什么叫内核,这里的内核很狭义就是ANSI C关键字+CUDA扩展关键字编写的设备代码~
云深无际
2021/03/12
9460
CUDA编程.内核调用
Unity3D 判断点击命中物体对象和命中环境
一个大的空对象包含很多小的物体,在大的空对象上面添加一个脚本,这个脚本核心就是通过 Update 方法里面拿到鼠标点击,判断当前是不是点击这个对象
林德熙
2022/08/12
4180
linux内核断点调试入门
上篇文章 编译一个默认输出hello world的linux内核 中,我们已经知道如何编译一个可以自运行的linux内核,这篇文章我们来看下如何对内核进行断点调试。
KINGYT
2020/04/13
3.5K0
GIS算法—判断点在面内
牛老师讲GIS
2023/05/27
7790
GIS算法—判断点在面内
CUDA编程之线程模型
一个kernel结构如下:Kernel<<>>(param1, param2, …)
AI异构
2020/07/29
2.8K0
CUDA编程之线程模型
CUDA编程.配置内核参数+API函数
为了我们获得并行能力,需要做一些配置CIA可以,这个配置在内核启动中写。它们指定了Grid中块的数量,和每一个块中线程的数量。每个快上面有512或者1024个线程。
云深无际
2021/03/12
7490
CUDA编程.配置内核参数+API函数
CUDA 02 - 逻辑模型
CUDA逻辑模型是异构模型, 需要CPU和GPU协同工作. 在CUDA中, host和device是两个重要概念, host是指CPU及其内存, device是指GPU及其内存. 典型的CUDA程序的执行流程如下:
Reck Zhang
2021/08/11
5290
CUDA 02 - 逻辑模型
腾讯云CDN+日志服务统计URL未命中top10
文章参考自官方文档,但无奈官方文档写的demo未联合说明怎么改,顺便mark下来做记录
105号运维实习生
2020/11/13
1.5K2
腾讯云CDN+日志服务统计URL未命中top10
使用显卡程序加速(opencl、cuda)
CPU使用冯诺依曼结构,缓存大,处理单元少 GPU处理图像每个像素可以单独处理,缓存小,处理单元很多
sofu456
2020/12/08
1.4K0
AI部署篇 | CUDA学习笔记1:向量相加与GPU优化(附CUDA C代码)
GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,也可以把GPU看成是CPU的协处理器,因此当在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCIe总线连接在一起进行协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device),如下图所示。
集智书童公众号
2022/01/05
2.8K0
AI部署篇 | CUDA学习笔记1:向量相加与GPU优化(附CUDA C代码)
新手,想用Nisight调试CUDA代码,但断点无效怎么破?
新手,刚接触CUDA编程,搭好了环境,想用nsight来调试,在vs里面,在核函数里面设置了断点,用CUDA Debugging,但断点就是不生效,电脑左下角会弹出Night 连接成功,程序跑完后,Night会提示Disconnected 整个电脑环境: 显卡: GF GTX1050 CPU: i3-4170 3.70GH 硬盘: 2T 软件:VS2013 + CUDA9.1 + Nsight 5.4 GPU世界论坛 bbs.gpuworld.cn Hi, 楼主, 这个
GPUS Lady
2018/04/24
3.2K0
《GPU高性能编程 CUDA实战》(CUDA By Example)读书笔记
写在最前 这本书是2011年出版的,按照计算机的发展速度来说已经算是上古书籍了,不过由于其简单易懂,仍旧被推荐为入门神书。先上封面: 由于书比较老,而且由于学习的目的不同,这里只介绍了基础
用户1148523
2018/01/09
2.9K0
《GPU高性能编程 CUDA实战》(CUDA By Example)读书笔记
CUDA-GDB安装+环境配置
在GPU上开发大规模并行应用程序时,需要一个调试器,GDB调试器能够处理系统中每个GPU上同时运行的数千个线程。CUDA-GDB提供了无缝的调试体验,可以同时调试应用程序的CPU和GPU部分。
云深无际
2021/03/12
2.6K0
CUDA-GDB安装+环境配置
CUDA编程.打印
首先是注意,所有的cuda代码都是cu的后缀 #include<iostream> #include<cuda_runtime.h> __global__ void myfirstkernel(voi
云深无际
2021/03/12
7470
CUDA编程.打印
判断点在多边形内算法的C++实现
判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。如下图所示:
charlee44
2019/08/13
6.1K0
DAY36:阅读”执行空间&扩展修饰符
B. C Language Extensions B.1. Function Execution Space Specifiers Function execution space specifiers denote whether a function executes on the host or on the device and whether it is callable from the host or from the device. B.1.1. __device__ The __dev
GPUS Lady
2018/06/25
5460
Udacity并行计算课程笔记-The GPU Programming Model
一、传统的提高计算速度的方法 faster clocks (设置更快的时钟) more work over per clock cycle(每个时钟周期做更多的工作) more processors(更多处理器) 二、CPU & GPU CPU更加侧重执行时间,做到延时小 GPU则侧重吞吐量,能够执行大量的计算 更形象的理解就是假如我们载一群人去北京,CPU就像那种敞篷跑车一样速度贼快,但是一次只能坐两个人,而GPU就像是大巴车一样,虽然可能速度不如跑车,但是一次能载超多人。 总结起来相比于CPU,GPU有
marsggbo
2018/01/23
1.2K0
Udacity并行计算课程笔记-The GPU Programming Model

相似问题

CUDA __global__函数未调用

13

断点未命中

40

Firebug -断点未命中

1123

未命中javascript断点

59

MonoDevelop -断点未命中

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档