postgres postgis ST_makeline有没有可以创建一行的最大点数?

时间:2014-04-03 12:41:36

标签: postgresql postgis

我的数据库有一个包含大量几何图形的表(PointZ,4326)我在数据库方面进行了大量的处理,我注意到当我使用ST_MakeLine时,我似乎在数字上限上限它将成为一条线。我的表和功能/查询如下。

只要从子查询返回的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; 
$$; 

2 个答案:

答案 0 :(得分:2)

字段中的database limits are pretty high,1 GB数据值的几何数据。它取决于什么类型的点几何,但它将是数千万个可用于构造LineString的点几何的数量级。

您会看到一条正确的错误消息,其中包含"超出尺寸"如果是限制。


使用pgAdminIII显然为空或缺少数据是一个常见问题,但与数据库限制无关:

答案 1 :(得分:1)

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