我给出了一个由纬度和经度定义的位置 . 现在我想计算一个边界框,例如那个点10公里 .
边界框应定义为latmin,lngmin和latmax,lngmax .
我需要这些东西才能使用panoramio API .
有人知道如何获得积分的公式吗?
Edit: 伙计们我正在寻找一个公式/函数,它以lat&lng作为输入并返回一个边界框作为latmin&lngmin和latmax&latmin . Mysql,php,c#,javascript很好,但伪代码也应该没问题 .
Edit: 我不是在找一个能让我看到2分距离的解决方案
15 回答
我建议将地球表面局部近似为一个球体,其半径由给定纬度的WGS84椭球给出 . 我怀疑latMin和latMax的精确计算需要椭圆函数,并且不会产生明显的精度增加(WGS84本身就是近似值) .
我的实现如下(它是用Python编写的;我还没有测试过):
编辑:以下代码将(度,素数,秒)转换为度数的度数分数,反之亦然(未经测试):
我写了一篇关于找到边界坐标的文章:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
本文解释了这些公式,并提供了Java实现 . (这也说明了为什么费德里科的最小/最大经度公式不准确 . )
在这里,我已经将Federico A. Ramponi对C#的回答转换为任何感兴趣的人:
我编写了一个JavaScript函数,它返回一个方形边界框的四个坐标,给定一个距离和一对坐标:
你正在寻找一个椭球公式 .
我发现开始编码的最佳位置是基于CPAN的Geo :: Ellipsoid库 . 它为您提供了创建测试的基线,并将结果与结果进行比较 . 我在之前的雇主那里用它作为PHP类似库的基础 .
Geo::Ellipsoid
看一下
location
方法 . 叫它两次,你有你的bbox .你没有发布你正在使用的语言 . 可能已经有一个地理编码库可供您使用 .
哦,如果你现在还没弄明白,谷歌 Map 使用的是WGS84椭圆体 .
我改编了一个PHP脚本,我发现这样做 . 你可以用它来找到一个点周围的一个角落(例如,20公里外) . 我的具体示例适用于Google Maps API:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers
由于我需要非常粗略的估计,所以为了在弹性搜索查询中过滤掉一些不必要的文档,我采用了以下公式:
从给定位置需要N = kms . 对于你的情况N = 10
不准确但方便 .
这是一个使用javascript的简单实现,它基于纬度到kms的转换
1 degree latitude ~ 111.2 km
.我正在计算从给定纬度和经度宽度为10km的 Map 边界 .
@Jan Philip Matuschek的插图非常好的解释 . (请把他的答案投票,而不是这个;我加上这个,因为我花了一点时间来理解原来的答案)
寻找最近邻居的优化的边界框技术需要导出距离d处的点P的最小和最大纬度,经度对 . 所有落在这些点之外的点肯定距离点大于d . 这里需要注意的一点是Jan Philip Matuschek解释中突出显示的交叉纬度的计算 . 交叉纬度不在点P的纬度处,而是略微偏离它 . 这是确定距离d的点P的正确最小和最大边界经度时经常遗漏但重要的部分 . 这在验证中也是有用的 .
P的(纬度,经度)与(纬度,经度)之间的半径距离等于距离d .
Python gist here https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
我正在研究边界框问题,作为查找静态LAT,LONG点的SrcRad半径内的所有点的副问题 . 已经有很多计算使用
计算经度界限,但我发现这并没有给出所需的所有答案 . 因为你真正想做的是
我知道,我知道答案应该是一样的,但我发现事实并非如此 . 它似乎通过不确定我正在做(SRCrad / RadEarth)首先然后除去Cos部分我留下了一些位置点 .
获得所有边界框点后,如果您有一个计算给定纬度的点到点距离的函数,那么很容易只获得距离固定点一定距离半径的那些点 . 这就是我做的 . 我知道它需要一些额外的步骤,但它帮助了我
这很简单,只需访问panoramio网站,然后从panoramio网站打开世界 Map . 然后前往所需的纬度和经度的指定位置 .
然后,您在地址栏中找到了纬度和经度,例如在此地址中 .
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32.739485 =>纬度ln = 70.491211 =>经度
这个Panoramio JavaScript API小部件在纬度/经度对周围创建一个边界框,然后在这些边界内返回所有照片 .
另一种类型的Panoramio JavaScript API小部件,您还可以使用example and code is here更改背景颜色 .
它没有在作曲情绪中表现出来 . 它在出版后表现出来 .
如果有人感兴趣,我在这里转换了Federico A. Ramponi对PHP的回答:
感谢@Fedrico A.为Phyton实现,我已将其移植到Objective C类别类中 . 这是:
我测试了它,似乎工作得很好 . Struct BoundsLocation应该被一个类替换,我只是在这里分享它 .
All of the above answer are only partially correct . 特别是在像澳大利亚这样的地区,他们总是包括极点并计算一个非常大的矩形,甚至10kms .
特别是Jan Philip Matuschek在http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex的算法包括一个非常大的矩形(-37,-90,-180,180),几乎在澳大利亚的每个点 . 这会影响数据库中的大量用户,并且必须为几乎一半国家的所有用户计算距离 .
我发现 Drupal API Earth Algorithm by Rochester Institute of Technology 在极点和其他地方都能更好地工作,并且更容易实现 .
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
使用上述算法中的
earth_latitude_range
和earth_longitude_range
来计算边界矩形并使用 distance calculation formula documented by google maps 来计算距离
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
要按公里而不是里程搜索,请将3959替换为6371.对于(Lat,Lng)=(37,-122)和带有列lat和lng的Markers表,公式为:
在https://stackoverflow.com/a/45950426/5076414阅读我的详细答案
以下是Federico Ramponi在Go中的回答 . 注意:没有错误检查:(