在Java中计算距纬度/经度坐标一定距离的边界框
给定一个坐标(纬度,经度),我试图计算距该坐标给定距离(例如50公里)的方形边界框。因此,作为输入,我有纬度、经度和距离,作为输出,我想要两个坐标;一个是西南(左下)角,一个是东北(右上角)角。我在这里看到了一些尝试用 Python 解决这个问题的答案,但我正在特别寻找 Java 实现。
需要明确的是,我打算仅在地球上使用该算法,因此不需要适应可变半径。
它不必非常精确(+/-20% 即可),并且仅用于计算小距离(不超过 150 公里)的边界框。因此,我很乐意为高效算法牺牲一些准确性。非常感谢任何帮助。
编辑:我应该更清楚,我真正追求的是正方形,而不是圆形。据我了解,正方形中心与正方形周边各点之间的距离不像圆那样是恒定值。我想我的意思是一个正方形,如果你从中心到周边四个点中的任何一个画一条线,得到一条垂直于周边一侧的线,那么这 4 条线的长度相同。
Given a coordinate (lat, long), I am trying to calculate a square bounding box that is a given distance (e.g. 50km) away from the coordinate. So as input I have lat, long and distance and as output I would like two coordinates; one being the south-west (bottom-left) corner and one being the north-east (top-right) corner. I have seen a couple of answers on here that try to address this question in Python, but I am looking for a Java implementation in particular.
Just to be clear, I intend on using the algorithm on Earth only and so I don't need to accommodate a variable radius.
It doesn't have to be hugely accurate (+/-20% is fine) and it'll only be used to calculate bounding boxes over small distances (no more than 150km). So I'm happy to sacrifice some accuracy for an efficient algorithm. Any help is much appreciated.
Edit: I should have been clearer, I really am after a square, not a circle. I understand that the distance between the center of a square and various points along the square's perimeter is not a constant value like it is with a circle. I guess what I mean is a square where if you draw a line from the center to any one of the four points on the perimeter that results in a line perpendicular to a side of the perimeter, then those 4 lines have the same length.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我写了一篇关于查找边界坐标的文章:
http://JanMatuschek.de/LatitudeLongitudeBoundingCooperatives
该文章解释了公式和还提供了Java实现。 (它还说明了为什么钢铁侠的最小/最大经度公式不准确。)
I wrote an article about finding the bounding coordinates:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
The article explains the formulae and also provides a Java implementation. (It also shows why IronMan's formula for the min/max longitude is inaccurate.)
虽然我也推荐JTS。
Although I would also recommend JTS.
现在 env 包含了你的信封。它实际上不是一个“正方形”(无论这在球体表面意味着什么),但它应该是这样。
您应该注意,以度为单位的距离取决于中心点的纬度。在赤道,1度纬度约为111公里,但在纽约,只有约75公里。
真正酷的是,您可以将所有点放入
com.vividsolutions.jts.index.strtree.STRtree
中,然后使用它快速计算该信封内的点。Now env contains your envelope. It's not actually a "square" (whatever that means on the surface of a sphere), but it should do.
You should note that the distance in degrees will depend on the latitude of the center point. At the equator, 1 degree of latitude is about 111km, but in New York, it's only about 75km.
The really cool thing is that you can toss all your points into a
com.vividsolutions.jts.index.strtree.STRtree
and then use it to quickly calculate points inside that Envelope.之前的所有答案仅部分正确。特别是在澳大利亚这样的地区,他们总是包括杆子并计算出一个非常大的矩形,即使是 10 公里。
特别是 Jan Philip Matuschek 在 http://janmatuschek.de/LatitudeLongitudeBoundingCooperatives#UsingIndex 的算法中包含了一个非常澳大利亚几乎每个点的大矩形(-37, -90, -180, 180)。这对数据库中的大量用户造成影响,并且必须计算几乎一半国家的所有用户的距离。
我发现罗彻斯特理工学院的 Drupal API 地球算法在极地和其他地方效果更好,而且更容易实现。
https://www.rit。 edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
使用上述算法中的
earth_latitude_range
和earth_longitude_range
计算边界 这里的实现是Java
并使用google地图记录的距离计算公式来计算距离
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 列的标记表,公式为:
All of the previous answers are only partially correct. Specially in region like Australia, they always include pole and calculate a very large rectangle even for 10kms.
Specially the algorithm by Jan Philip Matuschek at http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex included a very large rectangle from (-37, -90, -180, 180) for almost every point in Australia. This hits a large users in database and distance have to be calculated for all of the users in almost half the country.
I found that the Drupal API Earth Algorithm by Rochester Institute of Technology works better around pole as well as elsewhere and is much easier to implement.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Use
earth_latitude_range
andearth_longitude_range
from the above algorithm for calculating bounding rectangleHere is the implementation is Java
And use the distance calculation formula documented by google maps to calculate distance
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
To search by kilometers instead of miles, replace 3959 with 6371.
For (Lat, Lng) = (37, -122) and a Markers table with columns lat and lng, the formula is:
根据钢铁侠的回应:
Based on IronMan response:
这是一个简单的解决方案,我用它来生成与 GeoNames citieJSON API 一起使用的边界框坐标 从 GPS 十进制坐标获取附近的大城市。
这是我的 GitHub 存储库中的 Java 方法: FusionTableModifyJava
我有一个十进制 GPS 位置,我需要找到该位置“附近”最大的城市/州。我需要一个相对准确的边界框来传递到 carsJSON GeoNames Web 服务,以获取该边界框中最大的城市。我传递了我感兴趣的位置和“半径”(以公里为单位),它返回了传递给城市所需的北、南、东、西十进制坐标。
(我发现这些资源对我的研究很有用:
计算之间的距离、方位等纬度/经度点。
经度 - 维基百科)
它不是非常准确但对于我使用它的用途来说足够准确:
Here is a simple solution that I used to generate bounding box coordinates that I use with GeoNames citieJSON API to get nearby big cities from a gps decimal coordinate.
This is a Java method from my GitHub repository: FusionTableModifyJava
I had a decimal GPS location and I needed to find the biggest city/state "near" that location. I needed a relatively accurate bounding box to pass to the citiesJSON GeoNames webservice to get back the biggest city in that bounding box. I pass the location and the "radius" I am interested in (in km) and it gives back the north, south, east, west decimal coordinates needed to pass to citiesJSON.
(I found these resources useful in doing my research:
Calculate distance, bearing and more between Latitude/Longitude points.
Longitude - Wikipedia)
It is not super accurate but accurate enough for what I was using it for: