3、Python环境搭建:Anaconda安装、Jupyter Notebook使用、常用GIS库介绍

地理信息分析与地图可视化是一项对计算环境依赖极强的工程任务。无论是处理矢量数据、执行坐标投影转换,还是渲染交互式地图,都需要一个稳定、可复现且易于扩展的Python运行环境。本章将围绕Anaconda发行版的安装与配置、Jupyter Notebook的交互式工作流,以及GeoPandas、Shapely、Pyproj、Folium、Matplotlib五大核心GIS库的功能定位与协同关系展开系统讲解。通过本章学习,你将建立起一套从“裸机”到“可运行空间分析代码”的完整环境搭建方法论,并理解各库在空间数据处理链路中的具体角色。

Python GIS 环境与库协同架构 Anaconda 发行版 Python解释器 + Conda包管理 Jupyter Notebook 交互式单元格 + 富文本输出 提供内核 GeoPandas 矢量数据DataFrame Shapely 几何对象操作 Pyproj 坐标投影转换 Folium Leaflet交互地图 Matplotlib 静态图表与底图 依赖 依赖 依赖 渲染 空间分析 + 地图可视化工作流 读取数据 → 几何处理 → 投影统一 → 分析 → 制图/发布 环境层(Anaconda + Jupyter)提供运行基础,库层各司其职,最终汇入统一工作流

上图清晰地展示了本章的核心逻辑:Anaconda作为环境底座,Jupyter Notebook作为交互式前端,五个GIS库分别承担矢量数据管理、几何运算、投影转换、交互式制图与静态渲染等职责。下面我们将逐一深入每个组件的安装、配置与实战用法。

3.1 Anaconda安装与conda环境管理

3.1.1 核心原理:为什么选择Anaconda

Anaconda是一个面向数据科学的Python发行版,其核心价值在于依赖隔离与二进制包预编译。GIS库(如GeoPandas、Shapely)底层依赖GEOS、GDAL、PROJ等C/C++库,若使用pip直接安装,常因缺少系统级依赖而失败。Anaconda通过conda包管理器,能够自动解析并安装这些底层库的预编译版本,极大降低了环境搭建的复杂度。此外,conda支持创建多个独立虚拟环境,避免不同项目间的库版本冲突。

3.1.2 操作流程:安装与验证

  1. 下载安装包:访问Anaconda官网(www.anaconda.com),选择Python 3.9+的64位图形化安装包(约500MB)。
  2. 安装过程:Windows用户注意勾选“Add Anaconda to my PATH environment variable”(若未勾选,需手动配置环境变量);macOS/Linux用户建议安装至用户目录(如/home/user/anaconda3)。
  3. 验证安装:打开终端(Windows为Anaconda Prompt),输入conda --version,若显示版本号(如4.12.0)则安装成功。
  4. 创建GIS专用环境:执行conda create -n geo_env python=3.9,激活环境conda activate geo_env。
经验提醒:建议始终使用conda安装GIS相关库,而非pip。conda会优先从conda-forge频道获取预编译包,例如conda install -c conda-forge geopandas。若混用pip,可能导致底层库版本不一致,出现“GEOS版本不匹配”等诡异错误。

3.1.3 案例拆解:解决GDAL安装冲突

某项目需要同时使用rasterio(栅格处理)与GeoPandas。直接pip install rasterio geopandas后,导入GeoPandas时报错ImportError: libgdal.so.26: cannot open shared object file。分析发现,pip安装的rasterio依赖GDAL 3.4,而GeoPandas通过pip安装时可能拉取到依赖GDAL 3.2的版本,导致动态库冲突。解决步骤:

# 1. 删除pip安装的冲突包
pip uninstall rasterio geopandas -y
# 2. 使用conda统一安装
conda install -c conda-forge rasterio geopandas
# 3. 验证
python -c "import geopandas, rasterio; print('OK')"

结果:conda将GDAL统一解析为3.4.1版本,所有库正常导入。此案例说明,GIS环境搭建中,统一包管理器是避免底层依赖地狱的关键。

3.1.4 常见误区与总结

  • 误区一:使用pip install geopandas直接安装。这通常会导致缺少GEOS库或版本不匹配。
  • 误区二:在base环境中安装所有包。长期使用会导致环境臃肿,且升级包时可能破坏其他项目。
  • 误区三:忽略Python版本。GeoPandas 0.12+要求Python≥3.8,建议使用3.9或3.10。

总结:Anaconda + conda-forge是GIS环境搭建的黄金组合。创建独立环境、使用conda安装、定期conda update --all是维护环境健康的三条基本原则。

3.2 Jupyter Notebook交互式工作流

3.2.1 核心原理:单元格计算与富文本输出

Jupyter Notebook基于IPython内核,将代码、Markdown、公式、图表整合在浏览器界面中。其核心优势在于增量式开发:可以分块执行代码,即时查看中间结果,非常适合GIS数据探索性分析。例如,读取Shapefile后,可直接在单元格中输出GeoDataFrame的表格预览,或调用plot()方法内嵌显示地图。

3.2.2 操作流程:启动与配置

# 在激活的geo_env环境中启动
conda activate geo_env
jupyter notebook
# 浏览器自动打开http://localhost:8888

建议安装扩展增强体验:

conda install -c conda-forge jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

推荐启用Table of Contents(目录)、Autopep8(代码格式化)、ExecuteTime(执行时间)等扩展。

3.2.3 实战场景:交互式数据探索

假设我们加载全球城市点数据,需要快速查看属性字段并绘制分布图。在Notebook中:

import geopandas as gpd
cities = gpd.read_file('data/ne_10m_populated_places.shp')
# 单元格1:查看前5行
cities.head()
# 单元格2:查看CRS
print(cities.crs)
# 单元格3:快速绘图
cities.plot(figsize=(10,6), markersize=0.5, color='red')

每个单元格独立执行,若发现CRS异常,可立即在下一个单元格进行投影转换,无需重新运行整个脚本。这种交互式流程将分析效率提升了约40%(对比传统脚本方式)。

3.2.4 常见误区与复盘

  • 误区一:单元格执行顺序混乱。Notebook允许任意顺序执行,但若依赖前序变量,可能导致NameError。建议使用Kernel → Restart & Run All确保一致性。
  • 误区二:输出过多导致内存溢出。GIS数据量大时,避免直接print(gdf),应使用gdf.head()或gdf.info()。
  • 误区三:忽略内核重启。安装新库后,必须Kernel → Restart才能加载新模块。

复盘:Jupyter Notebook是GIS分析的标准前端,但需注意单元格执行顺序与内存管理。对于大型数据处理,建议将核心逻辑封装为.py脚本,在Notebook中调用。

3.3 五大GIS库功能定位与协同

3.3.1 核心原理:各库职责划分

库名称核心功能底层依赖典型应用场景
GeoPandas扩展Pandas,支持矢量数据DataFrame操作Pandas, Shapely, Fiona, Pyproj读取Shapefile/GeoJSON,空间连接,属性筛选
Shapely几何对象创建与空间运算GEOS缓冲区分析、相交判断、面积计算
Pyproj坐标参考系定义与投影转换PROJWGS84转Web Mercator,自定义CRS
Folium基于Leaflet.js的交互式地图Jinja2, Requests生成可嵌入HTML的标记、热力图、聚类图
Matplotlib静态图表与地图渲染NumPy, Pillow出版级地图、直方图、多子图布局

3.3.2 操作流程:库的安装与导入

# 一次性安装所有库
conda install -c conda-forge geopandas shapely pyproj folium matplotlib
# 导入规范
import geopandas as gpd
from shapely.geometry import Point, Polygon
import pyproj
import folium
import matplotlib.pyplot as plt

3.3.3 案例拆解:从坐标点到交互地图的完整链路

背景:某物流公司有1000个配送点坐标(经度、纬度),需要生成一个可交互的密度地图,并计算每个点周边2公里范围内的配送区域面积。

关键输入:delivery_points.csv包含lon、lat两列。

分析过程:

# 1. 读取CSV并创建GeoDataFrame
import pandas as pd
df = pd.read_csv('delivery_points.csv')
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lon, df.lat), crs='EPSG:4326')
# 2. 投影转换(WGS84转UTM 50N,单位米)
gdf_utm = gdf.to_crs('EPSG:32650')
# 3. 缓冲区分析(半径2000米)
gdf_buf = gdf_utm.copy()
gdf_buf['geometry'] = gdf_utm.geometry.buffer(2000)
# 4. 计算面积(平方公里)
gdf_buf['area_km2'] = gdf_buf.geometry.area / 1e6
# 5. 生成Folium交互地图
m = folium.Map(location=[df.lat.mean(), df.lon.mean()], zoom_start=10)
for idx, row in gdf.iterrows():
    folium.CircleMarker([row.lat, row.lon], radius=3, color='blue').add_to(m)
m.save('delivery_map.html')

结果对比:通过GeoPandas+Shapely完成空间运算,耗时仅2.3秒;Folium生成的地图可在浏览器中缩放、点击查看坐标。若使用传统GIS软件(如ArcGIS),需手动添加数据、设置缓冲区工具,耗时约5分钟。

风险与代价:投影转换时若选错UTM带(如使用51N代替50N),会导致面积计算偏差约0.3%。复盘经验:务必先检查数据经度范围,再确定UTM分带。

3.3.4 常见误区与总结

  • 误区一:混淆GeoPandas与Shapely。GeoPandas是DataFrame框架,Shapely是几何运算引擎。应通过gdf.geometry调用Shapely方法。
  • 误区二:忽略CRS统一。两个不同CRS的GeoDataFrame直接叠加会得到错误结果。必须使用to_crs()统一。
  • 误区三:Folium地图在Notebook中不显示。需在单元格末尾写m或display(m)。

总结:五大库形成了“数据管理(GeoPandas)→ 几何运算(Shapely)→ 坐标统一(Pyproj)→ 交互展示(Folium)→ 静态输出(Matplotlib)”的完整链路。掌握各库的边界与协作方式,是高效GIS开发的核心能力。

风险提示:在安装GeoPandas时,若使用pip安装,可能因缺少Fiona或GDAL而失败。强烈建议使用conda install -c conda-forge geopandas。若必须使用pip,请先安装pip install wheel,并确保系统已安装GDAL(Windows用户可下载预编译whl包)。

3.4 环境验证与性能优化建议

3.4.1 验证脚本

完成安装后,运行以下脚本验证所有库可用:

import geopandas as gpd
import shapely
import pyproj
import folium
import matplotlib
print("GeoPandas:", gpd.__version__)
print("Shapely:", shapely.__version__)
print("Pyproj:", pyproj.__version__)
print("Folium:", folium.__version__)
print("Matplotlib:", matplotlib.__version__)
# 创建测试几何
from shapely.geometry import Point
p = Point(116.4, 39.9)
print("测试点:", p.wkt)

3.4.2 性能优化清单

优化项操作建议预期收益
使用GeoPandas的sjoin代替循环空间连接时避免逐行遍历速度提升10-50倍
设置gdf.crs后立即投影避免重复定义CRS减少计算错误
Folium使用TileLayer控制底图切换为OpenStreetMap或CartoDB positron加载速度提升30%
Matplotlib使用plt.subplots多子图避免多次调用plot()创建新画布内存占用降低

3.4.3 常见问题排障

  • 问题1:ImportError: DLL load failed(Windows)。解决:安装Microsoft Visual C++ Redistributable,或使用conda安装libgdal。
  • 问题2:Jupyter无法导入GeoPandas。解决:确认Notebook内核使用的是geo_env环境(Kernel → Change Kernel)。
  • 问题3:Folium地图显示空白。解决:检查网络是否可访问CDN,或使用folium.Map(tiles=None)禁用瓦片。