首页 > 解决方案 > Postgis 和 QIGS 长度计算的区别?

问题描述

我刚开始特别学习 PostgreSQL 和 PostGIS,当我决定对我获得的基本数据进行一些尝试时,我尝试遵循宾夕法尼亚州立大学的空间数据库管理简介。在计算了一些 LINESTRING 数据的长度后,我想使用 QGIS 检查结果,这就是有趣的开始。

在这里您可以找到我遵循并稍作修改的 SQL 语句。

https://www.e-education.psu.edu/spatialdb/node/1960

在比较属性表中的结果时,我感到困惑,因为尽管指定了相同的 SRID (2163),但使用 ST_Length 与 QGIS 字段计算器的 $Length 函数的结果不同。

INSERT INTO lines (name, geom)
VALUES ('Holland Tunnel',ST_GeomFromText('LINESTRING(
-74.036486 40.730121,
-74.03125 40.72882,
-74.011123 40.725958)',4269)),
('Lincoln Tunnel',ST_GeomFromText('LINESTRING(
-74.019921 40.767119,
-74.002841 40.759773)',4269)),
('Brooklyn Bridge',ST_GeomFromText('LINESTRING(
-73.99945 40.708231,
-73.9937 40.703676)',4269));



UPDATE TABLE lines SET laenge = ST_Length(ST_Transform(geom, 2163));

结果是:

命令:

A. 荷兰隧道的 ST_Length;林肯隧道;布鲁克林大桥

B. 荷兰隧道的长度;林肯隧道;布鲁克林大桥

A. 2160,344849130080092; 1631,543481596899937; 694,591179476468028
B. 2195,119177785873489; 1656,890881978494235; 701,411239204245931

如果我犯了一个明显的错误,我真的很抱歉,但是 StackOverflow 中的建议并没有为我指明正确的方向,因为它们是关于基于路由的距离的主题,这不适用于这里吗?

最好的问候,并在此先感谢您!

标签: gisopen-sourcegeospatialpostgisqgis

解决方案


使用:

UPDATE lines SET laenge = ST_Length(geom::geography);

我可以重现您发布的 Qgis 结果,这意味着 Qgis 没有使用您指定的投影来计算线条的长度

您可以在 qgis 中阅读有关 $length 的更多信息:

此函数计算的长度同时考虑当前项目的椭球设置和距离单位设置。例如,如果为项目设置了椭球体,则计算的长度将为椭球体,如果未设置椭球体,则计算的长度将是平面的。

以及关于几何和地理之间的区别: postgis docs


推荐阅读