【问题标题】:Does postgres postgis ST_makeline have a max number of points it can create a line from?postgres postgis ST_makeline 是否有可以创建一条线的最大点数?
【发布时间】:2014-05-15 07:25:18
【问题描述】:

我的数据库有一个包含大量几何图形的表(PointZ,4326)点,它将从中划出一条线。我的表格和功能/查询如下。

只要从子查询返回的 track_points 的数量小于 97,它就可以工作。我知道这一点是因为当有 96 个或更少的点时,插入会将所有列的数据放入表中。对于有 97 个或更多点的所有记录,它插入的只是 track_id、start_time 和 end_time。

我想知道这是 postgis 的 ST_makeLine 函数中的错误还是我需要修改的 postgres 中的设置。

CREATE TABLE track_line_strings( 
    track_id bigint NOT NULL, 
    linestring geometry(LINESTRINGZ,4326), 
    start_time bigint NOT NULL, 
    end_time bigint NOT NULL, 
    CONSTRAINT track_line_strings_pk PRIMARY KEY (track_id) 
);



CREATE OR REPLACE FUNCTION create_track_line_string() RETURNS trigger 
LANGUAGE plpgsql 
AS $$ 
    DECLARE 
            TRACKITEMID bigint := new.track_item_id; 
            TRACKID bigint := track_id from track_item ti where ti.id = TRACKITEMID; 
            STARTTIME bigint := MIN(ti.item_time) from track_item ti where ti.track_id = TRACKID; 
            ENDTIME bigint := MAX(ti.item_time) from track_item ti where ti.track_id = TRACKID; 
    BEGIN 
    IF EXISTS (SELECT track_id from track_line_strings where track_id = TRACKID) 
    THEN 
            UPDATE track_line_strings 
            SET start_time = STARTTIME, end_time = ENDTIME, linestring = ( 
                    SELECT ST_Makeline(e.trackPosition) FROM 
                            ( 
                                    Select track_id, tp.track_position AS trackPosition 
                                    FROM track_point tp JOIN track_item ti ON tp.track_item_id = ti.id 
                                    where ti.track_id = TRACKID ORDER BY ti.item_time ASC   
                            ) E ) 
                    WHERE track_id = TRACKID; 
    ELSE 
            INSERT INTO track_line_strings(track_id, linestring, start_time, end_time) 
                    SELECT  TRACKID, ST_Makeline(e.trackPosition), STARTTIME, ENDTIME FROM 
                    ( 
                            Select track_id, tp.track_position AS trackPosition 
                            FROM track_point tp JOIN track_item ti ON tp.track_item_id = ti.id 
                            where ti.track_id = TRACKID ORDER BY ti.item_time ASC     
                    )E; 
    END IF; 
    RETURN new; 
    END; 
$$; 

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    database limits are pretty high,一个字段中相当于 1 GB 的几何数据。这取决于什么样的点几何,但它会在几千万个点几何的数量级上,可以用来构造一个LineString。

    如果这是一个限制,您将看到一条正确的错误消息,其中包含“超出大小”的内容。


    pgAdminIII 出现明显的空数据或缺失数据是一个常见问题,但与数据库限制无关:

    【讨论】:

    • 问题是在 pgAdminIII 中查看输出时,pgAdminIII 在显示字符表示超过未知阈值的数据时存在限制。
    【解决方案2】:

    似乎没有限制。我在 pgAdminIII 中查看结果,并且必须对每列的数据输出可以处理的字符数进行限制。我只是通过将结果复制粘贴到文本文件中来实现这一点,以查看它确实为超过 96 点的行返回了一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多