PostGIS導入導出shp的注意事項
1.數據導入之前需要給需要導入的數據庫增加空間擴展功能。

CREATE EXTENSION postgis // 啟用PostGIS CREATE EXTENSION postgis_topology // 啟用拓撲 CREATE EXTENSION fuzzystrmatch // Tiger所需的模糊匹配 CREATE EXTENSION postgis_tiger_geocoder // 啟用美國Tiger Geocoder
2.當往postgis導入shp文件的時候,忘記指定srid時,默認是0,此時可以通過這個函數更改數據的坐標系:
SELECT UpdateGeometrySRID(‘表名’,'geom’,26918);
3.查詢SRID
select st_srid(geom) from table;
4.查詢geom字段信息
select ST_AsText(geom) from 'table_name'
5. 數據庫單個表的大小,單位(text);
--數據庫中單個表的大小(不包含索引) 把以字節計算的數值轉換成一個人類易讀的尺寸單位
select pg_size_pretty(pg_relation_size('"GA_P"'));
6.查詢pg庫所有的表和表所對應的schemaname
SELECT t.schemaname as schemaname,t.tablename tablename FROM pg_tables t
7.根據表名查詢表的schemaname
SELECT t.schemaname as schemaname,t.tablename tablename FROM pg_tables t where t.tablename = 'SX_MZSX_PG'
String sql = "SELECT t.schemaname as schemaname,t.tablename tablename FROM pg_tables t where t.tablename = ?";
PreparedStatement stmt = this.connection.prepareStatement(sql);
try {
stmt.setString(1, pTN);
ResultSet rs = stmt.executeQuery();
try {
if (rs.next()) {
// 基本信息
String owner = rs.getString("schemaname");
String tableName = rs.getString("tablename");
try {
// 添加圖層
return new SDO_Table(this.connection, owner, tableName);
} catch (EzSqlSrvProxyException e) {
// 出現錯誤的圖層不予考慮
}
}
} finally {
rs.close();
}
} finally {
stmt.close();
}
8.根據表名和schemaname查詢表的字段
select * from "public"."SXGJX" where 1=0
9.連接pg數據庫報錯:no pg_hba.conf entry for host
解決辦法:
修改pg_hba.conf,在第一行添加一行:
host all all 0.0.0.0/0 md5
表示允許任何用戶連接到任何數據庫,用一個加密的密碼
10.函數ST_MakeEnvelope
簡介
geometry ST_MakeEnvelope(float xmin, float ymin, float xmax, float ymax, integer srid=unknown);
描述
從X和Y的最小值和最大值創建矩形多邊形。輸入值必須位於SRID指定的空間參照系統中。如果未指定SRID,則使用未知空間參照系統(SRID 0)
11函數ST_AsMVTGeom
簡介
geometry ST_AsMVTGeom(geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true);
描述
12.函數ST_AsBinary
簡介
bytea ST_AsBinary(geometry g1);
描述
13.函數ST_Intersects
簡介
ST_Intersects( geometry geomA , geometry geomB );
描述
text ST_AsGeoJSON(record feature, text geomcolumnname, integer maxdecimaldigits=9, boolean pretty_bool=false);
text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=9, integer options=8);
text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=9, integer options=0);
描述
將幾何體作為GeoJSON“geometry”對象返回,或將行作為GeoJSON“feature”對象返回
maxdecimaldigits參數可用於減少輸出中使用的最大小數位數(默認為9)。如果您使用的是EPSG:4326並且輸出的幾何圖形僅用於顯示,那么maxdecimaldigits=6對於許多貼圖來說都是一個不錯的選擇
15.將postgis查詢結果轉換為geojson
WITH features AS ( SELECT st_asgeojson ( pipe_line.* ) :: json AS feature FROM pipe_line_wgs84 AS pipe_line ) SELECT
json_build_object ( 'type', 'FeatureCollection', 'features', json_agg ( features.feature ) )
FROM
features
16.查詢表字段
String tableName = "table_name";
String queryFildSql = "SELECT a.attnum," +
"a.attname AS field" +
" FROM pg_class c," +
" pg_attribute a" +
" LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid," +
" pg_type t" +
" WHERE c.relname = '" + tableName + "'" +
" and a.attnum > 0" +
" and a.attrelid = c.oid" +
" and a.atttypid = t.oid" +
" ORDER BY a.attnum";
17.創建表
DROP TABLE IF EXISTS "public"."road";
CREATE TABLE "public"."road" (
"id" int4 NOT NULL,
"geom" geometry(geometry, 4326),
"FID" float8,
"FNode" float8,
"TNode" float8,
"Length" float8,
"Name" varchar COLLATE "pg_catalog"."default",
"PopName" varchar COLLATE "pg_catalog"."default",
"District" varchar COLLATE "pg_catalog"."default",
"Attribute" varchar COLLATE "pg_catalog"."default",
"RouteNum" varchar COLLATE "pg_catalog"."default",
"Speed" varchar COLLATE "pg_catalog"."default",
"Limit" varchar COLLATE "pg_catalog"."default",
"Toll" int4,
"Doorplate" varchar COLLATE "pg_catalog"."default",
"CName" varchar COLLATE "pg_catalog"."default",
"EName" varchar COLLATE "pg_catalog"."default",
"InsiteType" varchar COLLATE "pg_catalog"."default",
"Update" date,
"Source" varchar COLLATE "pg_catalog"."default",
"GUID" varchar COLLATE "pg_catalog"."default",
"路面類型" varchar COLLATE "pg_catalog"."default"
);
18.查詢版本
show server_version; // 查詢PostGIS版本 POSTGIS="3.1.2 3.1.2" [EXTENSION] PGSQL="130" GEOS="3.9.1-CAPI-1.14.1" PROJ="7.1.1" LIBXML="2.9.9" LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)" TOPOLOGY
select version(); // 查詢PostgreSQL版本
select postgis_full_version(); // 13.3 查詢PostgreSQL 版本
19. geometry轉wkt
SELECT st_astext('{"coordinates":[[106.49824956236046,29.56679821936578],[106.49844680963861,29.566098772209088]],"type":"LineString"}')
// LINESTRING(106.49824956236046 29.56679821936578,106.49844680963861 29.566098772209088)
20. wkt轉geometry
SELECT ST_GeomFromText('POLYGON((106.93679809570278 30.11215209960944,106.93817138671841 30.11215209960944,106.93817138671841 30.110778808593814,106.93679809570278 30.110778808593814,106.93679809570278 30.11215209960944))',4326)
// 0103000020E61000000100000005000000E8FFFF7FF4BB5A4012000000B61C3E40E8FFFFFF0ABC5A4012000000B61C3E40E8FFFFFF0ABC5A40120000005C1C3E40E8FFFF7FF4BB5A40120000005C1C3E40E8FFFF7FF4BB5A4012000000B61C3E40
21. 查詢表的空間類型
SELECT type FROM geometry_columns where f_table_name=''
表空間類型查詢結果和實際空間類型映射
Map dict = new HashMap(); // 建立SDO_GTYPE和 幾何類型 對應的字典 dict.put("2000", "unkonwn"); dict.put("2001", "point"); dict.put("2002", "Polyline"); dict.put("2003", "polygon"); dict.put("2004", "COLLECTION"); dict.put("2005", "MutliPoint"); dict.put("2006", "MutliPolyline"); dict.put("2007", "MutliPolygon");
使用隨機查詢一條記錄確定表的幾何類型
String sqlType = "select ST_GeometryType(geom) AS type from\"" + layerName+"\" ORDER BY random() LIMIT 1";
22. 用於生成矢量切片的函數ST_AsMVT

ST_AsMVT聚合函數用於將基於MapBox VectorTile坐標空間的幾何圖形轉換為MapBox VectorTile二進制矢量切片。
