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的值为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)
本文来自博客园,作者:HanxiGIS,转载请注明原文链接:https://www.cnblogs.com/HanxiGIS/p/17163071.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了