第1章 GIS基础入门
如果一位城市规划者问你:“我们该把新学校建在哪里,才能兼顾安全、可达与公平?”——GIS(地理信息系统)就是让这个问题有据可依的工具。它把“空间”变成可分析的维度,让道路、人口、地形、污染源这些看似分散的信息在同一张地图上互相对话。入门并不在于掌握多少命令,而在于形成一条可复现的空间思考链路:数据从何而来?坐标如何统一?结果怎样表达与验证?本章就以问题为牵引,带你把“地图”变成“模型”。
我们将从两类空间数据谈起(矢量与栅格),穿过坐标参考系与投影的关键环节,最终在标准化工程结构中完成一次最小闭环:加载、检查、重投影、制图与导出。阅读时,请时刻把它们与“现实问题”的答案联系起来——每一个步骤都是为了让你能更可靠地把空间信息转化为决策依据。
1.1 学习目标
本章的目标不是死记硬背概念,而是让你具备“可操作的空间分析起点”。完成学习后,你应该能够:
- 解释 GIS 的核心能力与应用边界,把“地图”视为可计算载体。
- 区分矢量与栅格数据,并在不同任务中做出恰当选型(边界/道路用矢量,连续现象用栅格)。
- 识别并统一坐标参考系(CRS),理解为何同一地点在不同投影下“看起来不一样”。
- 用 GeoPandas/Rasterio/OSMnx 完成最小管线:加载→检查→重投影→制图→导出。
- 在统一的工程结构中组织数据与代码,为后续章节的复杂分析打好基础。
1.2 先修要求
你不需要成为制图专家,但需要具备以下“最小前置”:
- Python 基础:会创建虚拟环境、安装包、读写文件。
- 空间常识:知道经纬度是角度,理解点/线/面三类要素与地图比例尺的含义。
- 投影直觉:听说过墨卡托,知道“球面摊平会变形”,变形方向与用途相关。
1.3 核心知识点
当你把一个现实问题翻译为空间问题时,几个关键概念会反复出现:
- GIS 是“空间数据生命周期”的总称:从采集、存储到分析与表达,强调数据与地理位置的耦合。
- 数据有两种基本形态:矢量(边界是清晰的对象,如道路与建筑)与栅格(连续的场,如海拔与土地覆盖)。
- 坐标参考系是空间计算的前提:WGS84(EPSG:4326)适合全球定位与展示;Web Mercator(EPSG:3857)或 UTM 更适合测量与局部分析。
- 重投影不是“美化”,而是为了统一度量单位与几何关系,避免把“度”当“米”来测。
- 制图是“表达”环节:底图、叠层、符号化与图例共同构成可解释的空间叙事。
- 工程结构让实践可复现:把数据、脚本与输出分门别类,避免“只在我电脑上能跑”。
1.4 内容讲解(概念、使用与原理)
1.4.1 什么是 GIS?
从“地图”到“模型”的跨越靠两件事:空间关联与表达。GIS 把不同来源的数据放到统一的空间坐标上,允许你提出诸如“道路与学校的距离是否影响就学便利性”这样的可检验假设。你会发现,GIS 的本质不是软件菜单,而是一个由数据、坐标与算法共同驱动的分析框架。
1.4.2 矢量与栅格:两种视角的互补
如果你要描述一条道路的路径与限速,矢量是合适的载体;如果你要评估一个区域的地形起伏或植被覆盖,栅格才是你的朋友。矢量的优势在于精确的边界与属性关联,栅格的优势在于对连续现象的细腻刻画。在综合项目里,你通常需要把两者在同一投影下叠加分析。
1.4.3 常见数据格式与选择
Shapefile 在工程遗产与工具兼容性上仍有存在理由,但在编码与字段长度上需要小心;GeoJSON 则是 WebGIS 的天然伙伴,易于交换与可读;GeoTIFF 则用来承载“带有空间参考”的栅格数据。如果你的任务包含 Web 发布与交互式地图,优先考虑 GeoJSON 与基于瓦片的服务;如果你的任务是分类或地表分析,GeoTIFF 基本是标配。
1.4.4 坐标参考系(CRS)与投影:为何统一如此关键
你可能会问,“不同坐标系的地图看上去都差不多,为什么要折腾重投影?”因为“看起来差不多”并不意味着“测起来一样”。WGS84 用角度表示位置,Web Mercator 与 UTM 用米来度量距离与面积。把不同单位混在一起做缓冲或面积统计,结论会失真。重投影的第一原则是:明确源 CRS,选择与任务匹配的目标 CRS,然后使用正确的工具转换。
1.4.5 表达即证据:底图与叠层的语言
地图不是装饰,是证据的容器。底图提供定位与环境语境,叠层用颜色与形状讲述结构与关系。图例、比例尺与指北针是可解释性的保障;分类或分级渲染是结构化表达的核心。好的地图能让非技术读者理解你的结论,而不是把他们淹没在复杂的术语里。
1.4.6 标准工程结构与实践流程
为避免“只在我电脑上能跑”的困境,我们在 gis_examples/ 中提供了一套可复用的脚手架。把数据放在 datasets/basics/,把脚本放在 modules/01_basics/src/,把输出集中到 outputs/。实践流程应简单而坚实:数据获取→检查(CRS/属性)→重投影→制图→输出与报告。这条链路会在后续章节反复迭代加厚,但骨架保持不变。
1.5 实践任务与代码示例
在你动手之前,请先明确一个目标:把“一个真实的数据集”带到统一投影下,生成可解释的图件,并留下可复现的脚本。以下示例并非炫技,而是刻意选择“最小但完整”的路径。
任务A:加载与浏览矢量数据(GeoPandas)
为何先看矢量?因为它最能体现“对象—属性—空间”的三位一体。你将读取一个 GeoJSON,核对 CRS 与字段,然后输出一张基础浏览图件。
# 文件:建议保存为 gis_examples/modules/01_basics/src/load_vector.py
# 依赖:geopandas, shapely, pyproj, matplotlibimport geopandas as gpd
import matplotlib.pyplot as plt# 1) 读取矢量数据(示例为 GeoJSON)
# 将路径替换为你的 datasets/basics/ 目录中的文件
vector_path = "../../datasets/basics/sample.geojson"gdf = gpd.read_file(vector_path)
print("要素数:", len(gdf))
print("原始CRS:", gdf.crs)
print("属性列示例:", gdf.columns.tolist()[:10])# 2) 基础渲染
ax = gdf.plot(figsize=(6, 6), color="#4C78A8", alpha=0.7, edgecolor="white")
ax.set_title("矢量数据基础浏览")
plt.tight_layout()
plt.savefig("../outputs/vector_view.png", dpi=150)
plt.close()# 3) 导出为 Shapefile(可选)
# 注意:导出 Shapefile 时,字段名长度与编码需注意
out_shp = "../outputs/sample.shp"
gdf.to_file(out_shp)
print("已导出 Shapefile:", out_shp)
任务B:重投影到 Web Mercator(EPSG:3857)
你会亲眼看到“度”和“米”的差别——同一对象在不同坐标系下的形态变化与度量能力的提升。重投影后的数据更适合与道路距离、面积等度量相关的分析。
# 文件:gis_examples/modules/01_basics/src/reproject.py
import geopandas as gpd
import matplotlib.pyplot as pltsrc_path = "../../datasets/basics/sample.geojson"
gdf = gpd.read_file(src_path)
print("原始CRS:", gdf.crs)# 若源数据无 CRS,需根据数据来源设置,如:gdf.set_crs("EPSG:4326", inplace=True)
if gdf.crs is None:gdf.set_crs("EPSG:4326", inplace=True)# 重投影到 3857(米)
gdf_3857 = gdf.to_crs(epsg=3857)
print("目标CRS:", gdf_3857.crs)# 对比可视化
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
gdf.plot(ax=axes[0], color="#72B7B2")
axes[0].set_title("EPSG:4326(度)")gdf_3857.plot(ax=axes[1], color="#E45756")
axes[1].set_title("EPSG:3857(米)")plt.tight_layout()
plt.savefig("../outputs/reproject_compare.png", dpi=150)
plt.close()
任务C:下载城市道路并制图(OSMnx)
道路网络是很多城市问题的底层结构。通过 OSMnx,你可以快速获取并投影一个城市的 drive 网络,并渲染出一张清晰的道路图。这为后续的服务区分析与可达性评价打基础。
# 文件:gis_examples/modules/01_basics/src/osm_download.py
# 依赖:osmnx, matplotlib
import osmnx as ox
import matplotlib.pyplot as pltplace = "Shanghai, China" # 可替换为目标城市# 获取道路网络(驱动类型可选:drive/walk/bike)
G = ox.graph_from_place(place, network_type="drive")
print("节点数:", len(G.nodes), "边数:", len(G.edges))# 投影到 UTM 或 Web Mercator,提高度量与渲染效果
Gp = ox.project_graph(G) # 自动选择合适投影# 绘图并保存
fig, ax = ox.plot_graph(Gp, node_size=0, edge_color="#4C78A8", bgcolor="white", show=False)
fig.savefig("../outputs/osm_roads.png", dpi=150)
plt.close(fig)
任务D:栅格数据加载与基本信息(Rasterio)
栅格承载的是“场”的信息。你将读取一个 GeoTIFF,查看其空间参考、分辨率与波段,并做一个最小统计。这个过程让你直观理解“像元”的尺度与范围。
# 文件:gis_examples/modules/01_basics/src/load_raster.py
# 依赖:rasterio
import rasterioraster_path = "../../datasets/basics/sample.tif" # 替换为你的栅格路径
with rasterio.open(raster_path) as src:print("CRS:", src.crs)print("分辨率:", src.res)print("宽x高:", src.width, src.height)print("波段数量:", src.count)print("边界范围:", src.bounds)# 可选:读取第一波段并做简单统计band1 = src.read(1)print("像元统计(波段1):min=", band1.min(), "max=", band1.max())
1.6 流程图/架构图
图示不是装饰,而是对“可复现流程”的公开承诺。下面的流程图与架构图,帮助你在团队协作中让别人一眼看懂你的实践路径与工程组织。
1.6.1 基本数据处理流程(Flowchart)
flowchart LRA[数据获取\n(OSM/GeoJSON/GeoTIFF)] --> B[数据检查\nCRS/属性/质量]B --> C[重投影\nEPSG:4326→3857/UTM]C --> D[制图表达\n底图/叠层/符号化]D --> E[输出与报告\nPNG/GeoPackage/说明文档]
1.6.2 最小工程架构(Architecture)
graph TDroot[gis_examples/] --> ds[datasets/]root --> mod01[modules/01_basics/]mod01 --> nb[notebooks/]mod01 --> src[src/]mod01 --> out[outputs/]ds --> basics[basics/]
1.7 输出与评价标准
- 必做输出:
vector_view.png:矢量数据浏览图件。reproject_compare.png:重投影前后对比图。osm_roads.png:城市道路网络渲染图。
- 文档与说明:
- 简要报告(数据来源/CRS/步骤与结果说明)。
- 工程结构一致性(目录、文件命名与路径)。
- 评价维度:
- 正确性(CRS 设置与重投影步骤合理)。
- 完整性(代码可运行、输出齐全)。
- 表达性(图件清晰、标注规范)。
1.8 常见错误与排障
- 源数据缺少或错误的 CRS:使用
set_crs明确设置源坐标系;查阅数据提供方元数据。 - Shapefile 导出字段截断:字段名过长或中文编码导致异常,建议使用 GeoPackage 或简化字段名。
- OSMnx 请求失败:网络问题或查询范围不合理,缩小范围或更换
place字符串;必要时使用代理。 - 栅格与矢量混用坐标不一致:确保两类数据投影一致后再进行叠加与分析。
1.9 延伸阅读与资源
- EPSG Registry: https://epsg.io/
- GeoPandas 文档: https://geopandas.org/
- Rasterio 文档: https://rasterio.readthedocs.io/
- OSMnx 文档: https://osmnx.readthedocs.io/
- 投影与地图表达概论(推荐教材章节/博客文章)
1.10 本章总结
当一个空间问题被拆解为“数据—坐标—表达”的流程,GIS 才真正发挥作用。你已经把矢量与栅格放进统一的坐标参考系,在最小工程结构里完成了从加载到导出的一次闭环。请在本章结束后自检:
- 我是否清楚数据的来源与坐标?
- 我是否能解释重投影的必要性与选择依据?
- 我的图件是否让非技术读者也能读懂结论?
在下一章,我们将把“空间对象与关系”进一步形式化,走向拓扑与网络分析的基础,这会让“学校、道路与人群”之间的联系更可计算、也更接近你的问题本身。
