首页 > 其他分享 >Postgis常用函数

Postgis常用函数

时间:2023-02-28 10:34:25浏览次数:62  
标签:常用 函数 geometry Postgis ST geom SRID 4326 SELECT

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的值为0:SELECT 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)

标签:常用,函数,geometry,Postgis,ST,geom,SRID,4326,SELECT
From: https://www.cnblogs.com/HanxiGIS/p/17163071.html

相关文章