PostGIS面试题及详细答案120道之 (011-020 )
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
- 一、本文面试题目录
- 11. PostGIS中`geometry`和`geography`数据类型的区别是什么?
- 12. 如何在PostgreSQL表中定义一个存储点坐标的列?
- 13. 若要存储一条河流的路径,应使用哪种PostGIS数据类型?
- 14. 怎样存储一个城市的行政区域边界数据?
- 15. PostGIS是否支持对栅格数据的存储,若支持,如何操作?
- 16. 如何将WKT(Well - Known Text)格式的数据转换为PostGIS中的空间数据类型?
- 17. 什么是GML(地理标记语言),PostGIS与GML有什么关联?
- 18. 能否将JSON格式的空间数据导入PostGIS,若可以,如何操作?
- 19. 在PostGIS中,如何存储和管理3D空间数据?
- 20. 简述PostGIS中空间数据的存储结构原理。
一、本文面试题目录
11. PostGIS中geometry
和geography
数据类型的区别是什么?
- 原理说明:
- geometry:基于平面坐标系,使用欧几里得几何计算距离、面积等,适合小范围(如城市)数据,计算效率高。
- geography:基于地球椭球体,使用球面几何计算,适合全球范围数据,结果更精确,但计算开销大。
- 主要区别:
对比项 geometry geography 坐标系统 平面坐标系(如UTM) 地理坐标系(经纬度) 距离单位 取决于投影单位(如米) 默认为米 计算精度 小范围精确,大范围有误差 全球范围精确 空间函数支持 更丰富(如ST_Buffer) 部分函数受限(需ST_DWithin等) - 示例代码:创建不同类型的表
-- geometry类型(需指定投影SRID)
CREATE TABLE cities_geom (id SERIAL PRIMARY KEY,name VARCHAR(50),geom GEOMETRY(Point, 3857) -- Web Mercator投影
);-- geography类型(默认SRID=4326)
CREATE TABLE cities_geog (id SERIAL PRIMARY KEY,name VARCHAR(50),geog GEOGRAPHY(Point)
);
12. 如何在PostgreSQL表中定义一个存储点坐标的列?
- 原理说明:在PostgreSQL中结合PostGIS扩展,可通过
GEOMETRY
或GEOGRAPHY
类型定义点坐标列,需指定SRID以明确坐标系统。 - 实现步骤:
- 启用PostGIS扩展(若未启用):
CREATE EXTENSION postgis;
- 创建表时定义点类型列,语法为
GEOMETRY(Point, SRID)
或GEOGRAPHY(Point)
。
- 启用PostGIS扩展(若未启用):
- 示例代码:
-- 使用geometry类型(投影坐标,如UTM)
CREATE TABLE places (id SERIAL PRIMARY KEY,name VARCHAR(50),location GEOMETRY(Point, 32650) -- UTM Zone 50N
);-- 使用geography类型(经纬度坐标)
CREATE TABLE landmarks (id SERIAL PRIMARY KEY,name VARCHAR(50),location GEOGRAPHY(Point) -- 默认SRID=4326
);
13. 若要存储一条河流的路径,应使用哪种PostGIS数据类型?
- 原理说明:河流路径是由一系列连续点组成的线要素,需使用线类型存储。
- 适用数据类型:
- LineString:适合简单连续河流。
- MultiLineString:适合分段或不连续的河流水系(如季节性河流)。
- 示例代码:
-- 存储单一河流(LineString)
CREATE TABLE rivers (id SERIAL PRIMARY KEY,name VARCHAR(50),path GEOMETRY(LineString, 4326)
);-- 插入长江主干线路径示例
INSERT INTO rivers (name, path)
VALUES ('Yangtze River',ST_GeomFromText('LINESTRING(114.3 30.5, 115.2 29.8, 116.5 28.6)', 4326)
);-- 存储复杂河网(MultiLineString)
CREATE TABLE river_network (id SERIAL PRIMARY KEY,name VARCHAR(50),segments GEOMETRY(MultiLineString, 4326)
);
14. 怎样存储一个城市的行政区域边界数据?
- 原理说明:城市行政区域边界是闭合的多边形,需使用面类型存储,复杂边界可能需使用MultiPolygon。
- 适用数据类型:
- Polygon:适合简单单部分区域(无孔洞)。
- MultiPolygon:适合多部分区域(如包含飞地)或有孔洞的区域。
- 示例代码:
-- 存储简单城市边界(无孔洞)
CREATE TABLE cities (id SERIAL PRIMARY KEY,name VARCHAR(50),boundary GEOMETRY(Polygon, 4326)
);-- 插入北京市边界示例(简化)
INSERT INTO cities (name, boundary)
VALUES ('Beijing',ST_GeomFromText('POLYGON((115.4 39.4, 117.6 39.4, 117.6 41.0, 115.4 41.0, 115.4 39.4))', 4326)
);-- 存储含孔洞的区域(如湖泊)
CREATE TABLE cities_with_lakes (id SERIAL PRIMARY KEY,name VARCHAR(50),boundary GEOMETRY(Polygon, 4326)
);-- 插入含湖泊的城市边界
INSERT INTO cities_with_lakes (name, boundary)
VALUES ('City with Lake',ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0), (3 3, 3 7, 7 7, 7 3, 3 3))', 4326)
);
15. PostGIS是否支持对栅格数据的存储,若支持,如何操作?
- 原理说明:PostGIS从2.0版本开始支持栅格数据类型(
raster
),可存储遥感影像、DEM等栅格数据。 - 操作步骤:
- 启用PostGIS栅格扩展:
CREATE EXTENSION postgis_raster;
- 创建包含
raster
类型的表。 - 使用
ST_AsRaster
或外部工具(如raster2pgsql
)导入栅格数据。
- 启用PostGIS栅格扩展:
- 示例代码:
-- 创建栅格数据表
CREATE TABLE satellite_images (id SERIAL PRIMARY KEY,name VARCHAR(50),acquisition_date DATE,rast RASTER
);-- 从文件导入栅格数据(需使用raster2pgsql工具)
-- 命令行示例:
-- raster2pgsql -s 4326 -I -C -M /path/to/image.tif public.satellite_images | psql -d your_database
16. 如何将WKT(Well - Known Text)格式的数据转换为PostGIS中的空间数据类型?
- 原理说明:WKT是一种文本标记语言,用于表示几何对象。PostGIS提供函数将WKT转换为内部空间数据类型。
- 核心函数:
- ST_GeomFromText(wkt, srid):将WKT转换为
geometry
类型。 - ST_GeogFromText(wkt):将WKT转换为
geography
类型(默认SRID=4326)。
- ST_GeomFromText(wkt, srid):将WKT转换为
- 示例代码:
-- WKT转geometry(点)
SELECT ST_GeomFromText('POINT(116.4 39.9)', 4326);-- WKT转geometry(线)
SELECT ST_GeomFromText('LINESTRING(116.3 39.8, 116.5 39.9)', 4326);-- WKT转geography(面)
SELECT ST_GeogFromText('POLYGON((116.3 39.8, 116.5 39.8, 116.5 40.0, 116.3 40.0, 116.3 39.8))');-- 插入WKT数据到表
INSERT INTO points (name, geom)
VALUES ('Beijing', ST_GeomFromText('POINT(116.4 39.9)', 4326));
17. 什么是GML(地理标记语言),PostGIS与GML有什么关联?
- 原理说明:
- GML:是一种基于XML的地理空间数据编码标准,由OGC制定,用于描述地理要素的几何和属性。
- PostGIS关联:PostGIS提供函数支持GML与内部空间类型的相互转换,实现与其他GIS系统的数据交换。
- 核心函数:
- ST_GeomFromGML(gml):将GML字符串转换为
geometry
。 - ST_AsGML(version, geom):将
geometry
转换为GML字符串(支持GML 2/3版本)。
- ST_GeomFromGML(gml):将GML字符串转换为
- 示例代码:
-- GML转geometry
SELECT ST_GeomFromGML('<gml:Point srsName="EPSG:4326"><gml:pos>116.4 39.9</gml:pos></gml:Point>'
);-- geometry转GML
SELECT ST_AsGML(3, -- GML版本3ST_GeomFromText('POINT(116.4 39.9)', 4326)
);
18. 能否将JSON格式的空间数据导入PostGIS,若可以,如何操作?
- 原理说明:PostGIS支持GeoJSON(符合RFC 7946标准的空间JSON格式),可通过函数直接转换为内部空间类型。
- 操作方法:
- ST_GeomFromGeoJSON(json):将GeoJSON字符串转换为
geometry
。 - ST_AsGeoJSON(geom):将
geometry
转换为GeoJSON字符串。
- ST_GeomFromGeoJSON(json):将GeoJSON字符串转换为
- 示例代码:
-- JSON转geometry
SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[116.4,39.9]}'
);-- 从JSONB字段提取几何
CREATE TABLE places_json (id SERIAL PRIMARY KEY,data JSONB
);INSERT INTO places_json (data)
VALUES ('{"name":"Beijing","location":{"type":"Point","coordinates":[116.4,39.9]}}');-- 查询时转换为geometry
SELECT data->>'name' AS name,ST_GeomFromGeoJSON(data->'location') AS geom
FROM places_json;
19. 在PostGIS中,如何存储和管理3D空间数据?
- 原理说明:PostGIS支持存储带Z值(高程)或M值(测量值)的3D几何类型,通过扩展的函数进行管理。
- 数据类型:
- POINTZ:带高程的点(x,y,z)。
- LINESTRINGZ:带高程的线。
- POLYGONZ:带高程的面。
- 核心函数:
- ST_3DLength:计算3D线长度。
- ST_3DDistance:计算3D点距离。
- ST_Force3D:将2D几何转换为3D。
- 示例代码:
-- 创建3D点表
CREATE TABLE buildings (id SERIAL PRIMARY KEY,name VARCHAR(50),geom GEOMETRY(PointZ, 4326)
);-- 插入3D点(高度100米)
INSERT INTO buildings (name, geom)
VALUES ('Skyscraper',ST_GeomFromText('POINTZ(116.4 39.9 100)', 4326)
);-- 计算3D距离
SELECT ST_3DDistance(ST_GeomFromText('POINTZ(0 0 0)', 4326),ST_GeomFromText('POINTZ(0 0 10)', 4326)
); -- 结果为10(仅Z轴差异)
20. 简述PostGIS中空间数据的存储结构原理。
- 原理说明:PostGIS基于PostgreSQL的存储架构,通过扩展实现空间数据的高效存储。
- 核心机制:
- 几何存储:
- 空间数据以二进制形式存储(使用WKB格式)。
- 几何对象包含边界框(MBR)信息,加速空间查询过滤。
- 空间索引:
- 使用GIST(Generalized Search Tree)索引,适合多维数据。
- 索引基于R树结构,将空间划分为矩形区域。
- 分区存储:
- 支持按空间范围分区(如按经纬度网格),提升大尺度数据查询效率。
- 元数据管理:
geometry_columns
表记录所有几何列的元数据(表名、列名、SRID等)。spatial_ref_sys
表存储空间参考系统定义。
- 几何存储:
- 示例代码:查看空间索引和元数据
-- 创建空间索引
CREATE INDEX idx_buildings_geom ON buildings USING GIST(geom);-- 查看几何列元数据
SELECT * FROM geometry_columns WHERE f_table_name = 'buildings';-- 查看空间参考系统
SELECT * FROM spatial_ref_sys WHERE srid = 4326;