PostGIS

一、PostGIS是什么,有什么用?

        PostGIS 是 PostgreSQL 数据库的开源地理空间扩展,通过为 PostgreSQL 增加地理空间数据类型、索引、函数和操作符,使其成为功能强大的空间数据库,广泛应用于 GIS(地理信息系统)、位置服务(LBS)、物流调度等需要处理地理空间数据的场景。


二、核心定位与发展背景

起源:2001 年由 Refractions Research 公司发起,2004 年成为开源项目(遵循 GPL 协议),目前由全球社区维护(最新长期支持版为 3.3.x)。
定位:填补 PostgreSQL 在地理空间数据存储与分析上的空白,提供与商业空间数据库(如 Oracle Spatial)同等的能力,但保持开源免费。
生态:与 GDAL(地理数据转换工具)、QGIS(开源 GIS 客户端)、GeoServer(地图发布服务)等主流 GIS 工具深度集成,是开源 GIS 技术栈的核心组件。


三、核心功能与技术细节

1. 空间数据类型

(1)几何类型(Geometry)
        几何类型是 PostGIS 最基础的空间数据类型,用于表示 平面坐标系(投影坐标系) 中的几何对象,支持二维(2D)和三维(3D)数据。
常见子类型:

类型描述示例 WKT(Well-Known Text)

POINT

单个坐标点(如商铺、基站、采样点)

POINT(116.4 39.9)
2D 点,x=116.4(经度),y=39.9(纬度)

LINESTRING

由多个点组成的线(如道路、河流、管线)

LINESTRING(0 0, 1 1, 2 2)
由三个点 (0,0)→(1,1)→(2,2) 连接成的斜线

POLYGON

闭合的多边形(含外环和内环,如行政区域、湖泊、建筑物轮廓)

POLYGON((0 0, 0 1, 1 1, 0 0))
(0,0)→(0,1)→(1,1)→(0,0)(最后一个点与第一个点重合,闭合)

MULTIPOINT

多个点组成的集合(如同一区域内的多个商铺、多个采样点)

MULTIPOINT((0 0), (1 1))

两个独立点,分别位于 (0,0) 和 (1,1),无任何空间关联

MULTILINESTRING

多条线的集合(如同一区域内的多条道路、多条河流)

MULTILINESTRING((0 0,1 1),(2 2,3 3))

第一条线:(0,0)→(1,1)(斜线);

第二条线:(2,2)→(3,3)(与第一条线平行的斜线)

MULTIPOLYGON

多个多边形的集合(如同一国家内的多个省份、同一区域内的多个湖泊)

MULTIPOLYGON(((0 0,0 1,1 1,0 0)),((2 2,2 3,3 3,2 2)))

第一个正方形:左下角 (0,0),右上角 (1,1);

第二个正方形:左下角 (2,2),右上角 (3,3);

两个正方形无重叠,属于同一多多边形集合。

GEOMETRYCOLLECTION

混合几何对象的集合

GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(2 2,3 3))

一个点(位于 (1,1))和一条线(由 (2,2)→(3,3) 组成),两者无空间关联

(2)地理类型(Geography)

        地理类型基于 球体模型(WGS84 坐标系),适用于大范围地理计算(如全球距离、面积),直接使用经纬度坐标(单位:度)。与几何类型的区别

特性GeometryGeography
坐标系平面坐标系(投影坐标系)球面坐标系(WGS84)
计算方式欧几里得几何(平面距离)测地线(球面距离)
适用场景局部区域(城市、国家)全球范围(跨国、跨洲)

(3) 栅格类型(Raster)

        用于存储 栅格数据(如卫星影像、DEM 数字高程模型),支持波段操作和像素级分析。核心操作

  • 波段读取:获取栅格的像素值。

  • 重采样:调整栅格分辨率。

  • 地图代数:对多个栅格进行数学运算。

(4)三维几何类型(3D Geometry)

在几何类型基础上添加 Z(高程) 或 M(度量值,如时间、温度) 维度,​​​支持高程或三维建模,满足更复杂的场景需求:

类型名称定义示例(WKT 格式)
POINT Z三维点(x,y,z)POINT Z(121.47 31.23 10.5)(经纬度 + 海拔 10.5 米)
LINESTRING M带度量值的线(x,y,m)LINESTRING M(0 0 0, 1 0 10, 1 1 20)(路径 + 累积距离 0→10→20 米)
POLYGON ZM三维 + 度量值的面(x,y,z,m)POLYGON ZM((0 0 0 0, 2 0 0 10, 2 2 0 20, 0 2 0 30, 0 0 0 0))(面 + 高度 + 度量)

(5)空间参考标识(SRID)

每个空间数据必须关联 SRID(Spatial Reference System Identifier),定义坐标系规则。常用 SRID:

  • 4326:WGS84 经纬度(地理坐标系)。

  • 3857:Web Mercator(投影坐标系,用于谷歌地图)。

2. 坐标参考系统(CRS)支持

PostGIS 通过 spatial_ref_sys 表存储全球主流坐标系(如 EPSG:4326 为 WGS84 经纬度,EPSG:3857 为 Web 墨卡托投影),确保数据在不同坐标系间的转换和分析。

示例:将经纬度(EPSG:4326)转换为平面坐标(EPSG:3857):

sql

SELECT ST_Transform(ST_GeomFromText('POINT(121.47 31.23)', 4326), 3857);

        如想了解常见投影坐标系 EPSG可以滑动到最下面

3. 空间索引

PostGIS 支持高效的空间索引(基于 GiST 或 SP-GiST 树结构),加速空间查询(如范围查询、相交判断):

  • GiST 索引:默认空间索引类型,适用于几何 / 地理类型,支持 &&(包围盒相交)、ST_Intersects(几何相交)等操作符。
  • SP-GiST 索引:针对大规模数据优化的索引(PostGIS 2.2+ 支持),减少索引存储和查询时间(尤其适用于面数据)。

示例:为 city 表的 geom 列创建 GiST 索引:

sql

CREATE INDEX idx_city_geom ON city USING GIST (geom);

4. 空间函数与操作符

PostGIS 提供数百个空间函数,覆盖几何运算、空间关系判断、测量计算等场景:

功能分类典型函数 / 操作符示例
几何创建ST_GeomFromText(WKT 转几何)、ST_GeomFromGeoJSON(GeoJSON 转几何)ST_GeomFromText('LINESTRING(0 0,1 1)', 4326)(创建线对象)
空间关系ST_Intersects(相交)、ST_Contains(包含)、ST_DWithin(距离范围内)SELECT * FROM stores WHERE ST_DWithin(geom, ST_MakePoint(121,31), 1000)(查询 1000 米内的商店)
几何运算ST_Buffer(缓冲区)、ST_Union(合并)、ST_Intersection(交集)ST_Buffer(ST_MakePoint(121,31), 0.1)(创建半径 0.1 度的缓冲区)
测量计算ST_Distance(距离)、ST_Area(面积)、ST_Length(长度)ST_Distance(geom1, geom2, true)(计算球面距离,单位米)
拓扑分析ST_Touches(邻接)、ST_Crosses(交叉)、ST_Within(包含于)SELECT * FROM regions WHERE ST_Within(city.geom, regions.geom)(查询城市所在的区域)

5. 栅格数据支持(PostGIS Raster)

PostGIS 扩展模块 postgis_raster 支持存储和分析栅格数据(如卫星影像、DEM 数字高程模型),可与矢量数据联动分析:

  • 栅格类型:raster,支持多波段存储(如红、绿、蓝、近红外波段)。
  • 功能示例:栅格裁剪(ST_Clip)、波段统计(ST_BandStatistics)、栅格转矢量(ST_AsTiles)。

6. 拓扑数据模型(PostGIS Topology)

扩展模块 postgis_topology 提供拓扑数据模型,用于管理要素间的严格邻接关系(如行政区划边界共享、管网连接):

  • 支持创建拓扑层(topology),自动维护面、边、节点的关联关系(如修改一条边会同步更新相邻面的边界)。

常见投影坐标系 EPSG 代码表

        以下为广泛使用的投影坐标系及其核心参数:

EPSG 代码坐标系名称投影类型适用区域单位典型用途
3857WGS 84 / Pseudo-MercatorWeb Mercator全球在线地图(Google Maps, OpenStreetMap)
4326WGS 84地理坐标系(非投影)全球GPS 数据、原始经纬度存储
32633WGS 84 / UTM zone 33N横轴墨卡托 (UTM)北半球(经度 12°E–18°E)欧洲局部地图、工程测量
32649WGS 84 / UTM zone 49N横轴墨卡托 (UTM)北半球(经度 108°E–114°E)中国东部地区
26910NAD83 / UTM zone 10N横轴墨卡托 (UTM)北美西海岸(-126°W–-120°W)美国、加拿大区域地图
2278NAD83 / Texas Centric Albers阿尔伯斯等积圆锥美国得克萨斯州区域等面积分析
27700OSGB36 / British National Grid横轴墨卡托英国英国地形图、城市规划
3035ETRS89 / LAEA Europe兰勃特等积方位欧洲欧盟统计、跨区域分析
《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值