🌕GIS的生态位
GIS是一个集 空间数据存储管理 、空间数据分析决策 、空间数据可视化 的综合系统。 GISer的核心价值在于知道如何根据数据的特点和地理环境选择和调整分析工具,而不是简单的调包侠。
我特意强调了空间数据的地位。数据是一切的基础,而GISer面对的是空间数据,不是普通的数据(否则和计算机专业没有任何区别)------这是因为空间数据作为区域化变量,其数据结构、表示方法、存储管理、坐标系与投影、空间统计学与经典数理统计的差异,所具备的数值特性如空间相关性、空间异质性、空间结构相似性(分别是地理学第一二三定律)等,这一切地学基础使得空间数据衍生出了自己的分析处理方法。为了在信息化的今天,挖掘出空间数据最大的潜力以创造价值,因此需要一群同时拥有地学基础与信息化能力的人士,GIS诞生了。
现在网上对GIS的就业前景普遍是趁早转码,仿佛GISer以后的出路除了做最基本的数据处理,就是跟计算机专业的抢饭吃,但是GISer的核心竞争力从来不是编程能力或算法实现,而在于对空间数据的深度理解 。即便很多工具或包能提供现成的分析方法,但理解何时使用这些工具 、如何调整参数 、以及数据背后的空间特性才是GIS开发人员与一般程序员最大的区别。以"有手就行"的空间插值为例,确实算法是现成封装好的,大家都会调个包插值。但是什么时候调IDW,什么时候用RBF,什么时候需要Kriging,怎么针对手中的数据与当地的地理条件进行参数的设置。假设你听别人说Kriging是BLUE(无偏最优估计)的,所以你选择了Kringing,那么手里的数据你了解吗?这些数据遵循区域化变量的随机性和结构性么?在使用克里金的时候有没有考虑它符合正态分布么?需要先进行全局趋势去除么?选择普通克里金、泛克里金还是协同克里金?什么是本征假设和二阶平稳假设?均值漂移又是什么?半变异函数模怎么建立,基台值块金值变程又代表了什么? 没错,这仅仅是一个空间插值而已,当然你如果作为只会进行数据处理与制图GISer,那你确实有极大的被取代的风险。
2024-10-17-周日凌晨1:00🌛
🌕GIS的立足根本---空间数据
空间数据是对现实世界的抽象表示,可理解为一种包含了位置、形状、关系、属性 的一种数据结构。简单的数据类型如布尔浮点是无法表示出空间对象的。首先说位置,空间数据不仅是靠坐标表示位置,且这种位置是建立在坐标系上的,同一组坐标在不同的参考系统中可能表示完全不同的位置。再看形状,一个湖泊可能由数百个坐标点共同组成;一幢大楼不仅仅有二维平面占地,还有高度,甚至包含时间维以展示建造过程,这种多维度特征与基本数据类型的一维形成鲜明对比。
拓扑
拓扑关系是空间数据之所以能进行空间分析的核心。矢量的拓扑关系是显式 的,通常用额外的数据结构如拓扑表记录,一个拓扑表可以记录每个多边形的边界线段,以及这些线段如何连接形成多边形,大多数复杂的空间分析都基于矢量的。与矢量不同,栅格数据的拓扑关系是隐式的,是基于像素的位置和值,也可以进行某些类型的拓扑分析,如邻域分析,例如要确定两个像素是否相邻,可以通过检查它们的坐标位置来判断,确定区域的连通性就可以通过连通域分析算法来实现。
拓扑关系能做什么?
- 1、数据完整:可确保多边形不重叠,线段相连等
- 2、高效查询:提高空间查询的效率。例如直接找出所有相邻的区域。
- 3、空间分析:很多高级空间分析操作都基于拓扑关系,如网络分析、流向分析等。
- 4、数据压缩:拓扑结构允许更高效的数据存储,因为共享边界只需存储一次。
- 5、数字孪生:在城市路网建模时,需要明确哪些道路是相连,哪些是相交的。
- 这里仅是绘制了一个简单的空间关系图,感兴趣的搜索关键词:九交模型
graph TD A[相等Equals] --- B[不相交Disjoint] A --- C[相交Intersects] C --- D[接触Touches] C --- E[跨越Crosses] C --- F[内含Within] C --- G[包含Contains] C --- H[重叠Overlaps]
🌕空间数据的管理
空间数据库的拓展功能
普通的RDBMS可以存储坐标数据,但无法直接进行空间操作和分析。空间数据库是数据库在地理领域的延伸,它仍是基于普通数据库的表&行形式,但进行如下扩展:
- 增加数据类型:空间数据库支持直接存储和操作几何对象。
- 增加功能函数:空间数据库提供了大量专门的函数来处理空间关系和进行空间分析。
- 增加空间索引:空间数据库使用特殊的索引结构和算法来优化空间查询。
空间数据库对比传统数据库的建表
以存储POI为例比较这两种数据库的存储方式,再进行一个简单的查询。
sql
一、普通关系型数据库的建表存储POI
CREATE TABLE poi (
id INT PRIMARY KEY, -- 主键,唯一标识每一个地点
name VARCHAR(100), --地名,限制为最多100个字符
latitude FLOAT, --浮点型存储纬度
longitude FLOAT, --浮点型存储精度
type VARCHAR(50)
);
| id | name | latitude| longitude | type |
=====================================
| 1 | 汇金中心| 40.7829 | -73.9654 | 写字楼 |
| 2 | 凤凰世嘉 | 40.7484 | -73.9857 | 大型商圈 |
| 3 | 利群广场 | 40.7580 | -73.9855 | 商超广场 |
二、空间数据库的建表存储POI
--latitude FLOAT,
--longitude FLOAT,
--替换为↓
location GEOMETRY(POINT, 4326),
| id | name | location | type |
===========================================
| 1 | 汇金中心 | POINT(-73.9654 40.7829) | 写字楼 |
| 2 | 凤凰世嘉 | POINT(-73.9857 40.7484) | 大型商圈 |
| 3 | 利群广场 | POINT(-73.9855 40.7580) | 商超广场|
===========================================
普通数据库与空间数据库在查询POI的对比
sql
一、普通数据库的查询(纯纯的数值范围)
SELECT * FROM poi
WHERE latitude BETWEEN 40.70 AND 40.80
AND longitude BETWEEN -74.00 AND -73.95;
二、空间数据库的查询 (空间查询)
SELECT * FROM poi
WHERE ST_Within(location,
ST_MakeEnvelope(-74.00, 40.70, -73.95, 40.80, 4326)
);
-- ST_MakeEnvelope()函数直接创建了一个矩形框范围,4326是WGS84
可见传统数据库虽然能通过普通的列来存储纬度和经度信息,但无法认识到这些位置信息作为一个整体对象,数据只是孤立的普通数据,可以按照基本数据的方式在这些列上创建普通索引,但在进行涉及坐标范围比较的查询时效率低。空间数据库则使用特殊的几何类型GEOMETRY来存储点位信息,并且数据库能够将一组坐标视为组成单个对象的一部分。
sql1.创建新表 🍖GEOMETRY(点、线、面)🍖 CREATE TABLE poi (id INT, location GEOMETRY(POINT)); ------------------------------------------------------------------ 2. 创建空间索引 🍖GIST()🍖 一种多维索引,支持R树等索引结构 CREATE INDEX idx_location ON poi USING GIST (location); ------------------------------------------------------------------ 3. 空间关系判断 🍖ST_拓扑关系()🍖, SELECT * FROM areas WHERE ST_Intersects(geom, 'POINT(0 0)'); SELECT * FROM areas WHERE ST_Contains(geom, 'POINT(1 1)'); ------------------------------------------------------------------ 4. 空间测量 🍖ST_计算几何()🍖 SELECT ST_Distance(a.geom, b.geom) FROM a, b; SELECT ST_Area(geom) FROM polygons; SELECT ST_Length(geom) FROM lines; ------------------------------------------------------------------ 5. 空间构造 🍖ST_MakePoint()🍖 INSERT INTO poi (location) VALUES (ST_MakePoint(0, 0)); ------------------------------------------------------------------ 6. 坐标转换 🍖ST_Transform()🍖 SELECT ST_Transform(geom, 4326) FROM spatial_table; ------------------------------------------------------------------ 7. 空间分析 SELECT * FROM poi ORDER BY location <-> 'POINT(0 0)' LIMIT 5; 最近邻分析 SELECT ST_Union(geom) FROM polygons; 聚合 SELECT ST_Buffer(geom, 50) FROM lines; 缓冲区 SELECT * FROM pgr_dijkstra('SELECT id, source, target, cost FROM edges',1, 5); 迪杰斯特拉 8. 栅格操作 🍖ST_MapAlgebra()栅格代数运算 🍖 SELECT ST_MapAlgebra(rast1, rast2, '[rast1] + [rast2]');
虽然PostGIS扩展了SQL的功能,使其能够处理空间数据,但它的核心仍然是数据管理和查询。 --适合进行基础的空间分析,如缓冲区、最近邻分析、空间交集等。 --对于MGWR、莫兰指数、插值等高级空间统计分析,通常需要专业的GIS软件或外部工具来实现。
空间数据库对比传统数据库表格
特征 空间数据类型 基本数据类型 空间数据库 关系型数据库 维度 多维 一维 - - 结构 复杂(多点组成) 单一值 - - 表示 几何(点线面体) 数值&字符 - - 运算 涉及空间运算 (如相交、包含) 算术运算 逻辑运算 - - 索引 - - 空间索引 (R树、四叉树、网格) B树、哈希索引等 坐标系 需要 - 内置多种坐标系统和投影 - 拓扑关系 支持 - 能够存储对象间的拓扑关系 - 空间查询 - - 支持空间查询 - 空间分析 - - 支持空间分析 - 查询语言 - - 扩展的SQL SQL 数据格式 - - 支持各种空间数据格式 (如shp、GeoJSON) CSV、XML等通用格式
有哪些形式的空间数据库
数据库厂家自行拓展
开源] ORA --> ORASP[Oracle Spatial and Graph
企业级] MSSQL --> SQLSP[SQL Server Spatial
企业级] MYSQL --> MYSP[MySQL Spatial
轻量级] Apache --> aaa[GeoSpark
大数据\分布式]
Esri推出的拓展插件
ArcSDE for SQL Server ; ArcSDE for PostgreSQL ; ArcSDE for Oracle。SDE (Spatial Database Engine)是ArcGIS软件和各种关系型数据库之间的中间层 ,提供了统一的接口规范,使ArcGIS能够与不同的数据库系统交互。但SDE可是叫:"空间数据引擎 ",如果仅把它当做是协议接口就小瞧它了,它能把普通数据库直接变为空间数据库 。原理是在原本的数据库中创建额外的表 来存储空间数据的元数据、坐标系、存储点、线、多边形等几何对象 ,并提供空间操作函数 与空间索引,支持ArcGIS的各种工具和功能,同时也提供了API和SDK,允许开发者扩展和定制空间数据处理功能。