1. 环境搭建:别让第一步绊倒你
很多朋友一上来就想搞个炫酷的地图,结果在安装库这一步就卡了半天,最后兴趣全无。我刚开始玩Python GIS的时候也踩过不少坑,今天就把最顺滑的路径分享给你。Python做GIS开发,核心就是几个“轮子”(库),选对了,装好了,后面就是一路坦途。
首先,我强烈建议你使用 Anaconda 来管理你的Python环境。别嫌麻烦,这玩意儿能帮你避开99%的依赖冲突问题。GIS库之间关系复杂,比如GDAL这个底层巨兽,用pip直接装经常出幺蛾子。用Anaconda,一个命令就搞定所有依赖。打开你的终端(Windows用Anaconda Prompt,Mac/Linux用终端),创建一个专门用于GIS的环境:
conda create -n gis_env python=3.9
conda activate gis_env
环境名字gis_env你可以随便取,Python版本用3.8或3.9比较稳,太高版本可能有些库还没适配。激活环境后,你就进入了一个干净的“沙箱”,在这里面折腾,不会搞乱你电脑上其他的Python项目。
接下来是安装核心库。别一个个装了,用conda一条命令批量安装最省心:
conda install -c conda-forge geopandas rasterio shapely fiona matplotlib contextily jupyterlab
我解释一下这几个库是干嘛的,让你用起来心里有底。Geopandas 是绝对的主角,你可以把它理解为地理数据界的Pandas,能像操作Excel表格一样操作地图数据,核心数据结构GeoDataFrame就是带几何图形的表格。Rasterio 是处理栅格数据(卫星影像、DEM高程图)的利器。Shapely 是几何图形操作的引擎,点、线、面怎么算距离、求交集都靠它。Fiona 是读写各种矢量数据格式(如Shapefile)的后台。Matplotlib 负责画图可视化。Contextily 能轻松添加在线底图(比如OpenStreetMap)。JupyterLab 是我们的交互式笔记本,边写代码边看地图结果,体验极佳。
如果一切顺利,在JupyterLab里跑一下import geopandas as gpd没报错,恭喜你,你的GIS开发环境已经比很多人专业了。这里有个小坑提醒你:如果安装过程中卡住或者报错,多半是网络问题或者conda-forge通道没添加好。可以尝试换成国内的镜像源,比如清华源,速度会快很多。这一步基础打牢了,后面所有炫酷的操作才有了坚实的舞台。
2. 地图绘制:让你的数据“活”起来
有了数据,第一件事就是把它画出来看看。地图可视化不是简单的“显示”,而是探索数据的第一步。很多隐藏的模式和问题,看一眼地图就全明白了。咱们不用搞得太复杂,从最直接的Geopandas绘图开始。
假设你手头有一个城市的行政区划Shapefile文件(比如叫districts.shp)。用Geopandas读取它只需要一行代码:
import geopandas as gpd
import matplotlib.pyplot as plt
# 读取数据
districts = gpd.read_file('path/to/your/districts.shp')
# 看看前几行和数据的基本信息
print(districts.head())
print(districts.crs) # 查看坐标系
这里有个关键点:crs(坐标参考系统)。它定义了数据在地球上的位置。常见的有WGS84(EPSG:4326,经纬度)和Web墨卡托(EPSG:3857,网络地图常用)。如果坐标系不对,地图会显示错位,或者无法进行精确的空间计算。拿到数据先看crs是个好习惯。
画一张基础地图更简单:
fig, ax = plt.subplots(figsize=(10, 8))
districts.plot(ax=ax, edgecolor='black', facecolor='lightblue', linewidth=0.5)
ax.set_title('城市行政区划图', fontsize=16)
plt.show()
但这张图有点“素”,只有区块。我们经常需要叠加其他信息。比如,我想在各个行政区里填充上人口密度,颜色越深表示密度越高:
fig, ax = plt.subplots(figsize=(10, 8))
# 假设districts数据框里有一个‘population_density’列
districts.plot(ax=ax, column='population_density', cmap='OrRd', edgecolor='black', linewidth=0.5, legend=True, legend_kwds={'label': "人口密度 (人/平方公里)", 'shrink': 0.8})
ax.set_title('城市人口密度分布图', fontsize=16)
plt.show()
参数column指定了用哪一列的值来映射颜色,cmap是颜色方

683

被折叠的 条评论
为什么被折叠?



