PostGIS实战

本文详细介绍了PostGIS实战,包括空间数据库基础、矢量数据库使用和与其他GIS软件的协同。讲解了如ST_Centroid、ST_Area等图形函数以及栅格处理函数,探讨了geography与geometry的区别,并阐述了空间查询和空间分析的重要性。此外,还分享了PostGIS的安装与使用,以及如何在数据库中创建空间索引。

作者: 蕾吉娜,毕业于麻省理工学院,PostGIS指导委员会、PostGIS核心开发团队的成员。

PostGIS实战分三个部分,13个章节,总页数491页,逻辑清晰,实战性强。

第一部分结合PostGIS,介绍空间数据库基本概念,涵盖空间数据库,PostGIS与Postgres之间的关系、空间数据类型,空间数据组织、图形函数,图形关系、空间坐标参考、矢量数据如何导入和导出等;

第二部分主要介绍矢量数据库使用,涵盖空间邻近分析,属性数据创建,图形数据创建,坐标变换,空间查询数据创建和空间索引、SQL、图形等PostGIS数据库性能优化。

第三部分介绍PostGIS与其他GIS软件的协同、webGIS中如何使用PostGIS以及PostGIS栅格数据库的使用,涵盖PostGIS与MapServer、GeoServer、OpenLayers、Cadcorp SIS、OpenJUMP、QGIS、uDig、gvSIG等软件的使用,PostGIS栅格数据库创建、栅格表和函数、栅格数据导入和导出、栅格数据与矢量数据综合分析等。

附件ABC列出了很多的GIS软件、资源与技术方法,PostGIS安装、编译与升级、SQL primer、PostgreSQL features和POSTGIS相关的空间分析函数。(本人倒是更喜欢这个)

一些想法

geography  vs  geometry

geography字典翻译为地理,地形, geometry字典翻译为几何、几何形状。其实geometry是个音译词,翻译为图形更加合适,几何,多少的意思,这个词本身很难让人联想到实体的形状,还有如拓扑(topology)这个词,也很难让人联想到图形关系的词义,geography与geometry同根,几何学源于地理学。在空间计算中,geography计算更加偏向于非惯性曲面计算,也就是黎曼几何,geometry更加偏向于惯性平面直角计算,也就是欧式几何。而由此衍生的距离计算却是眼花缭乱的:欧式距离、曼哈顿距离、切比雪夫距离、大圆距离等,不同距离的计算完全是为了适应不同的场景需要。在postgis中,geography 被描述地理椭球,或者说地理坐标,而 geometry被描述为平面投影,或者说笛卡尔坐标。

地理图形 vs 图形

现行的计算机图形学似乎不关心点是否在线段上,线与线是否相交,面与面是否包含、体与体是否相离等基本图形关系,它更多关注的是如何把一个茶壶的曲面更好地在显卡上渲染展示出来。在空间计算中,点、线、面、体的图形关系非常重要,甚至是基础的,这些看似简单的图形关系判断,有的在计算机中实现起来却又非常复杂(可以参看CGAL中的源码),如爆炸范围、汇水域、碰撞检测、可视距离等就是这些图形关系的具体应用。但是地理图形必须转化为图形对象数据,才能被计算机识别和存储。

### 关于PostGIS的实际应用案例 PostGIS 是 PostgreSQL 的一个扩展,用于存储和操作地理空间数据。它提供了丰富的函数库来支持复杂的地理空间分析任务[^1]。 #### 使用 PostGIS 进行地理空间数据分析的基础方法 为了更好地理解如何利用 PostGIS 处理地理空间数据,可以参考以下基本流程: 1. **安装与配置** 首先,在 PostgreSQL 数据库中启用 PostGIS 扩展。可以通过运行以下 SQL 命令完成: ```sql CREATE EXTENSION postgis; ``` 2. **导入地理空间数据** 可以通过 `shp2pgsql` 工具将 Shapefile 文件转换为 SQL 脚本并加载到数据库中。例如: ```bash shp2pgsql -s 4326 -I /path/to/file.shp schema_name.table_name | psql -d your_database ``` 上述命令中的 `-s 4326` 表示指定坐标系 EPSG:4326 (WGS84)[^1]。 3. **执行地理空间查询** 利用 PostGIS 提供的功能进行空间查询。例如,查找距离某个点一定范围内的其他点: ```sql SELECT * FROM points_table WHERE ST_DWithin(geometry_column, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326), distance); ``` 4. **可视化结果** 结果可通过 GIS 客户端工具(如 QGIS 或 GeoServer)展示出来。 --- ### 实际应用案例 以下是几个常见的实际应用场景及其解决方案: 1. **城市规划与土地管理** 政府部门常使用 PostGIS 来管理和分析土地用途、建筑密度以及交通流量等信息。例如,计算某区域内建筑物总面积: ```sql SELECT SUM(ST_Area(building_polygon)) AS total_area FROM buildings WHERE city_id = 'specific_city'; ``` 2. **物流配送路径优化** 物流公司可基于道路网络数据设计最优送货路线。这通常涉及 Dijkstra 或 A* 算法实现最短路径计算: ```sql SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra('SELECT gid AS id, source, target, length AS cost FROM ways', start_node, end_node, directed := false); ``` 3. **环境监测与灾害评估** 科学家们借助 PostGIS 分析气候变化对生态系统的影响或者预测洪水淹没区域。比如检测两个多边形之间的交集面积: ```sql SELECT ST_Area(ST_Intersection(polygon_a.geom, polygon_b.geom)) AS intersection_area FROM polygon_a JOIN polygon_b ON ST_Intersects(polygon_a.geom, polygon_b.geom); ``` --- ### 示例代码:计算两点间的大圆距离 假设有一个表名为 `locations`,其中包含两列分别是经度 (`longitude`) 和纬度 (`latitude`),下面是一个简单的例子演示如何计算任意两点间的球面距离: ```sql WITH point_data AS ( SELECT ST_Transform( ST_SetSRID( ST_MakePoint(longitude, latitude), 4326 ), 3857 -- Web Mercator projection ) AS geom FROM locations ) SELECT a.id AS from_id, b.id AS to_id, ROUND(CAST(ST_Distance(a.geom, b.geom) AS numeric), 2) AS distance_meters FROM point_data a CROSS JOIN point_data b WHERE a.id <> b.id AND ST_Distance(a.geom, b.geom) < max_distance_threshold; -- 自定义阈值 ``` 上述脚本会返回每一对不同地点之间的小于设定最大距离的结果,并将其单位设置为米。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值