【问题标题】:Does anyone know of potential problems with st_line_substring in postGIS?有人知道 postGIS 中 st_line_substring 的潜在问题吗?
【发布时间】:2017-03-17 15:55:54
【问题描述】:

具体来说,我得到了一个我不明白的结果。我的理解可能完全是错误的,但我不这么认为。所以我希望有人会说“是的,这是一个已知问题”或“不,它工作正常,这就是你的理解错误的原因”。

这是我的例子。

首先,我有以下纬度/经度几何形状。

LINESTRING(-1.32007599 51.06707497,-1.31192207 51.09430508,-1.30926132 51.10206677,-1.30376816 51.11133597,-1.29261017 51.12981493,-1.27510071 51.15906713,-1.27057314 51.16440941,-1.26606703 51.16897072,-1.26235485 51.17439257,-1.26089573 51.17875111,-1.26044512 51.1833917,- 1.25793457 51.19727033,-1.25669003 51.20141159,-1.25347137 51.20630532,-1.24845028 51.21110444,-1.23325825 51.22457158,-1.2274003 51.22821321,-1.22038364 51.23103494,-1.20326042 51.23596583,-1.1776185 51.24346193,-1.16356373 51.24968088,-1.13167763 51.26363353,-1.12247229 51.2659966,-1.11629248 51.26682901 ,-1.10906124 51.26728549,-1.09052181 51.26823871,-1.08522177 51.26885628,-1.07013702 51.27070895,-1.03683472 51.27350122,-1.00917578 51.27572955,-0.98243952 51.2779175,-0.9509182 51.28095094,-0.9267354 51.28305811,-0.90499878 51.28511151,-0.86051702 51.2883055,-0.83661318 51.29023789,- 0.7534647 51.29708113,-0.74908733 51.29795323,-0.7400322 51.2988924,-0.71535587 51.30125366,-0.68475723 51.29863749,-0.6574630 1.30220618,-0.63246489 51.30380261,-0.60542822 51.30645873,-0.58150291 51.3103219,-0.57603121 51.31150225,-0.57062387 51.31317883,-0.54195642 51.32475227,-0.4855442 51.34771616,-0.4553318 51.36283147)

这是在我的表中名为“geom”的列中,名为“fiber_lines”。当我运行以下查询时,

select st_length(geography(geom), false) as full_length,
  st_length(geography(st_line_substring(geom, 0, 1)), false) as full_length_2,
  st_length(geography(st_line_substring(geom, 0, 0.5)), false) as first_half,
  st_length(geography(st_line_substring(geom, 0.5, 1)), false) as second_half
from fibre_lines
where id = 10;

我得到以下结果...

76399.4939375278 76399.4939375278 41008.9667229201 35390.5272197668

前两个对我来说很有意义,它们只是假设地球是球形的我的线的长度。第一个只是使用明显的函数,而第二个是使用 st_line_substring 来获取整行的长度。这两个值一致。

但最后两个让我感到困惑。我要的是前半部分的长度,然后我要的是后半部分的长度。我的期望是这些将相等或几乎相等。相反,前半部分比后半部分长约 6 公里。

如果您在地图上绘制几何图形,您会看到线的前三分之一是相当北/南方向的,其余三分之二更偏东/西。在询问球形地球上的长度时,我不会想到这会有所不同,但我很高兴被告知我错了(只要还解释了我错的原因)。

作为参考,我使用的 PostGIS 是 1.5.8。 如果这是一个错误,升级到新版本是可能的,但不是微不足道的,所以我宁愿只这样做如果有必要。

有人有想法吗?

【问题讨论】:

  • ST_AsText(ST_Line_SubString(geom, 0, 0.5)) 和 ST_AsText(ST_Line_SubString(geom, .5, 1)) 是否有匹配的终点和起点?
  • 这个问题似乎暗示你可能不想使用st_length:gis.stackexchange.com/questions/63762/…

标签: postgis


【解决方案1】:

虽然 Arunas 的 cmets 没有直接回答我的问题,但它确实引导我进行了一些我认为可以确定问题的研究。我在这里发布它的一部分是为了让我自己明白,部分是为了以防其他人想知道。

似乎关键是 PostGIS 区分“几何”和“地理”。几何是 2D 平面几何,通常在 UTM 中并与地球在平面上的投影一起使用(该投影是可配置的)。另一方面,地理旨在专门存储纬度/经度信息,并用于在球体或椭球体上工作。所以我遇到的基本问题是双重的:

  1. 从我的原始帖子中可能不明显的是,我使用几何对象来存储纬度/经度信息而不是 UTM。我大部分时间都将其转换为地理,以便获得正确的答案,但如果我将其实际存储为地理对象会更正确。这样就无需在我的代码中进行大量转换,并允许 PostGIS 在我做错了什么时告诉我。
  2. 虽然 ST_Length 可用于几何或地理,但 ST_Line_Substring 仅适用于几何。因此,当我问它的中点时,我问的是平面几何的中点。这将为我提供纬度坐标的正确答案,但对于经度,它会有一个误差项,我离赤道越远(对于大多数预测),它就会增加。

我已经研究了 PostGIS 的较新版本,但它们似乎没有 ST_Line_Substring 或任何类似的东西可以让我获得 50% 的地理信息,所以我必须以“硬”的方式来做使用 ST_Length 给我所有的段长度,然后将它们相加并进行插值所需的数学运算。

【讨论】:

    【解决方案2】:

    抱歉,我无法添加 cmets,因此将其作为答案提供。

    我遇到了同样的问题,我通过将我的 lat-lon 几何转换为 utm 几何转换为 st_line_substring 函数调用解决了这个问题。 I 作为获得适当长度的子几何。当然,之后我必须将它们转换回 lat-lon。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2022-11-10
      • 2011-03-31
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多