当前位置: 首页 > news >正文

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中geometrygeography数据类型的区别是什么?

  • 原理说明
    • geometry:基于平面坐标系,使用欧几里得几何计算距离、面积等,适合小范围(如城市)数据,计算效率高。
    • geography:基于地球椭球体,使用球面几何计算,适合全球范围数据,结果更精确,但计算开销大。
  • 主要区别
    对比项geometrygeography
    坐标系统平面坐标系(如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扩展,可通过GEOMETRYGEOGRAPHY类型定义点坐标列,需指定SRID以明确坐标系统。
  • 实现步骤
    1. 启用PostGIS扩展(若未启用):CREATE EXTENSION postgis;
    2. 创建表时定义点类型列,语法为GEOMETRY(Point, SRID)GEOGRAPHY(Point)
  • 示例代码
-- 使用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等栅格数据。
  • 操作步骤
    1. 启用PostGIS栅格扩展:CREATE EXTENSION postgis_raster;
    2. 创建包含raster类型的表。
    3. 使用ST_AsRaster或外部工具(如raster2pgsql)导入栅格数据。
  • 示例代码
-- 创建栅格数据表
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)。
  • 示例代码
-- 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版本)。
  • 示例代码
-- 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字符串。
  • 示例代码
-- 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的存储架构,通过扩展实现空间数据的高效存储。
  • 核心机制
    1. 几何存储
      • 空间数据以二进制形式存储(使用WKB格式)。
      • 几何对象包含边界框(MBR)信息,加速空间查询过滤。
    2. 空间索引
      • 使用GIST(Generalized Search Tree)索引,适合多维数据。
      • 索引基于R树结构,将空间划分为矩形区域。
    3. 分区存储
      • 支持按空间范围分区(如按经纬度网格),提升大尺度数据查询效率。
    4. 元数据管理
      • 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;
http://www.lryc.cn/news/600372.html

相关文章:

  • 零基础学习性能测试第三章:jmeter构建性能业务场景
  • 论文阅读-RaftStereo
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-27,(知识点:信号完整性,信号反射,串扰,时延,抖动,衰减)
  • Qt 延时处理方法介绍
  • day 36打卡
  • 去中心化时代的通信革命:briefing与cpolar技术融合带来的安全范式革新
  • 明辨 JS 中 prototype 与 __proto__
  • 秋招Day19 - 分布式 - 限流
  • C++11 右值引用 Lambda 表达式
  • 基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究
  • CSS3知识补充
  • git笔记(七)使用代理
  • 从一个“诡异“的C++程序理解状态机、防抖与系统交互
  • 外带服务的温度:藏在包装里的“生活共情力”
  • 从零开始的云计算生活——第三十六天,山雨欲来,Ansible入门
  • Java 注解(Annotation)详解:从基础到实战,彻底掌握元数据驱动开发
  • Containerd简介
  • C++ APM异步编程模式剖析
  • 【AcWing 830题解】单调栈
  • JVM 基础架构全解析:运行时数据区与核心组件
  • OpenCV学习探秘之二 :数字图像的矩阵原理,OpenCV图像类与常用函数接口说明,及其常见操作核心技术详解
  • kafka中生产者的数据分发策略
  • Scrapy分布式爬虫数据统计全栈方案:构建企业级监控分析系统
  • 从0到1学Pandas(七):Pandas 在机器学习中的应用
  • 详解力扣高频SQL50题之1193. 每月交易 I【简单】
  • 深度解析【JVM】三大核心架构:运行时数据区、类加载与垃圾回收机制
  • JAVA算法题练习day1
  • Word文档转HTML查看器(字体颜色、字体背景、超链接、图片、目录等全部转换为html),统计Word文档段落数量、图片数量、表格数量、列表数量
  • 英语中因首字母大小写不同而意义不同的单词表
  • pyskl-Windows系统使用自己的数据集训练(一)