第一章:学习使用 Python 进行地理空间分析

第一章:学习使用 Python 进行地理空间分析
ytkz第一章:学习使用 Python 进行地理空间分析
本章概述了地理空间分析。我们将通过一个案例研究,探讨地理空间技术如何影响我们的世界,案例涉及历史上最严重的疫情之一,以及地理空间分析如何帮助追踪疾病传播,为研究人员争取时间开发疫苗。接下来,我们将回顾地理空间分析的历史,这一历史甚至早于计算机和纸质地图!然后,我们将探讨为什么作为地理空间分析师,你可能需要学习编程语言,而不是仅仅使用地理信息系统(GIS)应用程序。我们将认识到让尽可能多的人接触地理空间分析的重要性。接着,我们将介绍基本的 GIS 和遥感概念及术语,这些内容将贯穿本书始终。最后,我们将通过从零开始构建一个最简单的 GIS,正式开始使用 Python 进行地理空间分析!
本章涵盖的主题快速概览如下:
- 地理空间分析与我们的世界
- 地理空间分析的历史
- 地理信息系统(GIS)的演变
- 遥感概念
- 点云数据
- 计算机辅助制图
- 地理空间分析与计算机编程
- 地理空间分析的重要性
- GIS 概念
- 常见的 GIS 过程
- 常见的遥感过程
- 常见的栅格数据概念
- 创建最简单的 Python GIS
通过本章的学习,你将理解地理空间分析作为一种解答我们世界问题的方法,以及 GIS 和遥感之间的区别。
技术要求
本章为地理空间分析提供了基础,这是在遥感和 GIS 领域(包括本书后续章节)学习任何主题的必要条件。本书的代码可以在以下 GitHub 代码仓库中找到:https://github.com/PacktPublishing/Learning-Geospatial-Analysis-with-Python-4thEdition。我们将使用 Python 3.10.9 进行代码示例,并通过 Anaconda 3 平台提供。本章的代码文件可在 GitHub 上访问:https://github.com/PacktPublishing/Learning-Geospatial-Analysis-with-Python-Fourth-Edition/tree/main/B19730_01_Asset_Files。
地理空间分析与我们的世界
2019 年 12 月,中国武汉的医生报告了一组神秘的类似肺炎的病例。起初,人们认为这只是一次小规模疫情,但随着病例数量持续上升,很快人们意识到这是一场更为严重的事件。
随着病毒开始传播到其他国家,世界卫生组织(WHO)于 2020 年 1 月 30 日宣布全球卫生紧急状态。尽管发出了警告,许多国家行动迟缓,病毒继续不受控制地传播。
到 2020 年 3 月,病毒已达到全球大流行的程度,病例遍布全球各地。各国政府紧急应对,实施封锁和旅行禁令,试图减缓病毒传播。
随着病例和死亡人数持续上升,全球目睹了医院不堪重负、医疗系统挣扎求存的可怕景象。一个多世纪以来,人类首次面临全球大流行,与一种名为 COVID-19 的新病毒作战。
与其他新病毒一样,当时没有疫苗,甚至没有有效的治疗方法。短期内的唯一解决方案是争取时间。为此,世界需要一种方法来追踪病毒的传播,以便将资源集中在疫情最严重的地区。
在美国,马里兰州巴尔的摩的约翰霍普金斯大学,一位名叫董恩盛(Ensheng Dong)的博士候选人密切关注着病毒从他的祖国——中国传播的新闻。作为一名学生,董恩盛同时研究流行病学和一种称为 GIS 的技术,GIS 是一种用于显示和分析地理参考信息的计算机系统。董恩盛担心家人的安全,当华盛顿出现首例 COVID 病例时,他决定采取行动。
第二天,他与他的导师劳伦·加德纳(Lauren Gardner)博士会面,加德纳建议他利用流行病学和 GIS 知识创建一个跟踪全球病毒传播的仪表板。董恩盛开始在网上搜集 COVID 数据,每天两次将其发布到在线地图上,几乎不眠不休。随着仪表板的知名度提升,董恩盛开始获得帮助,自动化了数据收集和发布过程。
这些仪表板地图可视化帮助公共卫生官员了解病毒的传播地点,并识别需要特别关注的热点地区。它帮助追踪封锁和社交距离措施等遏制措施的有效性,还使新闻机构能够向公众发布信息。
下图展示了 COVID-19 仪表板:
政府机构还使用其他 GIS 地图应对疫情,以识别高风险人群。通过叠加人口统计、收入水平和已有健康状况数据,GIS 帮助官员识别特别容易受到病毒影响的社区,并将资源针对性地分配到这些地区。
官员还使用 GIS 管理疫情应对的物流。例如,他们用它来规划个人防护装备、医疗物资和疫苗的分发。GIS 还跟踪了医护人员和其他关键人员的动态,确保他们被部署到最需要的地方。
简而言之,GIS 在应对疫情中发挥了至关重要的作用,提供了关键信息和工具,帮助组织更有效地应对危机。
其他 GIS 应用
地理空间分析几乎应用于每个行业,包括房地产、石油和天然气、农业、国防、政治、医疗、运输和海洋学等。如需了解地理空间分析在数十个不同行业中的应用概况,请访问:https://www.esri.com/en-us/what-is-gis/overview。
地理空间分析的历史
地理空间分析可以追溯到 17,000 年前,位于法国西南部的拉斯科洞穴。在这个洞穴中,旧石器时代的艺术家绘制了常被猎捕的动物,许多专家最近得出结论,这些洞穴壁画上的点代表了动物的月球周期,用于记录猎物的季节性行为模式,如交配或迁徙。虽然这些绘画较为原始,但它们展示了人类创造抽象世界模型并关联时空特征以寻找关系的古老例子。下图展示了一幅这样的绘画——一头公牛背上有四个点,交叉引用了月球时间参考:
几个世纪以来,制图术和土地测量科学不断发展,但直到 19 世纪,地理分析才取得了显著进步。1830 年至 1860 年间,欧洲爆发了致命的霍乱疫情,巴黎和伦敦的地理学家开始使用地理分析进行流行病学研究。
1832 年,查尔斯·皮奎特(Charles Picquet)在巴黎 48 个区的霍乱疫情报告中使用不同灰度的半色调表示每千名居民的死亡人数。1854 年,约翰·斯诺(John Snow)博士扩展了这种方法,实时跟踪伦敦的霍乱疫情。通过在城市地图上每次确诊死亡时放置一个点,他能够分析霍乱病例的聚集情况。斯诺最终将疾病追溯到单一水泵,阻止了进一步病例的发生。下图是一个放大的地图部分,包含三层信息:街道、每个水泵的标记点以及每个家庭霍乱死亡的条形图:
地理空间分析不仅用于对抗疾病。几个世纪以来,将军和历史学家一直使用地图来理解人类战争。法国退休工程师查尔斯·米纳德(Charles Minard)在 1850 年至 1870 年间制作了一些最为复杂的信息图表。这些图表的通用术语“信息图表”不足以描述它们,因为它们具有强烈的地理成分。这些地图的质量和细节即使以今天的标准来看也是杰出的地理信息分析示例。米纳德在 1869 年发布了他的杰作:
《1812-1813 年法国军队在俄罗斯战役中的连续损失形象地图》(”La carte figurative des pertes successives en hommes de l’Armée Française dans la campagne de Russie 1812-1813”)。
这幅地图描绘了拿破仑军队在 1812 年俄罗斯战役中的毁灭性损失。地图展示了军队的规模和位置随时间的变化,以及当时的天气条件。下图包含了四个不同系列的信息,围绕一个主题。这是一个使用纸笔进行地理分析的绝佳示例。军队规模由棕色和黑色带宽表示,每毫米代表 10,000 人,数字也沿带宽标注。棕色路径显示进入俄罗斯的士兵,黑色路径表示幸存者。地图右侧中央显示了比例尺,为一法国里格(2.75 英里或 4.4 公里)。底部图表从右到左,描绘了士兵在从俄罗斯返回途中经历的极寒温度:
虽然远不如战争战役那样引人注目,米纳德还发布了一张引人注目的地图,记录了法国各地向巴黎运送的牛的数量。米纳德在法国各地区使用不同大小的饼图,展示每个地区的牛的种类和运输量:
在 20 世纪初,大规模印刷推动了地图分层概念的发展,这是地理空间分析的一个关键特性。制图师将不同的地图元素(如植被、道路和等高线)绘制在玻璃板上,然后堆叠并拍摄,印刷成单一图像。如果制图师出错,只需更换一块玻璃板,而不必重绘整个地图。后来,塑料薄膜的开发使这种方式更容易创建、编辑和存储地图。然而,地图分层的分析优势直到现代计算机时代才得以发挥。
地理信息系统(GIS)的演变
计算机映射在 20 世纪 60 年代随着计算机本身的发展而演变。然而,“GIS”一词的起源始于加拿大林业和农村发展部。罗杰·汤姆林森(Roger Tomlinson)博士领导了一个由 40 名开发人员组成的团队,与 IBM 合作开发了加拿大地理信息系统(CGIS)。CGIS 用于追踪加拿大的自然资源,并允许对这些特征进行进一步分析。CGIS 将每种土地覆盖类型存储为不同的图层。
它还使用了一种适合整个加拿大的特定坐标系统,优化了面积计算。虽然当时使用的技术以今天的标准来看较为原始,但该系统在当时具有惊人的能力。CGIS 包括以下软件功能,这些功能在 60 多年后的现代 GIS 软件中仍然存在:
- 地图投影切换
- 扫描图像的橡皮布调整
- 地图比例更改
- 线平滑和泛化以减少特征点数
- 自动闭合多边形间隙
- 面积测量
- 多边形的溶解和合并
- 几何缓冲
- 创建新多边形
- 扫描
- 从参考数据中数字化新特征
更多关于 CGIS 的信息
加拿大国家电影委员会在 1967 年制作了一部关于 CGIS 的纪录片,可在以下链接观看:https://www.youtube.com/watch?v=3VLGvWEuZxI。
汤姆林森常被称为“GIS 之父”。在推出 CGIS 后,他于 1974 年在伦敦大学获得博士学位,博士论文题为《电子计算方法和技术在地图数据存储、编译和评估中的应用》,描述了 GIS 和地理空间分析。汤姆林森经营着自己的全球咨询公司 Tomlinson Associates Ltd.,直到晚年仍活跃于行业,经常在地理空间会议上发表主题演讲。
CGIS 是本书定义的地理空间分析的起点。然而,如果没有哈佛设计研究生院的哈佛计算机图形与空间分析实验室的霍华德·费舍尔(Howard Fisher)的工作,本书可能不会问世。他在 SYMAP GIS 软件上的工作(该软件将地图输出到行式打印机)开启了实验室的开发时代,产生了另外两个重要软件包,并永久定义了地理空间行业。SYMAP 促成了其他软件包,包括 GRID 和 Odyssey 项目,均来自同一实验室:
- GRID 是一个基于栅格的 GIS 系统,使用单元格表示地理特征,而不是几何。它由卡尔·斯坦尼茨(Carl Steinitz)和大卫·辛顿(David Sinton)编写。该系统后来发展为 IMGRID。
- Odyssey 是一个由尼克·克里斯曼(Nick Chrisman)和丹尼斯·怀特(Denis White)领导的团队合作项目。它是一个包含许多高级地理空间数据管理功能的程序系统,这些功能在现代地理数据库系统中很常见。哈佛尝试将这些软件包商业化,但成功有限。然而,它们的深远影响至今仍在。
几乎所有现有的商业和开源软件包都或多或少受到这些代码库的影响。
霍华德·费舍尔(Howard Fisher)在 1967 年使用 SYMAP 的输出制作了一部影片,展示了密歇根州兰辛市从 1850 年到 1965 年的城市扩张,通过手工编码数十年的房产信息输入系统。这项分析耗费了数月时间。然而,在当今时代,凭借现代工具和数据,重新创建这些分析只需几分钟。
关于 SYMAP 的更多信息
您可以在以下链接观看这部影片:https://www.youtube.com/watch?v=xj8DQ7IQ8_o。
如今,有数十种图形用户界面(GUI)地理空间桌面应用程序可供使用,来自 Esri、ERDAS、Intergraph、ENVI 等公司。Esri 是最古老、持续运营的 GIS 软件公司,始于 20 世纪 60 年代末。在开源领域,Quantum GIS(QGIS)和地理资源分析支持系统(GRASS)等软件包被广泛使用。除了全面的桌面软件包外,用于构建新软件的软件库多达数千种。
GIS 可以提供有关地球的详细信息,但它仍然只是一个模型。有时,我们需要直接的表示来了解地球上当前或近期的变化。这时,我们需要遥感技术。
遥感
遥感是指在不与物体直接物理接触的情况下收集其信息。在地理空间分析的背景下,该物体通常是地球。遥感还包括处理收集到的信息。地理信息系统的潜力仅受可用地理数据的限制。土地测量(即使使用现代 GPS 来填充 GIS)一直是资源密集型的任务。
遥感的出现不仅显著降低了地理空间分析的成本,还将该领域带入了全新的方向。除了为 GIS 系统提供强大的参考数据外,遥感还通过从图像和地理数据中提取特征,使生成自动化和半自动化的 GIS 数据成为可能。古怪的法国摄影师加斯帕德-费利克斯·图纳雄(Gaspard-Félix Tournachon),又名纳达尔(Nadar),于 1858 年在巴黎上空乘坐热气球拍摄了第一张航拍照片:
鸟瞰视角的价值立即显现。早在 1920 年,关于航拍照片解释的书籍就开始出现。
当美国在二战后与苏联进入冷战时期,航拍摄影被广泛用于监控军事能力,这得益于美国 U-2 间谍飞机的发明。U-2 间谍飞机可以在 75,000 英尺的高空飞行,超出了当时设计仅能达到 50,000 英尺的防空武器的射程。美国对苏联的 U-2 飞行最终在苏联击落一架 U-2 并俘获飞行员后结束。
然而,航拍摄影对现代地理空间分析的影响有限。飞机只能捕捉小范围的区域。照片被钉在墙上或在光桌上检查,但缺乏与其他信息的上下文。尽管航拍照片解读极为有用,但它仅仅是另一种视觉视角。
真正的变革发生在 1957 年 10 月 4 日,苏联发射了斯普特尼克 1 号卫星。苏联因制造困难放弃了更为复杂和精密的卫星原型(该原型后来成为斯普特尼克 3 号)。相反,他们选择了带有四个天线和简单无线电发射器的简单金属球体。包括美国在内的其他国家也在研发卫星。这些卫星计划并非完全保密,它们是国际地球物理年(IGY)的一部分,出于科学动机。然而,几乎每个国家的国防机构也深度参与其中。与苏联类似,其他国家在设计复杂、搭载科学仪器的卫星时遇到了困难。苏联决定采用最简单的设备,纯粹是为了抢在美国之前发射卫星,这一决定非常有效。斯普特尼克在经过时可以在天空中看到,其无线电脉冲可以被业余无线电操作员接收到。尽管斯普特尼克的简单性……
点云数据
点云数据是遥感技术的一个重要分支,通常与光探测与测距(LiDAR,Light Detection and Ranging)相关。LiDAR 使用激光脉冲测量与地球表面的距离,生成高精度的三维点云数据。这些数据可以表示地形、植被、建筑物等特征。点云数据在地理空间分析中用途广泛,例如:
- 地形建模:创建数字高程模型(DEM)以分析地形变化。
- 城市规划:生成建筑物和基础设施的 3D 模型。
- 林业:测量树高和森林密度。
- 灾害管理:评估洪水或滑坡影响区域。
点云数据的优势在于其高分辨率和三维特性,但处理这些大规模数据集需要强大的计算能力和专门的软件工具,如点数据抽象库(PDAL)。
计算机辅助制图
计算机辅助制图(CAD,Computer-Aided Drafting)是地理空间分析的另一个重要组成部分,特别是在工程和建筑领域。CAD 系统用于创建精确的二维和三维设计,常用于绘制地图、规划基础设施或设计城市布局。尽管 CAD 软件(如 AutoCAD)与 GIS 的功能有所重叠,但它们的主要区别在于:
- CAD 专注于精确的几何设计和工程图纸,通常不涉及地理参考或空间分析。
- GIS 强调地理数据的存储、分析和可视化,处理大规模的空间关系。
在地理空间分析中,CAD 数据常被转换为 GIS 格式(如 shapefile 或 GeoJSON),以便与其他地理数据集成。例如,建筑蓝图可以与地形数据结合,用于城市规划或灾害响应。
地理空间分析与计算机编程
地理空间分析的复杂性通常需要超越桌面 GIS 应用程序的功能。计算机编程,特别是使用 Python,为地理空间分析师提供了以下优势:
- 自动化:通过脚本自动化重复性任务,如批量处理影像或转换数据格式。
- 定制化:开发定制工具以满足特定项目需求,而无需依赖商业软件的限制。
- 扩展性:处理大规模数据集或实时数据流,这是许多 GUI 工具的瓶颈。
- 开源生态:Python 的开源库(如 GDAL、Shapely、GeoPandas)提供了强大的地理空间处理功能,且免费。
Python 在地理空间分析中的角色是多方面的:
- 脚本语言:用于自动化 GIS 软件(如 ArcGIS 或 QGIS)中的任务。
- 集成语言:将不同数据源和工具“粘合”在一起,创建无缝工作流程。
- 全功能编程语言:从头构建复杂的地理空间应用程序。
通过学习 Python,地理空间分析师可以摆脱商业软件的限制,探索创新的分析方法。
面向对象的编程与地理空间分析
面向对象编程(OOP)是地理空间分析中一个强大的范式。OOP 允许分析师将地理特征(如点、线、多边形)建模为对象,每个对象具有属性(如坐标、名称)和方法(如计算面积或距离)。这与地理空间数据的自然结构高度契合。例如:
- 一个“河流”对象可以包含其几何形状、长度和流量的属性,以及计算缓冲区或与另一河流交集的方法。
- 一个“城市”对象可以存储人口、边界和基础设施数据,并提供可视化或空间查询的功能。
Python 的 OOP 特性使其成为实现这些模型的理想选择。例如,PyShp 库(由本书作者 Joel Lawhead 开发)使用 OOP 处理 shapefile 数据,允许用户以直观的方式操作地理特征。
地理空间分析的重要性
地理空间分析的重要性在于其回答有关我们世界复杂问题的能力。以下是一些关键原因:
- 决策支持:从城市规划到灾害响应,地理空间分析提供数据驱动的见解,帮助制定明智决策。
- 跨学科应用:它服务于众多领域,包括环境科学、公共健康、运输和国防。
- 实时洞察:现代技术(如实时 GPS 和卫星影像)使分析师能够快速响应动态事件,如疫情或自然灾害。
- 可访问性:开源工具和编程语言(如 Python)的普及降低了进入门槛,使更多人能够参与地理空间分析。
通过让地理空间分析更易于访问(例如,通过免费的 Python 库),我们可以赋予研究人员、政策制定者和社区权力,以解决本地和全球挑战。
向量数据是地理信息系统(GIS)中表示地理特征的主要方式之一。向量数据使用点、线和多边形等几何形状来表示现实世界中的对象,例如城市(点)、道路(线)或湖泊(多边形)。这些几何形状与属性数据(如名称、人口或面积)相关联,允许进行复杂分析。以下是向量 GIS 中一些核心概念和过程,它们是理解和执行地理空间分析的基础。
数据结构
向量数据的核心是其数据结构,它定义了地理特征如何在计算机中存储和操作。常见的向量数据结构包括:
- 点(Point):表示单一位置,使用单一坐标对(x, y)或三维坐标(x, y, z)表示。例如,一个城市可以用经度和纬度坐标表示为点。
- 线(Line):由一系列有序点连接而成,表示线性特征,如河流或道路。线可以是简单的(仅连接两点)或复杂的(包含多个点形成折线)。
- 多边形(Polygon):由闭合的线段组成,表示具有面积的特征,如国家边界或湖泊。多边形可以包含“孔”(例如,一个国家内的湖泊)或由多个部分组成(例如,一个由多个岛屿组成的国家)。
这些几何形状通常存储在文件格式(如 shapefile 或 GeoJSON)或空间数据库(如 PostGIS)中。每个特征还与属性表关联,属性表包含非空间信息,例如点的名称或多边形的土地使用类型。以下是一个简单的数据结构示例:
特征 ID | 几何类型 | 坐标 | 属性(名称) | 属性(人口) |
---|---|---|---|---|
1 | 点 | (38.8951, -77.0364) | building | 705,749 |
2 | 多边形 | [(37, -120), (39, -122), …] | Guangdong | 331,002,651 |
缓冲(Buffer)
缓冲操作在点、线或多边形周围创建指定距离的区域,生成一个新的多边形。这一过程常用于分析邻近性或影响范围。
例如:
- 在一条河流周围创建 100 米的缓冲区,以评估洪水风险区域。
- 在一个学校周围创建 500 米的缓冲区,以确定步行范围内的住宅。
缓冲区的距离可以是固定的(例如,100 米)或基于属性值(例如,根据道路类型设置不同的缓冲距离)。缓冲操作的结果是一个新的多边形,可能与其他特征重叠,用于进一步分析。
示例:如果一个点表示加油站,缓冲操作可以生成一个圆形多边形,表示 1 公里服务范围。
溶解(Dissolve)
溶解操作合并共享共同属性的相邻多边形,生成一个单一的多边形。这通常用于简化数据或汇总区域。
例如:
- 将同一州内所有县的多边形合并,生成一个州的单一边界。
- 将具有相同土地使用类型的相邻地块合并,生成一个统一的区域。
溶解操作减少了特征数量,简化了地图并提高了分析效率。需要注意的是,溶解可能会丢失一些细节,因为原始特征的边界被移除。
示例:在分析国家公园时,可以将所有属于同一公园的单独地块溶解为一个多边形。
泛化(Generalize)
泛化操作通过简化几何形状来减少复杂性,同时尽量保留特征的主要形状。这通常涉及减少多边形或线的顶点数。
泛化在以下情况下很有用:
- 在小比例尺地图上显示数据时,简化复杂的边界以提高渲染速度。
- 减少数据存储需求或加快处理速度。
泛化算法(如 Douglas-Peucker 算法)会根据指定的容差值移除不必要的顶点。例如,一个蜿蜒的河流可能被简化为较少的点,但仍保留其大致路径。
示例:一个详细的海岸线在全球地图上可能被泛化为较平滑的线条,以避免视觉 clutter。
交集(Intersection)
交集操作识别两个或多个地理特征的重叠区域,生成一个新的特征,仅包含重叠部分。交集常用于分析空间关系,
例如:
- 查找城市边界与洪泛区的重叠区域,以确定受洪水威胁的区域。
- 确定两个保护区的共同区域,以规划联合管理。
交集操作的结果保留了输入特征的属性,允许进一步分析重叠区域的特性。
示例:如果一个多边形表示森林,另一个表示国家公园,交集操作可以生成仅包含森林和公园重叠部分的区域。
合并(Merge)
合并操作将多个地理数据集组合成一个单一数据集,保留所有输入特征的几何和属性。合并与溶解不同,因为它不会移除边界或合并特征,而是将它们“拼接”在一起。
合并常用于:
- 组合多个州的道路数据,生成全国道路网络。
- 整合来自不同来源的土地使用数据。
合并操作需要确保输入数据的坐标系一致,以避免几何错误。
示例:将邻近县的 shapefile 合并为一个单一文件,包含所有县的边界和属性。
点在多边形内(Point in Polygon)
点在多边形内操作确定一个点是否位于多边形内部。
这是一个基本的空间查询,广泛应用于:
- 检查 GPS 坐标是否在特定行政区域(如城市或国家)内。
- 确定事件(如犯罪或事故)是否发生在特定区域内。
该操作通常使用射线投射算法(ray-casting algorithm),通过计算一条从点发出的射线与多边形边界的交点数量来判断点的位置。如果交点数量为奇数,则点在多边形内;如果为偶数,则点在多边形外。
示例:检查一个手机的 GPS 坐标是否在国家公园内,以提醒用户遵守公园规定。
并集(Union)
并集操作组合两个或多个地理特征,生成一个新的特征,包含所有输入几何的范围和属性。并集与交集不同,因为它保留了所有区域,而不仅仅是重叠部分。
并集常用于:
- 合并两个邻近城市的边界,生成一个覆盖两者的区域。
- 组合多个保护区的边界,创建一个统一的保护区域。
并集操作可能会生成复杂的多边形,可能包含多个部分或孔。
示例:将两个相邻湿地的多边形进行并集,生成一个包含两个湿地全部区域的多边形。
连接(Join)
连接操作基于共同属性或空间关系将数据表与地理特征关联。连接有两种主要类型:
- 属性连接(Attribute Join):基于共同的属性值(如 ID 或名称)将非空间数据表与地理特征关联。例如,将人口普查数据表与行政区划 shapefile 连接,使用地区 ID 作为键。
- 空间连接(Spatial Join):基于空间关系(如包含或邻近)将数据关联。例如,将犯罪事件点与城市区域多边形连接,确定每个事件所在的城市。
连接操作增强了地理数据的分析能力,允许将非空间信息融入空间分析。
示例:将一个包含城市人口的 CSV 文件与城市边界的 shapefile 连接,以生成人口密度地图。
GIS 概念
理解地理空间分析需要掌握一些核心 GIS 概念。这些概念是本书后续章节的基础:
- 专题地图(Thematic Maps):专题地图以视觉方式展示特定主题或变量的空间分布,例如人口密度或降雨量。它们通常使用颜色、符号或图案来表示数据变化。
- 空间数据库(Spatial Databases):这些数据库(如 PostGIS)专门设计用于存储和查询地理数据,支持空间关系(如邻近、包含)和几何操作。
- 空间索引(Spatial Indexing):空间索引(如 R 树或四叉树)优化了地理数据的检索速度,特别是在处理大规模数据集时。
- 元数据(Metadata):元数据描述地理数据的内容、质量和来源,是确保数据可信和可重用的关键。例如,元数据可能包括坐标系或采集日期。
- 地图投影(Map Projections):地图投影将地球的球面表面转换为二维平面。由于地球是三维的,投影不可避免地引入失真(如面积或距离)。常见的投影包括墨卡托投影和等面积投影。
- 渲染(Rendering):渲染是将地理数据可视化为地图或其他图形的过程。渲染涉及选择颜色、符号和比例,以有效传达信息。
常见的 GIS 过程
GIS 分析涉及一系列标准过程,用于操作和分析地理数据。以下是一些常见过程:
- 缓冲(Buffer):在点、线或多边形周围创建指定距离的区域,例如在河流周围生成 100 米缓冲区以分析洪水风险。
- 溶解(Dissolve):合并共享共同属性的相邻多边形,例如将同一州的县合并为单一边界。
- 泛化(Generalize):简化几何形状以减少复杂性(例如减少多边形的顶点数),同时保留主要特征,常用于地图缩放。
- 交集(Intersection):识别两个地理特征的重叠区域,例如查找城市边界与洪泛区的交叉部分。
- 合并(Merge):将多个地理数据集组合成一个,例如合并多个州的道路数据。
- 点在多边形内(Point in Polygon):确定一个点是否位于多边形内,例如检查 GPS 坐标是否在国家公园内。
- 并集(Union):组合两个或多个地理特征,保留所有几何和属性,例如合并两个邻近城市的边界。
- 连接(Join):基于共同属性或空间关系将数据表与地理特征关联,例如将人口普查数据与行政区划连接。
常见的遥感过程
遥感分析涉及处理和解释从卫星、飞机或其他传感器收集的图像数据。以下是一些常见的遥感过程:
- 图像作为数据(Images as Data):遥感图像是包含多个波段(如可见光、红外线)的栅格数据,每个像素代表特定位置的光谱信息。
- 遥感与颜色(Remote Sensing and Color):通过组合不同波段(例如红、绿、蓝或红外),可以创建真彩色或假彩色图像,以突出特定特征,如植被或水体。
- 波段运算(Band Math):对图像波段进行数学运算,例如计算归一化差值植被指数(NDVI),以评估植被健康状况。
- 变化检测(Change Detection):比较不同时间的图像,识别变化,例如城市扩张或森林砍伐。
- 直方图(Histogram):分析图像像素值的分布,用于调整对比度或识别特征。
- 特征提取(Feature Extraction):从图像中自动或半自动识别对象,如道路、建筑物或河流。
- 监督分类(Supervised Classification):使用训练数据将像素分类为特定类别(如森林、城市),基于已知样本。
- 无监督分类(Unsupervised Classification):根据像素值的统计特性自动将图像分组成簇,无需预定义类别。
常见的栅格数据概念
栅格数据以网格形式表示地理信息,每个单元格(像素)具有特定值。以下是一些常见的栅格数据概念:
- 波段运算(Band Math):通过数学公式组合多个波段,例如 NDVI = (近红外 - 红光) / (近红外 + 红光)。
- 变化检测(Change Detection):通过比较两幅图像的像素值,识别变化区域。
- 特征提取(Feature Extraction):使用算法从栅格数据中提取特定对象,如道路或建筑物。
- 直方图(Histogram):展示像素值的频率分布,用于图像增强或分类。
- 监督与无监督分类(Supervised and Unsupervised Classification):将像素分配到类别,用于土地覆盖映射或其他分析。
创建最简单的 Python GIS
为了展示 Python 在地理空间分析中的强大功能,我们将构建一个最简单的 GIS,称为 SimpleGIS。这个小型程序将包括以下功能:
- 存储地理数据:表示点、线或多边形。
- 计算属性:例如计算多边形的面积。
- 渲染地图:以图形方式显示数据。
开始使用 Python
我们将使用 Python 的内置 turtle 模块,这是一个简单的图形库,适合初学者。turtle 模块使用“笔”的概念(称为光标),可以在画布上绘制线条和形状。我们将用它来渲染地图。
构建 SimpleGIS
以下是构建 SimpleGIS 的步骤:
设置数据模型:我们将创建一个简单的数据库,存储地理特征(例如国家和城市)及其属性(如名称、人口)。我们使用 Python 字典和列表来表示这些数据。
# SimpleGIS 数据模型 database = { "features": [ {"type": "point", "name": "Washington D.C.", "population": 705749, "coords": (38.8951, -77.0364)}, {"type": "polygon", "name": "USA", "population": 331002651, "coords": [(37, -120), (39, -122), (41, -120), (39, -118)]} ] }
计算面积:对于多边形,我们可以使用鞋带公式(Shoelace Formula)计算面积。这是一个简单的算法,基于多边形的顶点坐标。
def calculate_area(coords): n = len(coords) area = 0.0 for i in range(n): j = (i + 1) % n area += coords[i][0] * coords[j][1] area -= coords[j][0] * coords[i][1] area = abs(area) / 2.0 return area
渲染地图:使用 turtle 模块绘制点和多边形。点用圆圈表示,多边形用闭合线条表示。
import turtle def render_map(database): screen = turtle.Screen() pen = turtle.Turtle() pen.speed(0) for feature in database["features"]: if feature["type"] == "point": pen.penup() pen.goto(feature["coords"][1] * 10, feature["coords"][0] * 10) # 缩放坐标以适应画布 pen.dot(5, "red") pen.write(feature["name"], align="center", font=("Arial", 8, "normal")) elif feature["type"] == "polygon": pen.penup() pen.goto(feature["coords"][0][1] * 10, feature["coords"][0][0] * 10) pen.pendown() pen.fillcolor("lightblue") pen.begin_fill() for coord in feature["coords"][1:]: pen.goto(coord[1] * 10, coord[0] * 10) pen.goto(feature["coords"][0][1] * 10, feature["coords"][0][0] * 10) pen.end_fill() pen.penup() pen.goto(sum(c[1] for c in feature["coords"]) / len(feature["coords"]) * 10, sum(c[0] for c in feature["coords"]) / len(feature["coords"]) * 10) pen.write(f"{feature['name']}\nArea: {calculate_area(feature['coords']):.2f}", align="center") screen.exitonclick() # 运行 SimpleGIS render_map(database)
结果
运行上述代码将生成一个简单的地图,显示华盛顿特区的点标记和美国的多边形边界(使用示例坐标)。多边形将填充浅蓝色,并标注名称和面积。用户点击画布即可关闭窗口。
SimpleGIS 展示了 Python 如何以最少代码实现地理空间分析的核心功能:数据存储、计算和可视化。尽管这个例子非常基础,但它体现了本书的核心理念:使用 Python 构建灵活、可扩展的地理空间工具。
总结
通过本章,你了解了地理空间分析作为解答我们世界问题的一种方法,以及 GIS 和遥感之间的区别。GIS 专注于地理数据的存储、分析和可视化,而遥感通过非接触方式收集地球信息,为 GIS 提供关键数据。我们回顾了地理空间分析的历史,从史前洞穴壁画到现代卫星技术,展示了其悠久的发展历程。我们还探讨了编程(特别是 Python)在增强地理空间分析能力中的重要性,以及核心 GIS 和遥感概念,如专题地图、空间索引和波段运算。最后,我们通过构建 SimpleGIS 迈出了使用 Python 进行地理空间分析的第一步。
在后续章节中,我们将深入探讨地理空间数据的类型、工具和技术,逐步构建更复杂的分析工作流程。
问题
- 哪个机构首次使用“GIS”术语?
- 一种以视觉方式展示特定主题的空间分布的地图类型是什么?
- GIS 的两个主要功能是什么?
进一步阅读
- Esri 的 GIS 概述提供了地理空间分析在各行业的应用案例:https://www.esri.com/en-us/what-is-gis/overview。
- 关于 CGIS 的历史纪录片提供了早期 GIS 开发的背景:https://www.youtube.com/watch?v=3VLGvWEuZxI。
- 查尔斯·米纳德的信息图表是地理空间分析的经典示例,可在网上找到更多分析。