有没有办法只使用 Haversine 公式过滤 state/province/city/district 内的坐标?
Is there a way to filter the coordinates within a state/province/city/district only using the Haversine formula?
我已经实现了 Google 地图 javascript api,我通过将用户的纬度、经度、地点 ID 存储到数据库中来存储用户指定的位置列表。因此,用户可以找到 km/mile 中某个地点半径范围内的地点。
我正在使用基于此 Google 地图教程的 Haversine 公式 https://developers.google.com/maps/solutions/store-locator/clothing-store-locator
我的问题是我想限制来自 sql 查询的坐标 return 也限制在州(或城市或地区)内,因为如果用户将点放在附近州边界,Haversine 公式也可能 return 来自其他州的坐标,这不是我想要的。我已经对此进行了一段时间的研究,似乎实现这一目标的方法也是将状态信息存储到数据库中,对吗?
或者通过 Google map javascript API 实现此目的的任何更好方法?
谢谢
与将用户位置存储在数据库中一样,您也应该有一个 table 与您的行政分区。 (例如,状态,您可以在 ESRI OpenData 处免费获得)。
所以,如果您按照您提到的教程进行操作,我猜您正在使用 MySQL,并且您将积分存储为带有 lat
和 [=14 的记录=] 字段。足以在地图上显示它们,但不足以使用空间交叉点。
您的商店的几何形状必须使用 ST_GeomFromText() 构建。例如
SELECT
ST_GeomFromText(CONCAT('POINT(', lng, ' ', lat, ')' )) as markerposition
FROM markers;
然后,如果你有一个 table 美国的州,名为 "us_states" 并且这个 table 有一个 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);
}
我已经实现了 Google 地图 javascript api,我通过将用户的纬度、经度、地点 ID 存储到数据库中来存储用户指定的位置列表。因此,用户可以找到 km/mile 中某个地点半径范围内的地点。
我正在使用基于此 Google 地图教程的 Haversine 公式 https://developers.google.com/maps/solutions/store-locator/clothing-store-locator
我的问题是我想限制来自 sql 查询的坐标 return 也限制在州(或城市或地区)内,因为如果用户将点放在附近州边界,Haversine 公式也可能 return 来自其他州的坐标,这不是我想要的。我已经对此进行了一段时间的研究,似乎实现这一目标的方法也是将状态信息存储到数据库中,对吗?
或者通过 Google map javascript API 实现此目的的任何更好方法?
谢谢
与将用户位置存储在数据库中一样,您也应该有一个 table 与您的行政分区。 (例如,状态,您可以在 ESRI OpenData 处免费获得)。
所以,如果您按照您提到的教程进行操作,我猜您正在使用 MySQL,并且您将积分存储为带有 lat
和 [=14 的记录=] 字段。足以在地图上显示它们,但不足以使用空间交叉点。
您的商店的几何形状必须使用 ST_GeomFromText() 构建。例如
SELECT
ST_GeomFromText(CONCAT('POINT(', lng, ' ', lat, ')' )) as markerposition
FROM markers;
然后,如果你有一个 table 美国的州,名为 "us_states" 并且这个 table 有一个 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);
}