在线阅读:https://www.osgeo.cn/pygis/index.html
1. 引言
- 1.1. GIS的概念
- 1.1.1. GIS的功能与应用
- GIS主要的功能是成图和空间分析。
- 1.1.2. GIS的发展历史
- 1967年, 世界上第一个真正投入应用的地理信息系统由联邦林业和农村发展部在加拿大安大略省的渥太华研发。 罗杰·汤姆林森博士开发的这个系统被称为加拿大地理信息系统(CGIS )。随着微型计算机的发展,GIS越来越普及。
- 1.1.3. GIS的发展趋势
- 随着云计算、物联网、移动终端等新技术的快速发展,未来的GIS将会是普适化的GIS,用户日益多样的需求将能够得以轻松解决。 未来的GIS将会是普适化的GIS,任何人都可以用,在任何的地方,通过任何的终端都可以访问GIS服务,而且不局限在专业的终端上, 让普通用户都可以通过多媒介进行访问。 这也得益于云计算技术、移动终端等方面的快速发展,让用户的更多需求都能够非常轻松的实现。 在普适化的环境之下,我们要做的是为大家创造一个GIS的环境,需要把我们的知识和经验用地图的方式来表达,让用户非常方便的获得地图数据。
- 1.1.4. 地理信息系统
- 从学术观点来看,人们对GIS有如下三种观点:地图观,数据库观,空间分析观。
- 1.1.5. 数据、信息与GIS
- GIS数据结构与文件格式 描述地理实体的数据本身的组织方法,称为内部数据结构。 空间数据结构是指适合于计算机系统存储、管理和处理的地学图形的逻辑结构, 是地理实体的空间排列方式和相互关系的抽象描述。 它是对数据的一种理解和解释,不说明数据结构的数据是毫无用处的, 不仅用户无法理解,计算机程序也不能正确的处理。 对同样的一组数据,按不同的数据结构去处理,得到的可能是截然不同的内容。 空间数据结构是地理信息系统沟通信息的桥梁, 只有充分理解地理信息系统所采用的特定数据结构,才能正确地使用系统。
- 1.1.6. 矢量数据架构
- 矢量数据利用了几何图形的点、线(一系列点坐标),或是面(形状决定于线)来表现客观对象。例如,在住房细分中以多边形来代表物产边界,以点来精确表示位置。矢量同样可以用来表示具有连续变化性的领域。利用等高线和不规则三角形格网(TIN)来表示海拔或其他连续变化的值。TIN的记录对于这些连接成一个由三角形构成的不规则网格的点进行评估。三角形所在的面代表地形表面。矢量数据模型用来描述使用点、线及多边形来表现的实体。
GRASS矢量数据模型包含了对拓扑的描述。 这样,除了坐标以外,还可以使用拓扑来描述点、线、边界及质心的位置。
尽管它们的空间关系已经存储了。一个拓扑的GIS需要使用这样的数据结构, 来使两个相邻接的区域的边界作为一条单独的线存储,简化地图的维护。
GRASS 6.0支持的矢量几何要素包括点、质点、线、边界、区域 (边界+质心), 表面(3D 区域),核心(3D质点),及立体(表面+核心)。 几何要素的存储是真3D:x, y, z,在2D情况下,z = 0。
拓扑学是数学的一个分支,它专门研究关系,这种关系不公因基本空间的弹性形变而发生改变。 比如,假定在一块橡胶垫板上绘制两个矩形,一个矩形包含另一个矩形,或者互相相邻, 当拉伸、扭曲或者挤压橡胶板的时候,这两个矩形之间的原来的关系不会改变。 考查我们说话的语言也可以看出大脑组织空间的方式:对物体描述起决定性的是它的形状。 另一方面,物体之间的空间关系是用介词来描述的,很少涉及关于形状的描述。 所以,我们可以用简单矩形来表示建筑物而不会影响原有的关系。
空间分类学涉及了多种可用来组织空间的描述方法, 其中包括拓扑的、网状的、方位的以及欧氏几何的。
数据模型是一条或一组用于标识和表示空间参照对象的规则。 一个湖泊可以表示成一个二维区域,一条河流可以表示为一条一维的曲线, 一口井可以表示成零维的点。这就是对象模型。 对象模型很适合表示有固定形状的空间实体,如湖泊、道路网和城市。 这种对象模型是概念化的,可以采用矢量数据结构将其映射到计算机中。 矢量数据结构将区域映射成多边形,线条映射为多线,点映射为点。
场模型通常用于表示连结的或无固定形状的概念,例如温度场或云区。 一个场就是一种函数,它将基本参照框架映射到一个属性域上。 在计算机中,场模型是有用栅格数据结构来实现的。 栅格数据结构把基本空间划分成均匀的网格。 由于场值在空间上是自相关的(它们是连续的), 所以每个栅格的值一般采用位于这个梅子内所有场点的平均值表示。 场的其他常用数据结构还有不规则三角网(TIN)、等高线和点网格。
- 1.1.7. 栅格数据结构
- 栅格(网格)数据由存放唯一值存储单元的行和列组成。它与栅格(网格)图像是类似的,除了使用合适的颜色之外,各个单元记录的数值也可能是一个分类组(例如土地使用状况)、一个连续的值(例如降雨量)或是当数据不是可用时记录的一个空值。栅格数据集的分辨率取决于地面单位的网格宽度。通常存储单元代表地面的方形区域,但也可以用来代表其它形状。栅格数据既可以用来代表一块区域,也可以用来表示一个实物。
GIS的栅格文件所代表的栅格图层,实际上是一种概念化的模型。 通常某一栅格图层的地图信息与一特定的主题相关 (如土壤结构、地面覆盖物、公路等)。
GRASS的栅格图表示的也是这种地图信息,它采用栅格矩阵的形式进行存储。 每个栅格大小相同,表示一块矩形(通常为正方形)区域。 每个栅格根据其区域内的主题特征赋予一个整数值,也就是GIS系统中通常所指的属性数据。
- 1.1.8. 地图投影和坐标系统
- 地图投影和坐标系统的内容请参考官网。
- 1.2. 开源空间信息软件体系与技术概述
- 1.2.1. 主要开源GIS软件
- 目前国际上著名的地理空间信息生产商大都拥有了成熟的产品线, 基本涵盖了从数据采集、数据编辑、数据管理、空间数据互操作、空间分析、 网络地理信息发布、空间数据库等所有地理信息工程相关的功能模块 。 而开源GIS则可能更多地侧重于某些功能,在使用开源GIS进行应用时, 可以应用很多项目来集成。
开源GIS软件最早的开发一半是基于某个商业GIS软件不支持的功能、特性及开放接口,因此不同开源GIS特点不一样, 也适用于不同的GIS应用需求和不同的开发环境。
开源 GIS 在仅仅20年时间里,产生了许多功能突出、性能优越和用户体验良好的软件, 从1982年第一个开源GIS 软件GRASS 发布截至到2008年12月中旬, 在地理空间信息开源界著名的 http://www.freegis.org 索引系统中 可以寻找到开源地理空间信息软件项目多达347个, 其中2008年新的开源GIS 软件达到97个, 占到开源GIS软件的 27% ,可见开源GIS软件的发展速度非常迅猛。
注意, http://www.freegis.org 这个网站目前已经不再维护了。
目前开源地理信息软件的体系架构已经非常清晰,每个项目都有特有的定位, 每个开源家族都有与商业软件对应的功能特性,可以实现绝大多数的功能。
在桌面领域,QGIS以及Dig项目完全可以满足普通制图和数据采集人员的需要, 完成对地理空间信息简单编辑、查询等功能, 可以取代价格昂贵的Arc GIS Desktop和Map Info Professional等。
在工作站以及服务器级, 由美国军方建筑工程研究实验室研发的GRASS完全可以充当科学家、 研究人员专业的操作工具, 复杂的空间分析算法以及栅格处理功能可以与ARC/INFO相媲美。 它是Unix平台的第一个GIS软件,同其他Unix软件一样, 吸引了多家 联邦机构、大学和公司的参与研发。 1988年,GRASS3.0软件包的发行达1000余个。 GRASS软件曾经三次获得美国联邦政府的有关奖项。
OSSIM(Open Source Soft Image)是一个用于遥感、 图像处理、地理信息系统、摄影测量领域的高性能软件。 作为一个成熟的开源软件库, 它的设计目的是为摄影测量与遥感软件包的开发人员提供一套整合的并且是最佳的方法及流程。 自1996年至今,由 https://www.ossim.org 进行该开源项目的维护, 现在隶属于地理空间开源基金会 http://www.osgeo.org 。 项目的开发人员拥有商业和政府遥感系统和应用软件领域多年的经验, 由美国多个情报、防务领域的政府部门提供资助。
下面列出了常用的开源GIS:
-
空间数据库: 基于PostgreSQL数据库的PostGIS, 带有地理目 标扩展的Ingres数据库。
-
GIS服务器:MapServer、GeoServer、Deegree
-
WebGIS:OpenLayer、MapGuide
-
元数据目录系统:GeoNetwork
-
GIS开发库:GeoTools、JTS、TerraLib、Proj.4(地图投影库)
-
桌面GIS:uDig、GRASS、OpenJump、Quantum GIS
-
遥感图像处理系统:OSSIM(Open Source Software Image Map)、GDAL (Geospatial Data Abstraction Library)、 OpenCV
-
三维地球:WorldWind、OSSIMPlanet、Earth3
-
- 1.2.2. 开源GIS使用语言的情况
- 开源GIS 软件的分类,按照开发语言,主要包括C 、C++、Python、Java、.NET、 JavaScript、PHP、VB、Delphi 等。 无论是采用哪种语言, 当前开源GIS软件都力求最大程度的支持跨平台,其中支持Windows的开源GIS软件为 67.7%, 82.7%的开源软件能够在Linux环境下运行, 这与Linux本身是一个开源的操作系统有关。
- 1.2.3. 开源GIS的国外应用现状
- 目前,开源GIS软件的主要用户是大学、科研机构和非政府组织。 同时,国内的GIS公司也开始举办开源GIS研发大赛,围绕着开源GIS软件的应用越来越多。 综合近年来国内外开源GIS软件的应用,可见,当前开源GIS的应用仍集中在大学、科研机构, 一些行业用户也主要利用开源GIS进行WebServer应用,开源WebGIS平台的应用较多,占开源GIS应用80%以上。 随着更多的行业用户对开源GIS的熟悉和认知以及开源GIS软件的进一步稳定可靠, 开源GIS的应用将会越来越多。
- 1.2.4. 开源GIS的特点
- 开源 GIS 优势不仅仅是免费,更在于其免费和开放的真正含义, 前者代表自由与免费,后者代表开放和扩展。 与商业GIS产品不同,由于开源 GIS 软件的免费和开放, 用户可以根据需要增加功能,当所有人都这样做的时候, 开源产品的性能与功能也就超过了很多商业产品, 因而也造就了开源的优势和活力。 此外,和一般的商业GIS 平台相比, 开源GIS产品大多都具有跨平台的能力, 可以运行于Linux、Windows等系统。 因此开源GIS 软件得到学术界和GIS 平台厂商越来越多的重视, 成为GIS 研究和应用创新的一个重要领域。
谈到开源GIS,不得不提到 GIS 的一些数据、接口标准。除了技术的发展,标准的兼容对于 GIS 的发展,尤其是开源 GIS 的发展起到了重要的促进作用。
开放地理联合会 (OGC)是一个参与一致进程以开发公开地理处理规格的384家公司、政府机构、大学和个人组成的国际行业联合会。 OpenGIS(Open Geodata Interoperation Specification,OGIS-开放的地理数据互操作规范)由 OGC 提出。由OpenGIS规格定义的开放接口和协议,支持可互操作的解决方案, 网络、无线和定位服务以及主流IT,让复杂的空间信息和服务在各种应用中可以被授权技术开发人员使用。 开放地理联合会协议包括网络地图服务WMS和网络功能服务WFS。
地理信息系统将OGC产品划分为两大类型,基于遵循OGC规格的完整准确的软件。地理信息系统技术标准促进GIS工具进行交流。 兼容的产品是符合OpenGIS规范的软件产品。 当一个产品经过测试,并通过 OGC 测试项目证明是兼容的, 这个产品就在这个地点上自动注册为“兼容”。 现实软件产品,即实现OpenGIS规格但还没有通过兼容测试的软件产品。 合规测试不可作用于所有的规格。 开发者可以注册他们的产品为实施草案或经核准的规范, 而OGC有权审查和确认每个条目。
GIS技术发展趋势是开放和互操作的,包括体系结构的开放、数据模型的开放以及开发者思想观念的开放。 开源GIS作为GIS研究的新热点,其趋势必将是集开放、集成、标准和互操作为一体,从软件向服务(Server Oriented Architecture,SOA)转变的方向发展。 通过开源GIS项目建设,可以减少GIS软件的开发周期,降低软件开发成本,提高软件开发效率,同时可以降低GIS平台软件使用成本,促进GIS社会化和大众化。 随着开源GIS项目越来越成熟,并且取得越来越多的应用,开源GIS软件目前已经形成了一个比较齐全的产品线,在一些特定的功能方面优于商业GIS平台软件。 尽管开源GIS软件在稳定性、实用性和功能全面方面存在欠缺, 但是其免费和开放的优势使得越来越多的企业、 科研机构和非政府组织投入到开源GIS软件的研究、开发和应用推广中, 开源GIS软件将成为理论教学、科学研究、中小企业GIS应用的一个最好选择,从而也将会有更好的发展。 - 1.2.5. 本书(本网站)介绍的开源GIS
- 开源GIS软件与程序众多,体系庞大,本书无法对其一一言明。 甚至于本书所关心的主题(Python与开源GIS), 也只能选择目前技术成熟与使用广泛的软件与类库来谈。 本书介绍使用Python这一编程语言来进行数据的处理。主要使用了下面的一些类库。
- 数据处理模块GDAL/OGR
- 投影处理:PROJ.4
- 栅格数据与矢量数据的空间分析
- 地图制图Mapnik
- 其他模块
- 1.3. 配置Python环境变量
- 1.3.1. Debian下的安装与配置
- 1.3.2. 基本类库的安装
- 1.3.3. 查看软件、类库的关系
- 1.3.4. 安装Python
- 1.3.5. 安装相关组件与类库
-
GDAL/OGR的安装
# aptitude install python3-gdal gdal-bin
PROJ.4的安装
# aptitude install python3-pyproj proj-bin
Shapely的安装
# aptitude install python3-shapely
Fiona的安装
# aptitude install fiona python3-fiona
SpatiaLite安装
aptitude install python-pyspatialite spatialite-bin
感谢 Linux 程序员们,感谢 Debian , 在 Debian 9中, 安装与使用 Mapnik 非常简单。
# aptitude install python3-mapnik bk@v:~$ python3 -c "import mapnik;print (mapnik.__file__)" /usr/lib/python3/dist-packages/mapnik/__init__.py
执行上述代码后应该返回Python绑定的目录并且不出现错误。 如果上述没有成功,请回去检查下Mapnik有没有成功安装。
- 1.3.6. 编辑器与开发环境
- 初学, 建议使用纯文本编辑器。Linux:Gvim, Emacs, Gedit. 选择一个就行。Windows:Gvim, Notepad++, Editplut, E Text Editor(Windows下的textmate), UltraEdit(商业软件)。Mac OS X:Gvim, 传说中的textmate(没用过)。
IDE,Linux:eclipse + pydev, Gvim + 相关插件。Windows: Eclipse + pydev, Gvim + 相关插件, IDLE(Python自带,外观简陋, 其实很强大), Ulipad(国内大牛开发)
PyCharm的配置与使用。一般情况下,如果不涉及 Web 开发,使用 PyCharm Community 版本完全可以满足要求。
- 1.4. Python基础用法
- 1.4.1. Python运行方式
- command命令行交互运行方式。不过一般不这么做。一般是写在文件中。然后再运行。
- 1.4.2. 代码结构、基本类型与保留字、运算符
- Python脚本文件的默认后缀为
.py
,Python 2中文件默认是ASCII编码。 如果文件中有中文的话,在显示时会做一个ASCII到系统默认编码的转换, 这时就会出错:SyntaxError: Non-ASCII character。 需要在代码文件的第一行或第二行添加编码指示:# -*- coding:utf-8 -*-
程序中的每个语句都是以换行符结束。 特别长的语句可以使用续行符()来分成几个短小的行, 如下例:
>>> import math
import math 导入数学模块。
>>> n,x,y = 2, 8, 9
n,x,y = 2, 8, 9 分别给n,x,y赋值。
>>> a = (math.cos(3*(x-n)) + math.sin(3*(y-n))) >>> print(a)
1.4969723467801361
缩进被用来指示不同的代码块, 比如函数的主体代码块, 条件执行代码块, 循环体代码块及类定义代码块。 缩进的空格(制表符)数目可以是任意的, 但是在整个块中的缩进必须一致。
根据目前大多数程序员的习惯,以及 Python 编码的相关规范 , 这里强烈要求使用4个空格来进行缩进。 使用其他的缩进方式也可以,但是在交流中会遇到大量的问题。
>>> a = 13 >>> b = 50 >>> if a > b: >>> print('A is greater than B.') >>> else: >>> print('B is greater than A.')
- 1.4.3. Python内建数据类型
- 1.4.4. 流程控制
- 1.4.5. Python中的序列
- 1.4.6. 函数
这里列出了与 GIS 相关的 Python 开源类库与工具。
基础类库(抽象库)
- • GDAL/OGR 是大部分开源GIS的基础,也包括如ArcGIS、FME这样的商业软件 打开 ;
- • Proj.4 地图投影类库 打开;
- • geojson类库,用于 GeoJson 格式的数据处理
- • Rasterio用于栅格影像处理
- • Geos是由C开发的空间关系与分析类库
Python类库
- • Shapley 是基于 Geos 的封装 Python 库
- • Fiona 用于矢量数据的读入、写出
- • Rtree 是Rtree空间索引的类库
- • pyproj 是Proj.4的Python 接口扩展
- • python-rasterstats 用于栅格数据的计算
- • OWSLib 基于OGC标准进行信息访问
- • Basemap 基于 Matplotlib 的绘图库
- • Descartes 运用matplotlib对空间数据画图
- • Mercantile 球面墨卡托投影
GIS工具
- • GeoPandas 整合了pandas, shapely, fiona, descartes, pyproj 和 rtrees,用于数据处理
- • GeoDjango django出品,集成了GIS功能的门户网站程序
- • python-rasterstats 栅格数据统计
桌面软件接口
- • ArcPy
- • pyQGIS
https://www.osgeo.cn/page/python_opengis
使用OGR操作矢量数据
- GDAL简介
- 使用ogr模块打开矢量数据
- 获取图层信息
- 获取要素信息
- 关闭矢量数据、释放内存与删除数据
- 使用OGR生成几何要素对象
- 使用OGR中拷贝方法创建新的Shapefile
- 使用OGR创建数据集的几何形状
- 使用OGR定义矢量数据的字段
- 根据属性条件选择要素
- 在OGR中使用SQL语句进行查询
使用GDAL操作栅格数据
地图投影操作
Python使用SpatiaLite
使用Mapnik进行地图制图
更新说明:
- 2016-02-6: SpatiaLite 中的基本SQL数据库查询用法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!