【问题标题】:set the time property as the m-dimension of postgis geometry or as a separate attribute将 time 属性设置为 postgis 几何的 m 维或单独的属性
【发布时间】:2021-08-20 12:35:46
【问题描述】:

基本版本信息第一:

psql (PostgreSQL) 12.7 (Ubuntu 12.7-1.pgdg18.04+1)
postgis          | 3.1.1

我使用空间数据库的目的是快速查询specified time scopespace boundary内的GPS轨迹。目前我的数据基本信息如下:

-- geometry table column (there are 50,000 rows in table mpart5w-wkt)
test=# \d "mpart5w-wkt"
                       Table "public.mpart5w-wkt"
  Column   |            Type            | Collation | Nullable | Default
-----------+----------------------------+-----------+----------+---------
 driver_id | character varying          |           |          |
 order_id  | character varying          |           |          |
 geom      | geometry(LineStringM,4326) |           |          |
Indexes:
    "mpart5w-wkt_driver_id_idx" btree (driver_id)
    "mpart5w-wkt_geom_idx" gist (geom gist_geometry_ops_nd)


-- meta info
test=# select * from geometry_columns where f_table_name='mpart5w-wkt';

 f_table_catalog | f_table_schema | f_table_name | f_geometry_column | coord_dimension | srid |    type
-----------------+----------------+--------------+-------------------+-----------------+------+-------------
 test            | public         | mpart5w-wkt  | geom              |               3 | 4326 | LINESTRINGM
(1 row)


-- sample data: LINESTRING M (lon lat timestamp)
test=# select st_astext(geom) from "mpart5w-wkt" limit 1;

 LINESTRING M (104.04538 30.70745 1538402919,104.04538 30.70744 1538402928,104.04537 30.70745 1538402938,104.04536 30.70743 1538402948,104.04537 30.7074 1538402958, ...)

强调一下,geom 是 (LineStringM, 4326) 的几何类型。 GIS 索引已建立在 geom 列上。

第一个问题是M维是否支持多索引?

我查了multi-index的官方手册,它表明我们可以使用4D运算符类得到一个4D维的BRIN索引:

CREATE INDEX [indexname] ON [tablename]
    USING BRIN ([geome_col] brin_geometry_inclusion_ops_4d);

同时,我们可以使用以下语法获取几何类型的 n 维 gist 索引:

CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);

所以,我想只要提供 ZM 尺寸,构建 4D gist 索引是有帮助的。

functions 的大部分描述中,“此功能支持 3d,不会删除 z-index。”提到没有提到m-index,而我对m-index没有更多的了解。

毕竟,没有确凿的证据表明M维是否支持多索引以及如何在M维上使用多索引。

也许我应该这样创建表,这样我就不需要再处理M维度了?

create table "part5w-wkt"(
    driver_id varchar,
    order_id varchar,
    geom geometry(Linestring, 4326), 
    min_time timestamp,
    max_time timestamp
);

-- example (both start_time and end_time are parameters)
select * from "mpart5w-wkt" 
where st_intersects(
    geom, 
    ST_MakeEnvelope(104.067, 30.657, 104.083, 30.671, 4326)
) and (
    (min_time < start_time and start_time < max_time) 
     or
    (min_time < end_time and end_time < max_time)
)

第二个问题是如何使用带边界框的2D-index?

毕竟,没有证据表明使用带有 gist 索引的 m 维比使用带有关于时间的单独属性的 2D 几何更方便。所以,我决定先对 2D-index 做一个测试。

-- test 1
explain analyze
select count(order_id) from "mpart5w-wkt" 
where st_intersects(
    st_force2d(geom), 
    ST_MakeEnvelope(104.067, 30.657, 104.083, 30.671, 4326)
);

-- test 2
explain analyze
select count(order_id) from "mpart5w-wkt" 
where st_intersects(
    st_force2d(geom), 
    st_geometryfromtext(
        'polygon((104.067 30.671, 104.083 30.671, 104.083 30.657, 104.067 30.657, 104.067 30.671))', 
        4326
    )
);

-- test 3
explain analyze
select count(order_id) from "mpart5w-wkt" 
where st_intersects(
    st_force2d(geom), 
    'SRID=4326;polygon((104.067 30.671, 104.083 30.671, 104.083 30.657, 104.067 30.657, 104.067 30.671))'::geometry
);

-- almost the same result
 Finalize Aggregate  (cost=547292.05..547292.06 rows=1 width=8) (actual time=817.698..824.482 rows=1 loops=1)
   ->  Gather  (cost=547291.84..547292.05 rows=2 width=8) (actual time=817.380..824.451 rows=3 loops=1)
         Workers Planned: 2
         Workers Launched: 2
         ->  Partial Aggregate  (cost=546291.84..546291.85 rows=1 width=8) (actual time=804.706..804.707 rows=1 loops=3)
               ->  Parallel Seq Scan on "mpart5w-wkt"  (cost=0.00..546291.83 rows=2 width=19) (actual time=97.585..803.734 rows=4394 loops=3)
                     Filter: st_intersects(st_force2d(geom), '0103000020E610000001000000050000003F355EBA49045A40D578E92631A83E403F355EBA49045A40B29DEFA7C6AB3E405A643BDF4F055A40B29DEFA7C6AB3E405A643BDF4F055A40D578E92631A83E403F355EBA49045A40D578E92631A83E40'::geometry)
                     Rows Removed by Filter: 12272
 Planning Time: 0.268 ms
 JIT:
   Functions: 17
   Options: Inlining true, Optimization true, Expressions true, Deforming true
   Timing: Generation 2.771 ms, Inlining 99.859 ms, Optimization 117.378 ms, Emission 74.123 ms, Total 294.132 ms
 Execution Time: 825.745 ms
(14 rows)

但是,测试表明结果几乎相同,即使我进行了许多不同的测试,空间索引也不起作用。去掉 st_force2d() 函数会降低效率。

如果在相同的工作上加上额外的时间限制,效率会降低。

顺便说一句,如果经常使用经纬度边界框,同时又需要计算距离,我应该使用 4326 和 3857 中的哪一个作为 SRID 来存储 GPS 轨迹几何?

【问题讨论】:

  • 出于好奇,为什么不能使用ST_DWitthin?由于您正在寻找位于给定区域内的几何图形,因此可能是相关的:)
  • 或者可能使用 ST_Force2D:: CREATE INDEX idx_part5w ON "part5w-wkt" USING gist (ST_Force2D(geom) gist_geometry_ops_nd); 创建索引,如果我把你的帖子弄错了.. 它有点长 :D
  • emmm,我刚才尝试了ST_DWitthin作为你的建议,ST_DWitthin(geom1, geom2, 0)ST_Intersects(geom1, geom2)的结果似乎没有什么不同,他们的结果计数都是13183。
  • 还没有使用索引?
  • 好吧,你真的不会在回答你自己的问题时问更多问题。而且您绝对不会在其他人的答案中发布答案;)如果您有多个问题,则必须创建多个帖子,否则帖子会变得很长,令人困惑并且对其他用户几乎毫无用处。欢迎来到 SO 和快乐的编码 :)

标签: postgresql geometry geospatial postgis multi-index


【解决方案1】:

您可以通过在索引创建中使用函数ST_Force2D来告诉索引对已经使用geom的记录进行二维排序,这样数据库在查询时就不需要这样做了:

CREATE INDEX idx_part5w_wkt_geom ON "part5w-wkt" 
USING gist (ST_Force2D(geom) gist_geometry_ops_nd);

如果您在CREATE INDEX 中省略ST_Force2D,只要您以后不在WHERE 子句中使用它,它就会产生类似的效果。长话短说:列的索引方式和查询方式必须匹配,否则可能不会使用索引。

演示:db&lt;&gt;fiddle

【讨论】:

  • 在二维索引下工作没问题!!!这是否意味着我应该将 st_3dintersects/st_3dDwithin 与 M 维度一起使用,或者我应该将时间属性设置为 Z 维度?更重要的是,如果同时需要time属性作为查询条件的一部分,我应该同时构建2D-index和3D-index,对吗?
  • @qizidog 你不是用min_timemax_time 来存储你轨迹的时间范围吗?如果是这样,我认为没有理由在查询时间内从 LineString 中提取它。根据不同的应用场景,单个列有多个索引是可以的,但请记住,它会减慢表中的任何更改(例如插入、更新)
  • 好的,但是如果我将time 设置为 m 维度而不是 z 维度,它是否适用于多索引?我还没有看到任何关于这个的介绍。
  • @qizidog 是的,您可以将时间存储在 m 维度中,只要它是数字,例如使用unix time。关于性能,根据您使用的功能,无论您在 z 或 m 维度中放入什么,都会使用索引。最后,它们只是数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2014-07-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2017-09-16
  • 2019-07-04
相关资源
最近更新 更多