0

我对使用 postgreSQL/postGIS 有疑问。

我想在距离用户一定距离的地图(存储在数据库中)上显示标记(为请求提供坐标)。

标记字段的类型是 POINT(我存储纬度/经度)。用户位置由 Google Map API 确定。

这是实际的请求:

SELECT * FROM geo_points WHERE ST_distance(ST_SetSRID(geo_points.coords::geometry,4326),ST_GeomFromEWKT('SRID=4326;POINT(45.0653944 4.859764599999996)')) > 65

我知道(在对互联网进行了一些研究之后)函数 ST_distance 为我提供了标记和用户位置之间的距离,并且我测试了以公里为单位的距离。

我想我必须使用函数 ST_transform 来转换公制坐标中的点。

所以我的问题是: - 法国的 SRID 是什么 - 我怎样才能根据用户的位置动态地为整个世界制作这个?

我也知道函数 ST_within 存在并且可以做到这一点。但我预计以后,我可能需要距离。

任何帮助将不胜感激

ps:其他帖子中可能有解决方案,但是我在研究过程中找到的所有答案都不能真正满足我的需求。

4

1 回答 1

2

首先要注意PostGIS使用的坐标轴顺序,应该是long/lat。目前您正在搜索索马里。切换到坐标,您将在 France 进行搜索

您可以使用geography type的测地线计算,或使用ST_Distance_Spheroid等测地线函数。对于 geography 类型,您可能希望使用ST_DWithin以获得更高的性能。

这里geo_points距离法国(不是索马里)的景点 65 m 或更短:

SELECT * FROM geo_points
WHERE ST_Distance_Spheroid(
    ST_Transform(geo_points.coords::geometry, 4326),
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326),
    'SPHEROID["WGS 84",6378137,298.257223563]') < 65.0;

但是,它会很慢,因为它需要找到到每个 geo_points 的距离,所以只有在你不关心性能并且少于几千点的情况下才这样做。

如果您更改并转换geo_points.coords以将 lon/lat (WGS84) 存储为geography类型:

SELECT * FROM geo_points
WHERE ST_DWithin(
    geo_points::geography,
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326)::geography,
    65.0);
于 2014-09-16T23:00:07.313 回答