Postgis常用函数

Postgis常用函数

创建拓展

create extension postgis;

Postgis升级

ALTER EXTENSION postgis UPDATE;

Postgis版本

select postgis_full_version()

设置坐标系

ST_SetSRID(st_makepoint(108.910760161752, 34.1972735299495),4326)
SELECT UpdateGeometrySRID('geom_test01','zone_geom',4326);


1)如果不设置geom字段的SRID,则将SRID的值为0SELECT AddGeometryColumn('geom_test01', 'geom', 0, 'POINT', 2);
2)geom字段的SRID设置为0(等效于未设置字段的SRID),则数据插入时不会检查SRID,不同行数据插入时,SRID可以不同,能写入成功
3)geom字段的SRID设置为非0(设置了字段的SRID),则数据插入时会自动检查SIRD,插入数据的SRID必须与字段的SRID匹配,才允许插入,否则会插入报错:
  testdb01=> INSERT INTO geom_test01_tmp(id, info, geom) VALUES (4, 'test', ST_GeomFromText('POINT(-0.1250 52.500)',4490)); 
  ERROR:  Geometry SRID (4490) does not match column SRID (4326)
4)数据插入到表以后,如果再修改空间数据字段的SRID(修改语句:SELECT UpdateGeometrySRID('geom_test01','geom',4490);),则会自动刷新所有表中存量数据的SRID为新设置的SRID

添加空间字段

SELECT AddGeometryColumn ('location', 'sp_geometry', 4326, 'POINT', 2);
alter table busstop_softzone add gcj geometry 

ST_AsMVTGeom

  • 矢量切片常用函数
CREATE 
	OR REPLACE FUNCTION vector_tile_test ( IN z INT, IN x INT, IN y INT, OUT tile bytea ) RETURNS bytea AS $BODY$ DECLARE
	bound geometry;
extent box2d;
SQL TEXT;
BEGIN
		bound := ST_Transform ( ST_TileEnvelope ( z, x, y ), 4326 );
	extent := Box2D ( bound );
	SQL := 'WITH mvtgeom AS(
	SELECT ST_AsMVTGeom(geom, $1) AS geom, name FROM road WHERE ST_Intersects(geom, $2)
	) SELECT gzip(ST_AsMVT(mvtgeom.*,$3)) FROM mvtgeom';
	EXECUTE format ( SQL ) USING extent,
	bound,
	'road' INTO tile;
	RETURN;
	
END;
$BODY$ LANGUAGE'plpgsql' VOLATILE STRICT;

  • openlayers调用矢量切片参考

Custom Canvas Tiles (openlayers.org)

  • 查询范围内的MVT数据,并行数
--设置并行数量
Alter table grid_editor.base_grid_editing_finally set (parallel_workers = 2);
explain analyse 
WITH mvtgeom AS(
    SELECT ST_AsMVTGeom(sp_geometry, ST_GeomFromText('POLYGON((108.332210161969 33.9829926317046,108.332210161969 34.2449342816918,108.907774162548 34.2449342816918,108.907774162548 33.9829926317046,108.332210161969 33.9829926317046))',4326)) AS sp_geometry, name 
    FROM grid_editor.base_grid_editing_finally WHERE is_latest=true and ST_Intersects(sp_geometry, ST_GeomFromText('POLYGON((108.332210161969 33.9829926317046,108.332210161969 34.2449342816918,108.907774162548 34.2449342816918,108.907774162548 33.9829926317046,108.332210161969 33.9829926317046))',4326))
    ) 
SELECT ST_AsMVT(mvtgeom.*,'road') FROM mvtgeom;

ST_GeomFromEWKT

字符串转换geometry类型通过st_geomfromewkt

ST_Boundary

通过ST_Boundary计算面的边界,多面时返回多线

ST_AddMeasure

  • 如果源对象没有M维度,则添加一个。如果有,则会用新值覆盖它。

  • 仅支持(Multi)LineString对象。

  • 该函数支持3D对象,并且不会删除Z坐标。

    SELECT ST_AsText(ST_AddMeasure('LINESTRING(1 0, 2 0)'::geometry,1,2));
    
    

多面转单面

查询面的个数  ST_NumGeometries
查询多面中第n个 st_geometryn(geom,n)
posted @   HanxiGIS  阅读(754)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示