我正在使用 Grails 下的 Google Maps 进行混搭,用户可以通过在地图上选择一个点和半径来创建地理围栏。这会存储在我的数据库中,并且应用程序会不断地从 GPS 设备接收一组坐标。
我想将接收到的坐标与圆圈中存储的区域进行比较。如果该点在圆圈内(或外),程序将触发一个动作。但是,我想知道如何确定坐标是否位于圆的内部/外部。有一个 Javascript 库允许执行此操作,但我需要在服务器上执行此操作。
是否有用于此的 Java(甚至 Groovy)库?你将如何实施它?
我正在使用 Grails 下的 Google Maps 进行混搭,用户可以通过在地图上选择一个点和半径来创建地理围栏。这会存储在我的数据库中,并且应用程序会不断地从 GPS 设备接收一组坐标。
我想将接收到的坐标与圆圈中存储的区域进行比较。如果该点在圆圈内(或外),程序将触发一个动作。但是,我想知道如何确定坐标是否位于圆的内部/外部。有一个 Javascript 库允许执行此操作,但我需要在服务器上执行此操作。
是否有用于此的 Java(甚至 Groovy)库?你将如何实施它?
如果从点到圆心的距离<=圆的半径,那么它在圆内。
如果该区域由多个圆圈组成,而不是与所有圆圈相比......它不会花费那么长时间。
java.awt.geom.Point2D.Double 非常适合这个。
好吧,如果它不需要“完美”,你就不必担心绘制圆圈或类似的东西。您可以只取两个位置(您要测试的位置和圆心)并使用 Pythagorus 来查找距离。如果该距离小于圆的半径,则它在内部。
然而,有一个需要考虑的警告:这不完美的原因是,对于你的观点,你可能会得到一个纬度和经度......而地球是一个球体。所以在地球两极附近,这会分崩离析。但这对于您正在做的事情可能已经足够了。
维克多和贝斯卡有正确的答案。也就是说,如果点到中心的距离小于半径,那么它在圆中。
对于两点之间的大圆距离,您可以使用GeoTools ' GeodeticCalculator
。特别是你设置点和半径使用setStartingGeographicPoint
,setDestinationGeographicPoint
然后调用getOrthodromicDistance
将返回距离。
可悲的是,这里的大多数响应对您来说并不方便,因为 GPS 坐标以度为单位。您将需要一些东西将经纬度的两个点转换为大圆距离,这是简单的勾股定理所不能满足的。
如果您使用的是 Google 地图 API,您可能可以使用GLatLng完成您需要的所有操作。正如其他海报所指出的,您可以确定两点之间的距离小于指定圆的半径。特别是 GLatLng.distance(other:GLatLng) 返回 GPS 位置之间的米距离。
要实际显示圆圈需要更多技巧。您将需要创建一个 GPolygon 来绘制圆的圆周。您可以找到许多可以为您执行此操作的免费 JavaScript 函数。
由于您使用的是谷歌地图并且对于地理距离,球面几何而不是欧几里得几何。但是,如果它是相对较小的距离,例如停车场等,那么您可以使用欧几里德距离公式(http://en.wikipedia.org/wiki/Distance)来确定该点是在圆圈内还是在圆圈外。
我假设您知道圆心 C(xc, yc) 的坐标及其半径 R。然后对于给定点 P(x1, y1) 找到欧几里德距离 D 为
平方根((x1-xc)^2 +(y1-yc)^2))。如果 D > R,则该点位于圆外。如果 D < R,则该点位于圆内。如果 D = R,则该点位于圆的圆周上。
如果您在更远的距离上进行测量,那么您应该寻找测地线(请查看此http://en.wikipedia.org/wiki/Great-circle_distance)。
我希望它有所帮助。
干杯
您想找到向量,即所选坐标与圆心之间的距离,然后通过对向量的分量求平方并将它们相加来计算所选坐标与圆心之间的平方距离;如果该标量(平方距离)小于半径的平方,则该点在圆内。
这种方法避免了取平方根,并且与正常距离比较一样准确。
一种可能性是计算距中心点的距离并将其与半径进行比较。
根据您的应用程序,您可能必须考虑到世界是一个球体而不是二维的。要计算地球上的距离,您可以使用此公式。