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

基于PostGIS的相邻图形方位计算,东南西北相邻计算

有一个场景,有一份地块表,需要计算每个地块的东南西北分别是哪个人的地块,允许有多个人。
数据示例

目前数据已经录入PostgreSQL数据库中,之前从没有想过这个问题,觉得地块方向都不是正南正北的,觉得不知从何下手,经过研究与测试,发现根据地块中心点计算方位角的计算结果,还是比较准备的。这里分享一下。

计算流程

┌─────────────────┐
│     开始        │
└────────┬────────┘│
┌────────▼────────┐
│ 前提条件检查    │
│ 1. 表含 geom 字段│
│ 2. 已装 PostGIS │
└────────┬────────┘│ (未满足则先执行 CREATE EXTENSION postgis)
┌────────▼────────┐
│ 数据准备        │
│ 1. 创建空间索引  │
│    (GIST 类型) │
│ 2. 计算地块中心点│
│    ST_Centroid(geom)│
└────────┬────────┘│
┌────────▼────────┐
│ 筛选相邻地块    │
│ 1. 排除自身     │
│    a.gid ≠ b.gid│
│ 2. 空间相交     │
│    ST_Intersects(a.geom, b.geom)│
│ 3. 交集为线     │
│    ST_Dimension(交集) = 1│
└────────┬────────┘│
┌────────▼────────┐
│ 计算方位角      │
│ ST_Azimuth(中心点A, 中心点B) × 180/PI()│
└────────┬────────┘│
┌────────▼─────────────────────────────────────┐
│ 判断方向(按角度范围匹配)                    │
├───────────────┬───────────────┬──────────────┤
│ 0°±30°/360°±45°│ 90°±45°       │ 180°±45°     │
│ → 北侧(north)  │ → 东侧(east)  │ → 南侧(south)│
├───────────────┼───────────────┼──────────────┤
│ 270°±45°       │ 其他角度      │              │
│ → 西侧(west)   │ → 排除        │              │
└────────┬───────┴───────────────┴──────────────┘││
┌────────▼────────┐
│ 优化结果表      │
│ 创建索引        │
│ (如 source_gid + direction)│
└────────┬────────┘│
┌────────▼────────┐
│     结束        │
└─────────────────┘

计算代码

create table xice as WITH center AS (-- 计算每个地块的中心点(用于方向判断)SELECTobjectid as gid,  -- 假设gid为地块唯一标识shape as geom,ST_Centroid(shape) AS centroid  -- 中心点坐标FROM "我的表"
)SELECTa.gid AS origin,b.gid AS xi,-- 可添加距离等辅助信息ST_Distance(a.centroid, b.centroid) AS 中心距离,CASEWHEN ST_Azimuth(a.centroid, b.centroid) * 180 / PI() BETWEEN 315 AND 360 OR ST_Azimuth(a.centroid, b.centroid) * 180 / PI() BETWEEN 0 AND 45 THEN 'north'  -- 北WHEN ST_Azimuth(a.centroid, b.centroid) * 180 / PI() BETWEEN 45 AND 135 THEN 'east'  -- 东WHEN ST_Azimuth(a.centroid, b.centroid) * 180 / PI() BETWEEN 135 AND 225 THEN 'south'  -- 南WHEN ST_Azimuth(a.centroid, b.centroid) * 180 / PI() BETWEEN 225 AND 315 THEN 'west'  -- 西ELSE 'other'  -- 其他方向(如对角线)END AS direction
FROM center a
JOIN center b ONa.gid <> b.gid  -- 排除自身AND ST_Intersects(a.geom, b.geom)  -- 两地块空间相交AND ST_Dimension(ST_Intersection(a.geom, b.geom)) = 1  -- 交集为线(确保相邻而非点接触)
ORDER BY a.gid, 中心距离;
-- 更新西字段
update "我的表" a set dkxz=(select string_agg(nhmc,',') from "我的表" where objectid in   (SELECT xi from xice where xice.origin=a.objectid and direction='west'));
-- 更新东字段
update "我的表" a set dkdz=(select string_agg(nhmc,',') from "我的表" where objectid in   (SELECT xi from xice where xice.origin=a.objectid and direction='east'));
-- 更新南字段
update "我的表" a set dknz=(select string_agg(nhmc,',') from "我的表" where objectid in   (SELECT xi from xice where xice.origin=a.objectid and direction='south'));
-- 更新北字段
update "我的表" a set dkbz=(select string_agg(nhmc,',') from "我的表" where objectid in   (SELECT xi from xice where xice.origin=a.objectid and direction='north'));

核心方法

主要是利用PostGIS的ST_Azimuth函数计算方位角

(0°/360°)|
西 (270°) ← — — → 东 (90°)|↓南 (180°)示例:
- 若 pointB 在 pointA 的正东方 → 方位角=90°
- 若 pointB 在 pointA 的西南方 → 方位角=225°(180°+45°)
- 若 pointB 在 pointA 的东北方 → 方位角=45°

注意

  • sql需要根据自己的表结构进行调整
  • 两个图形不相邻,有间隔的话,用上面的sql是无法计算的,需要调整
  • 大量数据时,计算较慢
http://www.dtcms.com/a/479310.html

相关文章:

  • FPGA强化-串口RS485
  • 2025深圳国际传感器技术与应用展览会效果如何,有啥亮点?
  • 房产交易网站建设策划案微信网站开发技术
  • 网站域名续费怎么做网站 配色方案
  • LSTM自然语言处理情感分析项目(三)定义模型结构与模型训练评估测试
  • STM32MP1开发流程
  • 利用小偷程序做网站中国工程建设交易信息网站
  • 上海做网站公司qinmoo企业网站推广可以选择哪些方法
  • 怎么配置网站服务器网站联盟名词解释
  • 做网站需要学啥中国网站用Cn域名
  • 企业网站优化推广方法个人性质的网站
  • 美食网站建设宠物网站项目
  • 青岛做网站服务商活动网页怎么做
  • Rokid YodaOS-Master 空间渲染技术深度解析:双目立体显示与光照模拟的实现逻辑
  • ups国际快递网站建设小说网站的网编具体做哪些工作
  • 英孚教育Write Spark青少儿创新写作征集活动正式启动
  • 润商网站建设服务抖音带运营3种合作方式
  • GESP等级认证C++三级17-位运算5-2
  • 济南做网站的公司成都市建设二维码检测网站
  • 基于MATLAB的FY-3B MWRI数据处理
  • 2025年优化算法:多策略改进蛇优化算法( Improved Snake Optimizer,ISO)
  • 苹果软件混淆与 iOS 应用加固白皮书,IPA 文件加密、反编译防护与无源码混淆方案全解析
  • wordpress 建网站视频深圳网络推广
  • 做购物网站支付需要怎么做关于建筑工程的网站
  • 网站做多长时间才会逐渐成功网站定制开发一般多久
  • AgentLightning框架(1)
  • python-调整图层
  • 盐城手机网站制作昆明个人网站建设平台
  • Docker 资源限制总结
  • python中的works的工作原理