PostgreSQL和PostGIS学习笔记

发布时间:2026/9/14 12:25:14

PostgreSQL和PostGIS学习笔记 一、建空间数据库# 1.创建普通关系型数据库 CREATE DATABASE gisdb; # 2.连接数据库 /c gisdb; # 3.启用 PostGIS 扩展模块(以下为postgis不同的扩张模块) CREATE EXTENSION postgis; # 拓扑扩展 CREATE EXTENSION postgis_topology; # 地址解析扩展 CREATE EXTENSION postgis_tiger_geocoder;二、建空间表# 创建点表 CREATE TABLE sample_point ( id SERIAL PRIMARY KEY, name VARCHAR(100), soil_moisture NUMERIC(5,3), # Point:表示集合类型4326:World Geodetic System 1984(坐标系 SRID) geom geometry(Point,4326) ); #创建线表 CREATE TABLE road ( id SERIAL PRIMARY KEY, road_name VARCHAR(100), geom geometry(LineString,4326) );三、插入空间数据插入点数据 INSERT INTO sample_point ( name, soil_moisture, geom ) VALUES ( 样点1, 0.23, ST_SetSRID( ST_Point(116.4,39.9), 4326 ) ); 插入线数据 INSERT INTO road ( road_name, geom ) VALUES ( 测试道路, ST_GeomFromText( LINESTRING( 116.4 39.9, 116.5 39.95, 116.6 40.0 ), 4326 ) );四、创建索引# 索引的目的是让距离查询、范围查询、相交查询等的性能提升几十倍到上千倍。 # 索引提高查询的速度但是降低删改查的速度所以索引要建在经常被查询的字段上。 CREATE INDEX idx_sample_geom ON sample_point USING GIST(geom); # 联合索引最左匹配原则 CREATE INDEX idx_sat_time ON soil_sample( satellite, sample_time );四、修改空间数据UPDATE sample_point SET geom ST_SetSRID( ST_Point(116.5,40.0), 4326 ) WHERE id 1; # WKT格式 UPDATE sample_point SET geom ST_GeomFromText( POINT(116.5 40.0), 4326 ) WHERE id 1; # 修改四边形 UPDATE satellite_image SET geom ST_GeomFromText( POLYGON(( 120.71 29.9278, -- TopLeft: 经度 纬度 126.376 30.0674, -- TopRight 125.162 24.6759, -- BottomRight 119.86 24.5777, -- BottomLeft 120.71 29.9278 -- TopLeft: 闭合点 )), 4326 ) WHERE id 4;五、空间查询六、缓冲区# 1.查找时临时生成缓冲区 CREATE TABLE sample_point( id SERIAL PRIMARY KEY, name VARCHAR(50), geom geometry(Point,4326) ); SELECT id, ST_Buffer(geom,100) AS buffer_geom FROM sample_point; # 2.创建缓冲区表 CREATE TABLE camera_buffer( id SERIAL PRIMARY KEY, camera_id INT, geom geometry(Polygon,3857) ); INSERT INTO camera_buffer( camera_id, geom ) SELECT id, ST_Buffer( ST_Transform(geom,3857), 100 ) FROM camera; # 注:这里将4326转换成了3857因为4326 经纬度单位是度;3857 Web Mercator单位是米。 # 3.给表新增缓冲区字段 ALTER TABLE sample_point ADD COLUMN buffer_geom geometry(Polygon,3857); UPDATE sample_point SET buffer_geom ST_Buffer( ST_Transform(geom,3857), 100 ); # 查询缓冲区内的对象 # 查询样点100米范围内的道路 SELECT r.* FROM road r, sample_point s WHERE ST_Intersects( r.geom, ST_Buffer( ST_Transform(s.geom,3857), 100 ) );七、相交# 查询两个面相交 SELECT ST_Intersects( geom1, geom2 ); # 查询点在面内包括点在面上 SELECT ST_Intersects( district.geom, sample_point.geom );八、距离计算# 1.两点间的距离 SELECT ST_Distance( ST_Transform( ST_SetSRID( ST_Point(116.4,39.9), 4326 ), 3857 ), ST_Transform( ST_SetSRID( ST_Point(116.5,39.95), 4326 ), 3857 ) ); # 2.使用 geography推荐计算真实地球距离 SELECT ST_Distance( ST_SetSRID( ST_Point(116.4,39.9), 4326 )::geography, ST_SetSRID( ST_Point(116.5,39.95), 4326 )::geography ); # 3.计算表中两个对象的距离 CREATE TABLE sample_point( id SERIAL PRIMARY KEY, geom geometry(Point,4326) ); SELECT a.id, b.id, ST_Distance( a.geom::geography, b.geom::geography ) AS distance_m FROM sample_point a, sample_point b WHERE a.id 1 AND b.id 2; # 4.查询最近的对象 # 查询距离样点最近的摄像头 SELECT id, ST_Distance( geom::geography, ST_SetSRID( ST_Point(116.4,39.9), 4326 )::geography ) AS distance FROM camera ORDER BY distance # 只取第一条记录 LIMIT 1; # 5.查询 100 米内的对象 SELECT * FROM sample_point WHERE ST_DWithin( geom::geography, ST_SetSRID( ST_Point(116.4,39.9), 4326 )::geography, 100 );九、GeoJson互转# 1.GeoJSON 点转 SQL INSERT INTO sample_point(name, geom) VALUES ( 样点1, ST_SetSRID( ST_GeomFromGeoJSON({ type: Point, coordinates: [116.4, 39.9] }), 4326 ) ); #2.表字段中的 GeoJSON 转换 CREATE TABLE geojson_temp( id SERIAL PRIMARY KEY, name VARCHAR(100), geojson TEXT ); CREATE TABLE sample_point( id SERIAL PRIMARY KEY, name VARCHAR(100), geom geometry(Point,4326) ); INSERT INTO sample_point(name, geom) SELECT name, ST_SetSRID( ST_GeomFromGeoJSON(geojson), 4326 ) FROM geojson_temp; # 3.PostGIS 转 GeoJson SELECT id, name, ST_AsGeoJSON(geom) AS geojson FROM sample_point;PostGis方法总结# ST_SetSRID():给几何对象贴坐标系标签. # ST_Transform():修改坐标. # ST_Buffer():创建缓冲区. # ST_Distance():计算距离. # ST_Point():创建对象. # ST_GeomFromText():从字符串创建对象. # ST_Intersects():判断是否相交. # ST_Contains():判断点是否在面内. # ST_Touches():判断是否接触。 # ST_Overlaps():判断是否重叠。 # ST_Transform():平移. # ST_Rotate():旋转. # ST_Scale():缩小。 # ST_Area():面积. # ST_Perimeter():周长. # ST_Length():线长度. # ST_GeomFromGeoJSON():把 GeoJSON转成 PostGIS
延伸阅读

更多相关文章

2026/9/1 17:31:35

AURIX TC397XM在智能驾驶中的安全与实时处理实践

1. AURIX TC397XM在智能驾驶领域的核心定位AURIX TC397XM微控制器作为英飞凌旗舰级车规芯片,其设计初衷直指自动驾驶系统最严苛的安全与性能需求。这款六核处理器采用TriCore™架构,每个内核运行频率高达300MHz,并集成DSP指令集,在…

2026/9/14 3:45:13

DDR SDRAM技术解析:从原理到应用实践

1. DDR SDRAM技术概述DDR SDRAM(Double Data Rate Synchronous Dynamic Random-Access Memory)是现代计算机系统中最为核心的内存技术之一。作为SDRAM技术的进化版本,DDR通过在时钟信号的上升沿和下降沿都传输数据,实现了在不提高…

2026/9/13 10:08:59

Coze3.0多Agent协作:零基础构建可视化Agent操作系统

1. 项目概述:Coze3.0不是“又一个聊天机器人”,而是面向真实工作流的Agent操作系统Coze3.0发布当天,我盯着控制台里那个标着“多Agent协作”的新按钮看了三分钟——它没写一行代码,没配一个API密钥,却让一个原本需要4人…

2026/9/14 17:45:13

DFS算法入门:从全排列到八皇后问题实战解析

1. 为什么DFS是算法入门的必修课 深度优先搜索(DFS)作为算法领域的经典入门技术,其重要性不亚于学习编程时的"Hello World"。我第一次接触DFS是在大二的算法课上,当时教授用走迷宫的比喻来解释这个概念——就像一个人在…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码