【问题标题】:Calculate distance between two coordinates using postgres?使用postgres计算两个坐标之间的距离?
【发布时间】:2017-05-23 01:03:08
【问题描述】:

我有一份与 postgres 合作的工作机会,但我对此不太了解。那家伙告诉我要建立一个简单的数据库,它会自动计算从其他一些地方(酒吧、药店、博物馆等)的列表到我家的距离,以地理坐标给出的所有内容。

我已经安装了 postgres,也安装了 postgis 并创建了一个数据库。你能给我一些关于我应该如何完成这项任务的提示吗?有什么教程或资源可以让我更轻松地完成这项任务吗?我应该使用 postgis 吗?

谢谢。

【问题讨论】:

标签: postgresql coordinates postgis


【解决方案1】:

PostGIS 很容易做到这一点。 Boundless Geo 有一个出色的PostGIS tutorial。我还建议您熟悉 PostGIS 手册的第 3 章和第 4 章。

如果您要使用空间数据,我强烈建议您学习和理解投影坐标和非投影坐标之间的区别。投影表示坐标已从“圆形地球”获取并调整或投影到平面地图页面(坐标通常以英尺或米为单位,具体取决于所使用的投影属性)。这使得可以对距离、面积、方向、交叉点、包含等进行高效计算的正向笛卡尔计算。使用投影需要权衡 - 投影曲线时不能保留所有面积、距离、形状、方向或显示在平面地图上。不同的预测针对不同的权衡进行了优化。对投影数据的计算仅在地球表面的相对较小部分上是准确的。有许多地图投影可以满足不同的需求和地区。如果您要使用投影数据,则需要选择适合您的目的和位置的投影。如果您不了解预测,您的查询很容易在不知不觉中产生垃圾。

未投影的数据(即您所拥有的原始纬度/经度坐标)涉及更复杂的计算,因为它们是在代表地球的椭球体的曲面上完成的。有许多参考坐标系用于表示纬度/经度,但最常见的是“WGS84”(这是“GPS”坐标的表达方式)。

PostGIS 对象(以 OGC 定义的“简单特征”的形式)可以存储为“几何”类型(投影坐标)或“地理”类型(WGS84 中未投影的 Lon/Lat:注意顺序,一个常见的混淆来源!)。有点麻烦,Lon/Lat(再次订购!)也可以存储为“伪投影”几何类型(对于 WGS84 Lon/Lat,投影 SRID 通常为“4326”)。

您用于计算距离的方法取决于您选择存储点的方式(“几何”或“地理”)。

请参阅 PostGIS 文档中的 ST_Distance,了解使用几何和地理点测量距离的优秀示例。请注意,如果您希望计算投影地图距离,您需要选择适当的地图投影并使用ST_Transform 将您的点投影到适当的空间参考系统(当前在 SRID 4326-“GPS”坐标中)。只有几个点差异不会很明显,但是一旦您开始执行大量更复杂的空间查询,差异可能会很大。 PostGIS 具有比地理类型更多的几何类型功能,这可能会影响您的决定。另请参阅ST_DistanceSpheroid,了解计算与 Lon/Lat 坐标之间的距离的另一种可能性。

首先,我会将您的点存储为“地理”以简化您的实验。然后,您的距离将以米为单位计算为“大圆”,您不必担心最初的预测。

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2020-02-12
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多