【问题标题】:Get metric distance between two points via a PostgreSQL/PostGIS request通过 PostgreSQL/PostGIS 请求获取两点之间的公制距离
【发布时间】:2014-09-16 19:01:58
【问题描述】:

我对 postgreSQL/postGIS 的使用有疑问。

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

标记字段的类型是 POINT(我存储 lat/long)。 用户位置由 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_tranform 来转换公制坐标中的点。

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

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

任何帮助将不胜感激

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

【问题讨论】:

  • 基于this,ST_Distance — 对于几何类型返回投影单位中两个几何之间的二维笛卡尔最小距离(基于空间参考)

标签: postgresql postgis srid


【解决方案1】:

首先要注意PostGIS使用的坐标轴顺序,应该是long/lat。目前you are searching in Somalia。交换坐标,you would be searching in 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);

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多