有没有办法只使用Haversine公式过滤州/省/市/区内的坐标



我已经实现了谷歌地图javascript api,我通过将用户的lat、lng、placeId存储到数据库中来存储用户指定的位置列表。因此,用户可以找到以公里/英里为单位的半径范围内的地方。

我正在使用基于这个谷歌地图教程的Haversine公式https://developers.google.com/maps/solutions/store-locator/clothing-store-locator

我的问题是,我想限制sql查询返回的坐标也只能在一个州(或城市或地区)内,因为如果用户将点放在州边界附近,Haversine公式可能也会返回其他州的坐标,这不是我想要的。我对此已经研究了一段时间,似乎实现这一点的方法也是将状态信息存储到数据库中,我是对的吗?

还是通过Google地图javascript API实现这一点的更好方法?

感谢

与在数据库中存储用户位置相同,您还应该有一个包含管理细分的表。(例如,状态,您可以在ESRI OpenData中免费获取)。

所以,如果你遵循了你提到的教程,我猜你使用的是MySQL,你的点存储为带有latlng字段的记录。足以在地图上显示它们,但不足以使用空间交点。

商店的几何图形必须使用ST_GeomFromText()构建。例如

SELECT 
ST_GeomFromText(CONCAT('POINT(', lng, ' ', lat, ')' )) as markerposition
FROM markers;

然后,如果您有一个名为"US_States"的美国各州表,并且该表有一个类型为geometrygeom字段,则可以使用ST_Contains函数来获取给定州几何结构中包含的所有标记(在以下示例中,包含在加利福尼亚州):

SELECT * FROM markers
JOIN us_states ON ST_Contains(us_states.geom, ST_GeomFromText(CONCAT('POINT(', markers.lng, ' ', markers.lat, ')' )))
WHERE us_states.name='California';

现在,我认为这是正确的方式。但是,如果这对你想要实现的目标来说太牵强了,你也可以在前面做到这一点。如果有一个google.maps.Polygon表示一个状态的几何体,则可以使用google.maps.geometry.poly.containsLocation方法过滤要显示的标记,或者如果标记位于所述多边形之外则要隐藏的标记。类似的东西

if (!google.maps.geometry.poly.containsLocation(marker.getPosition(), statePolygon)) {
marker.setMap(null);
}

最新更新