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

时间:2017-10-13 21:50:56

标签: javascript google-maps google-maps-api-3 google-maps-markers

我已经实现了Google地图javascript api,其中我存储了用户指定的位置列表,方法是将lat,lng,placeId存储到数据库中。因此,用户可以找到以km /英里为单位的半径范围内的地点。

我正在使用基于此Google地图教程https://developers.google.com/maps/solutions/store-locator/clothing-store-locator

的Haversine公式

我的问题是我想限制从限制在州(或城市或地区)内的sql查询返回的坐标,因为如果用户将点放在州边界附近,则Haversine公式可能会返回坐标来自其他国家,这不是我想要的。我一直在研究这个问题,似乎实现这一点的方法是将状态信息存储到数据库中,我是否正确?

或者通过Google地图javascript API实现这一目标的更好方法是什么?

由于

1 个答案:

答案 0 :(得分:2)

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

所以,如果您按照上面提到的教程进行操作,我就必须猜测您是否正在使用MySQL,并且您将点数存储为latlng的记录领域。足以在地图上显示它们,但不足以使用空间交叉点。

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

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

然后,如果你有一张美国国家的桌子,名为" us_states"并且此表格具有geom类型的geometry字段,您可以使用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);
}
相关问题