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

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言

地理信息系统(GIS)在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色,但开发人员往往需要一个抽象层来简化与这些数据库的交互。这就是强大的 Python SQL 工具包和对象关系映射(ORM)库 SQLAlchemy 的用武之地。

本文将探讨 SQLAlchemy 在 GIS 中的作用、与空间数据库的集成以及如何简化地理空间应用程序开发。

用于 GIS 的 SQLAlchemy 的主要功能

数据库抽象 SQLAlchemy 提供了与各种数据库交互的一致接口,包括具有空间扩展功能的数据库(如 PostgreSQL 的 PostGIS、SQLite 的 SpatiaLite)。

用于空间数据的 ORM SQLAlchemy 的 ORM 通过将数据库记录映射到 Python 对象,简化了空间表的工作,从而使地理空间数据的操作更加容易。

支持空间查询 结合 GeoAlchemy2 等库,SQLAlchemy 可以处理空间数据类型并执行空间查询,如交叉、距离计算和边界框搜索。

可扩展性 SQLAlchemy 支持自定义数据类型,可无缝集成几何体、点、多边形和 LineString 等空间数据类型。

在 GIS 中使用 SQLAlchemy 的工作流程示例

1.设置环境

pip install sqlalchemy psycopg2 geoalchemy2

下面是一个定义 LandParcel 模型的示例,该模型将空间数据存储在支持 PostGIS 的 PostgreSQL 数据库中:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from geoalchemy2 import Geometry

Base = declarative_base()

class LandParcel(Base):
    __tablename__ = 'land_parcels'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    geom = Column(Geometry('POLYGON'))

# Database connection
engine = create_engine('postgresql://user:password@localhost:5432/gis_db')
Base.metadata.create_all(engine)

3.插入空间数据

在数据库中插入一个新地块:       

from sqlalchemy.orm import sessionmaker
from shapely.geometry import Polygon
from geoalchemy2.shape import from_shape

Session = sessionmaker(bind=engine)
session = Session()

polygon = Polygon([(-73.997, 40.748), (-73.994, 40.748), (-73.994, 40.745), (-73.997, 40.745), (-73.997, 40.748)])
land_parcel = LandParcel(name='Parcel 1', geom=from_shape(polygon, srid=4326))

session.add(land_parcel)
session.commit()

4.执行空间查询

执行空间查询,查找与给定几何图形相交的所有地块:

from geoalchemy2.functions import ST_Intersects
from sqlalchemy import select

query = select(LandParcel).where(ST_Intersects(LandParcel.geom, 'SRID=4326;POLYGON((-73.996 40.749, -73.993 40.749, -73.993 40.746, -73.996 40.746, -73.996 40.749))'))
result = session.execute(query)

for parcel in result:
    print(parcel.name)

SQLAlchemy 与其他 GIS 工具的比较

在 GIS 中使用 SQLAlchemy 的好处

简化开发 SQLAlchemy 抽象了复杂的 SQL,使空间数据库的交互变得更容易。跨数据库兼容性 无需担心特定数据库的语法或实施细节,即可开发 GIS 应用程序。高效的空间查询 利用 GeoAlchemy2 的空间功能,以最小的工作量执行复杂的空间查询。可扩展性 SQLAlchemy 可在生产环境中处理大规模地理空间数据和复杂操作。


http://www.kler.cn/a/517593.html

相关文章:

  • PAT甲级-1024 Palindromic Number
  • mysql 学习6 DML语句,对数据库中的表进行 增 删 改 操作
  • centos操作系统上以service形式运行blackbox_exporter监控网页端口
  • 网络编程-网络原理HTTP1
  • YOLOv10-1.1部分代码阅读笔记-val.py
  • 【0x03】HCI_Connection_Complete事件详解
  • Android实训九 数据存储和访问
  • 设计模式-建造者模式、原型模式
  • 云计算如何与物联网(IoT)结合?
  • Macos交叉编译android的cmix压缩算法
  • 「 机器人 」“控制权”在扑翼飞行器中的重要性及其优化挑战
  • LeetCode#238. 除自身以外数组的乘积
  • 无人机在城市执法监管中的应用:技术革新与监管挑战
  • ThreeJs常用模块封装——加载进度条
  • uniapp使用uni.navigateBack返回页面时携带参数到上个页面
  • Tauri2+Leptos开发桌面应用--绘制图形、制作GIF动画和mp4视频
  • Rust 中的方法与关联函数详解
  • MyBatis最佳实践:动态 SQL
  • ANSYS SimAI
  • leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先
  • 为AI聊天工具添加一个知识系统 之68 详细设计 之9 三种中台和时间度量
  • web前端三大主流框架对比,Angular和React和Vue的区别
  • 【Elasticsearch】如何重新启动_reindex任务?
  • Flutter 与 React 前端框架对比:深入分析与实战示例
  • electron打包客户端在rk3588上支持h265硬解
  • AcWing 3585:三角形的边 ← sort() 函数