PostGis距离计算

2023-11-22

我现在正在做一个室内地图导航应用程序,我想做的是建立建筑物中地图点的数据库。

我使用的所有坐标均取自 Google 地图(这意味着 EPSG 为 3857)。我现在需要做的是找到以米为单位的距离并使用以米为单位的 D_Within

当我尝试提取两点之间的距离时:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857),
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857))
FROM i3_building.floordata;

对于前 2 行:

Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away)
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away)

给出的结果是:

2.59422435413724e-005
4.11096095831604e-005

尽管它们以拉德为单位,但第二个结果仅是第一个结果的两倍。所以这让我很困惑。 然后我尝试将其输出为米:

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'),
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')'))
FROM i3_building.floordata;

相同行给出的结果是:

2.872546829
4.572207435

这也不是我所期望的。 我对 PostGis 和 SRID 不太熟悉,所以这个问题可能看起来很简单,但请帮助我,我被困了没有@@


您的坐标参考系 (CRS) 是 4326,纬度/经度。这是与 Google 地图混淆的常见原因:3857 是 Google 地图用于其图块的 CRS,并且是基于球形地球仪的投影米。添加到 Google 地图的矢量源(KML 数据、GPS 转储等)往往采用纬度/经度 4326 格式,这是以度为单位的测量值,并可即时转换。

如果您想要两个纬度/经度点之间的距离(以米为单位),请使用ST_距离_球体。例如,对于您的第一组点,

SELECT ST_Distance_Sphere(ST_MakePoint(103.776047, 1.292149),ST_MakePoint(103.77607, 1.292212));

得出 7.457 米。根据相同的查询,您的第二组点彼此相距 62.74 米。

注意还有ST_距离_球体它采用第三个参数,测量球体,即地球形状的近似值。这可能会更准确,但在小距离上可能并不重要。

ST_Distance 给出投影坐标中的距离,这可能就是为什么插入纬度/经度值时会得到奇怪的结果。

EDIT:正如评论中指出的,从 Postgis 2.2 开始,该函数被重命名ST_距离球体

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostGis距离计算 的相关文章

随机推荐

  • opencv - cvCvtColor 中断言失败(dst.data == dst0.data)

    以下代码将发布错误消息 object is a color image with type cv Mat IplImage temp object IplImage object IplImage ipl object cvCreateIm
  • 将 IQueryable 转换为 IQueryable

    我们正在尝试投射一个实例IQueryable
  • 使 ASP.NET FormsAuthentication 服务器端失效

    我正在尝试 FormsAuthentication 使用 ASP NET MVC2 它运行得相当好 但是 我不知道如何处理的一种情况是验证服务器上的用户身份 以确保它仍然有效server s看法 eg 用户登录 获取 cookie 票据 带
  • Android 中打电话后调用 AUDIOFOCUS_LOSS

    我试图在电话响起时暂停媒体播放器 我使用来自 android 网站的示例代码 就像这样 public void onAudioFocusChange int focusChange switch focusChange case Audio
  • 如何为 C# 配置 Eclipse [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在使用 Eclipse Juno 和 windows 8 我想为 juno 配置 C 因为 eclipse 比其他框架更容易 并且它有 c c java 等 但没有 C 所以有人
  • 从 C# 代码与 Quickbook 集成的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 根据我的研究 基本上有 3 个选择 1 使用COM2 使用 Web 服务和 Web 连接器3 使用第三方组件 而且似乎有很多 这些选项中的每一个都给我带来了一个问题 1 我被告知不能使用
  • celery get 和 join 之间的区别

    之间有什么区别 r group some task s i for i in range 10 apply async result r join And r group some task s i for i in range 10 re
  • 如何在Java中优雅地处理SIGTERM信号?

    假设我们有一个用 java 编写的简单守护进程 public class Hellow param args the command line arguments public static void main String args wh
  • 部分声明,不得指定不同的基类

    我知道互联网上有这方面的信息 并且我已经搜索过 但我仍然收到错误 有人能指出我做错了什么吗 基类 using System using System Collections Generic using System Linq using S
  • Python 入口点“console_scripts”未找到

    我无法在 python 包中导入入口点控制台脚本 寻求帮助调试我当前的问题 因为我已经阅读了有关该问题的所有相关帖子 这是我的目录结构 ContentAnalysis init py command line py document py
  • AttributeError:“tuple”对象没有属性“append”[重复]

    这个问题在这里已经有答案了 谁能帮我处理这段代码吗 Jobs openFile open Jobs txt x 1 while x 0 Stuff openFile readline x if Stuff Jobs append Stuff
  • 跨浏览器自定义光标样式

    我用img标签显示世界地图 我将图像映射与它关联起来以超链接某些区域 我覆盖了一个带边框的框 div 指示可以单击和缩放某个区域 现在 为了向用户展示它是这样做的 我希望光标更改为放大镜形状 我浏览了一下网络 发现了一些可以在 firefo
  • 我怎么知道 dll 不是调试版本

    我如何确定我的生产服务器使用发布构建 dll 有没有办法在dll中找到该信息 重复 如何判断 net应用程序是在DEBUG还是RELEASE模式下编译的 如何检查 DLL 是否经过调试编译 如果它是c DLL 那么您可以使用ildasm P
  • IE9 JavaScript 数组初始化错误

    显然 IE9 中的 JS 实现在处理数组文字方面包含 IMO 严重 错误 在 IE9 中某些情况下这段代码 var a 1 2 3 4 将创建长度为 5 的数组 最后一个元素等于undefined 以下是我的 KiTE 引擎测试页面的两个版
  • 以编程方式将按钮添加到布局

    我在向用 XML 创建的布局添加按钮时遇到问题 这就是我想要实现的目标 some class else startActivity new Intent StatisticsScreen this ScreenTemperature cla
  • 如何使用 FB.UI 自动发布?

    我有stream publish权限 但它仍然弹出一个对话框 并且似乎没有任何方法可以传递autopublish bool 就像在图形API之前一样 编辑 还尝试了offline access和stream publish 关于如何让它发挥
  • 如何使用实体框架包含排序的导航属性[重复]

    这个问题在这里已经有答案了 我有一个实体A与集合B里面 我用一个加载它们 entity A Include a gt a B 现在我想让 B 进入 A 按自定义 OrderBy 排序 我试过 entity A Include a gt a
  • Eclipse EGIT - 所有已提交、拉取、合并、标记为合并,仍在推送中我被“拒绝 - 非快进”,我错过了什么?

    我开始尝试使用 Git 我确信我错过了一些东西 因为我无法进行简单的合并和推送 这是我所做的 我可能以错误的顺序 或者任何顺序错误 如果是 请纠正 pull 同步工作区 关于冲突 进行了手动合并 然后 标记为已合并 有必要吗 其余 允许自动
  • Java中Friend概念的实现[重复]

    这个问题在这里已经有答案了 如何在 Java 如 C 中实现友元概念 Java没有C 中的friend关键字 然而 有一种方法可以模拟这一点 一种实际上可以提供更精确控制的方法 假设您有类 A 和 B B 需要访问 A 中的某些私有方法或字
  • PostGis距离计算

    我现在正在做一个室内地图导航应用程序 我想做的是建立建筑物中地图点的数据库 我使用的所有坐标均取自 Google 地图 这意味着 EPSG 为 3857 我现在需要做的是找到以米为单位的距离并使用以米为单位的 D Within 当我尝试提取