PostGIS面试题及详细答案120道之 (061-070 )
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
- 一、本文面试题目录
- 61. 如何将Shapefile文件导入PostGIS?
- 62. 能否将CAD格式的空间数据导入PostGIS,若可以,如何操作?
- 63. 简述使用OGR2OGR工具将其他格式空间数据导入PostGIS的步骤。
- 64. 如何从PostGIS中导出空间数据为KML格式?
- 65. 若要将PostGIS中的部分数据导出为GeoJSON格式并用于Web应用,应如何操作?
- 66. 数据导入过程中,如何处理空间数据的坐标转换问题?
- 67. 导入大规模空间数据时,如何提高导入效率?
- 68. PostGIS是否支持与其他GIS软件的数据交互,如何实现?
- 69. 怎样将PostGIS中的数据导入到ArcGIS中?
- 70. 从PostGIS导出数据时,能否只导出满足特定条件的空间数据?
一、本文面试题目录
61. 如何将Shapefile文件导入PostGIS?
方法一:使用shp2pgsql
命令行工具(推荐)
-
生成SQL脚本:
shp2pgsql -s SRID -I -W "ENCODING" shapefile.shp schema.table > output.sql
-s SRID
:指定坐标系(如4326)。-I
:自动创建空间索引。-W
:指定字符编码(如"LATIN1"或"UTF-8")。
-
执行SQL导入:
psql -d your_database -f output.sql -U username
方法二:使用QGIS
- 打开QGIS,连接到PostGIS数据库。
- 右键点击数据库,选择"导入图层/文件"。
- 选择Shapefile路径,配置目标表名和SRID,点击"导入"。
62. 能否将CAD格式的空间数据导入PostGIS,若可以,如何操作?
可以,通过以下步骤实现:
- 转换CAD为中间格式(如GeoJSON、Shapefile):
- 使用QGIS:打开CAD文件(.dwg/.dxf),导出为Shapefile。
- 使用GDAL/OGR:
ogr2ogr -f "ESRI Shapefile" output.shp input.dwg
- 导入中间格式到PostGIS(参考问题61)。
shp2pgsql -s 2154 -I output.shp public.cad_data | psql -d your_db
63. 简述使用OGR2OGR工具将其他格式空间数据导入PostGIS的步骤。
-
安装GDAL/OGR(包含
ogr2ogr
工具)。 -
执行导入命令:
ogr2ogr -f "PostgreSQL" PG:"dbname=your_db user=username password=pass" \ input_data.shp -nln target_table -lco GEOMETRY_NAME=geom
-f "PostgreSQL"
:输出格式为PostgreSQL。-nln
:指定目标表名。-lco GEOMETRY_NAME
:指定几何字段名。
-
常用参数:
-s_srs
/-t_srs
:源/目标坐标系(如"EPSG:4326")。-where
:过滤条件(如"POPULATION > 10000
")。
64. 如何从PostGIS中导出空间数据为KML格式?
方法一:使用ogr2ogr
ogr2ogr -f "KML" output.kml PG:"dbname=your_db" -sql "SELECT geom, name FROM table"
方法二:直接查询导出
-- 生成KML文件内容
COPY (SELECT ST_AsKML(geom) AS kml FROM your_table
) TO '/path/to/output.kml';
注意:需确保PostgreSQL用户有写入权限,且几何为WGS84(EPSG:4326)。
65. 若要将PostGIS中的部分数据导出为GeoJSON格式并用于Web应用,应如何操作?
方法一:使用ogr2ogr
ogr2ogr -f "GeoJSON" -t_srs EPSG:4326 output.geojson \
PG:"dbname=your_db" -sql "SELECT id, name, geom FROM table WHERE condition"
方法二:SQL查询直接生成
SELECT jsonb_build_object('type', 'FeatureCollection','features', jsonb_agg(features.feature)
)
FROM (SELECT jsonb_build_object('type', 'Feature','geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,'properties', to_jsonb(inputs) - 'geom') AS featureFROM (SELECT * FROM your_table WHERE condition) inputs
) features;
Web应用集成:将GeoJSON文件通过HTTP服务暴露,或嵌入前端代码中使用Leaflet/Mapbox显示。
66. 数据导入过程中,如何处理空间数据的坐标转换问题?
-
明确源坐标系(SRID):
- 查看Shapefile的.prj文件或使用
ogrinfo -so input.shp
。
- 查看Shapefile的.prj文件或使用
-
导入时转换(以
shp2pgsql
为例):shp2pgsql -s 源SRID:目标SRID shapefile.shp public.table | psql -d your_db
示例:从RGF93(2154)转换为WGS84(4326):
shp2pgsql -s 2154:4326 data.shp public.table | psql -d your_db
-
导入后转换:
ALTER TABLE your_table ALTER COLUMN geom TYPE geometry(Geometry, 4326) USING ST_Transform(geom, 4326);
67. 导入大规模空间数据时,如何提高导入效率?
-
临时禁用约束与索引:
ALTER TABLE your_table DISABLE TRIGGER ALL; DROP INDEX IF EXISTS your_table_geom_idx;
-
使用COPY命令替代INSERT(如
shp2pgsql -c
)。 -
分批导入:
# 使用ogr2ogr的--config选项优化 ogr2ogr -f PostgreSQL PG:"dbname=your_db" input.shp \ --config PG_USE_COPY YES -gt 65536
-
调整PostgreSQL参数:
# postgresql.conf work_mem = '64MB' # 增加内存用于排序 maintenance_work_mem = '256MB' synchronous_commit = off wal_level = minimal
-
导入后重建索引和统计信息:
CREATE INDEX ON your_table USING GIST (geom); ANALYZE your_table;
68. PostGIS是否支持与其他GIS软件的数据交互,如何实现?
支持,通过以下方式实现:
-
标准格式转换:
- 使用
ogr2ogr
导入/导出Shapefile、GeoJSON、KML等。 - 示例:导出为GeoPackage供ArcGIS/QGIS使用:
ogr2ogr -f GPKG output.gpkg PG:"dbname=your_db"
- 使用
-
直接连接:
- QGIS:通过"数据库" → "添加PostGIS图层"连接。
- ArcGIS:使用"创建数据库连接"工具,配置PostgreSQL驱动。
-
中间件:
- GeoServer:发布PostGIS数据为WMS/WFS服务,供其他软件消费。
69. 怎样将PostGIS中的数据导入到ArcGIS中?
-
使用ArcGIS的PostgreSQL驱动:
- 打开ArcCatalog,右键点击"数据库连接"。
- 选择"PostgreSQL",填写主机、端口、数据库、用户名和密码。
- 连接后,直接拖放表到ArcMap/Pro中。
-
导出为中间格式:
- 使用
ogr2ogr
导出为Shapefile或GeoDatabase:ogr2ogr -f "FileGDB" output.gdb PG:"dbname=your_db"
- 在ArcGIS中导入生成的文件。
- 使用
70. 从PostGIS导出数据时,能否只导出满足特定条件的空间数据?
可以,通过以下方法实现:
-
使用
ogr2ogr
的-where
参数:ogr2ogr -f "GeoJSON" output.geojson PG:"dbname=your_db" \ -sql "SELECT * FROM your_table WHERE population > 10000"
-
SQL查询导出:
COPY (SELECT * FROM your_table WHERE area > 1000000 ) TO '/path/to/output.csv' WITH CSV HEADER;
-
KML/GeoJSON直接生成:
SELECT ST_AsKML(geom) FROM your_table WHERE type = 'park';
注意:导出时需确保用户有文件写入权限,且过滤条件与数据结构匹配。