【问题标题】:DBCException: Invalid number of points in LineString (found 1 - must be 0 or >= 2)DBCException:LineString 中的点数无效(找到 1 - 必须为 0 或 >= 2)
【发布时间】:2021-02-22 14:30:07
【问题描述】:

我有一个 postgres 数据库,其中有一个名为 gps_points 的表。此表有一列indexlatitudelongitude

使用以下命令,我已经能够添加和填充点几何列point_geom

ALTER TABLE gps_points ADD COLUMN point_geom geometry(Point, 4326);
UPDATE gps_points SET point_geom = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326);

现在我想根据这些点创建线串。我希望我可以通过以下命令实现这一点:

ALTER TABLE gps_points ADD COLUMN line_geom geometry(Linestring,4326);
INSERT INTO gps_points (line_geom)
SELECT ST_MakeLine (gps.point_geom ORDER BY index) AS line_geom
    FROM gps_points AS gps
    GROUP BY gps.index;

但是,结果列中的所有行都显示以下错误:

DBCException: Invalid number of points in LineString (found 1 - must be 0 or >= 2)

有人建议我缺少什么吗?

【问题讨论】:

  • 会不会是少数gps.point_id只有一个坐标对?
  • 我已经附上了我的表格截图,希望能澄清我的问题
  • 永远不要将数据作为图像发布,我们几乎无法使用它。 Alwasys 以文本形式发布数据。在您的屏幕截图中,每个索引只有一个坐标对,因此您无法通过与index 分组来创建线串。或者你想用表的所有记录创建一行?
  • 你说得对,但我认为这可以澄清你的问题。确切地说,我想用表的所有记录创建一行
  • 在我详细说明答案之前,你能试试这个并告诉我它是否是你想要的吗? SELECT ST_MakeLine(point_geom ORDER BY index) FROM gps_points;

标签: sql postgresql postgis


【解决方案1】:

在您的屏幕截图中,我们可以看到每个 index 只有一条记录(顺便说一句,这不是推荐的列标签)并且错误消息说您需要多个点才能获得正确的LineString。话虽这么说,您必须寻找另一列 GROUP BY 您的积分,或者只需在整个表格中创建一行:

SELECT ST_MakeLine(point_geom ORDER BY index) FROM gps_points;

例子:

CREATE TEMPORARY TABLE gps_points (
  index SERIAL,
  latitude NUMERIC,
  longitude NUMERIC
);

插入三个不同的点

INSERT INTO gps_points VALUES 
  (1,52.37,4.92),(2,52.37,4.93),(3,52.375,4.92);

创建几何列并在您发布时填充它

ALTER TABLE gps_points ADD COLUMN point_geom geometry(Point, 4326);
UPDATE gps_points SET point_geom = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326);

根据以上三点创建 LineString

SELECT ST_MakeLine(point_geom ORDER BY index) FROM gps_points;

如果您需要创建一个表以从 GIS 访问它,只需运行 ..

CREATE TABLE my_long_linestring AS
SELECT ST_MakeLine(point_geom ORDER BY index) FROM gps_points;

.. 并在您的 GIS 中打开这个新表:

注意:PostGIS 将允许您使用单点创建 LineString(请参见下面的示例),但它可能会在您的系统中产生其他问题.. 特别是在查看器中。

SELECT ST_AsText(ST_MakeLine('SRID=4326;POINT(1 2)'::geometry));
    st_astext    
-----------------
 LINESTRING(1 2)

【讨论】:

  • 这是我一直在寻找的更简单的解决方案,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多