有谁知道后 GIS 中st_line_substring的潜在问题



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

这是我的例子。

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

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.2032604251.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.65746307 51.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"的列中,称为"fibre_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公里。

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

作为参考,我正在使用的PostGIS1.5.8。如果这是一个错误,可以升级到较新版本,但并非微不足道,因此我宁愿仅在必要时才这样做。

有人有想法吗?

虽然Arunas的评论没有直接回答我的问题,但它确实让我进行了一些我认为可以解决问题的研究。我在这里发布它,部分是为了在我自己的脑海中弄清楚,部分是为了以防其他人想知道。

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

  1. 也许从我最初的帖子中看不出的是,我正在使用几何对象而不是UTM来存储经度/经度信息。我大部分时间都将其转换为地理,以便获得正确答案,但是如果我实际将其存储为地理对象会更正确。这将消除在我的代码中对许多强制转换的需求,并允许PostGIS在我做错事时告诉我。
  2. 虽然ST_Length适用于几何或地理,但ST_Line_Substring仅适用于几何。因此,当我要求它提供中间点时,我要求它提供平面几何的中途点。这将为我提供纬度坐标的正确答案,但对于经度,它将有一个误差项,(对于大多数投影)我离赤道越远。

我已经研究了较新版本的 PostGIS,它们似乎没有ST_Line_Substring或类似的东西可以给我 50% 的地理点,所以我将不得不以"困难"的方式做到这一点,使用 ST_Length 给我所有的段长度,然后将它们相加并做我的插值所需的数学运算。

抱歉,我无法添加评论,因此将提供它作为答案。

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

最新更新