当前位置:首页>python>从零开始,用Python画一张地图——瑶瑶手把手GIS入门课

从零开始,用Python画一张地图——瑶瑶手把手GIS入门课

  • 2026-09-10 05:34:51
从零开始,用Python画一张地图——瑶瑶手把手GIS入门课
GIS+AI工具箱 · 第1期

嘿!我是瑶瑶 👋

你可能在前面的文章里见过我的名字——没错,就是那个每次都在文章末尾写"编辑/云瑶"的幕后打工人。

这期不一样,这期我来教你写代码。

嗯?你说你连Python是什么都不知道?

巧了,云杉哥哥(就是你们看到的那个"审核/云杉")也啥都不会。你们知道他为了学会我写的那些脚本,折腾了多久吗?我写的学习脚本每行都标了中文注释,他还跑来跟我说"瑶瑶我看不懂"……

所以放心,这期教程的目标就是:让比云杉哥哥还笨的人也能看懂(开玩笑的,云杉哥哥看到别打我 😂)

下面开始上课!


🗺️ 先说说我们的数据从哪来

在动手敲代码之前,得先知道数据从哪来。放心,不花钱。

① OpenStreetMap(OSM)全球最大的开源地图,全世界的网友一起维护的。路网、建筑、公园、学校……啥都有,随便下,全免费。我们前三期的数据基本都从这薅的。

② 天地图中国官方的地图平台,自然资源部运营的,卫星影像贼清晰。第四期画湖泊边界就用的它当底图。

③ HydroLAKES全球湖泊数据库,140万个湖泊的边界都在里面。我们第四期的湖泊数据就是从这来的。

反正记住一句话:搞GIS分析,最贵的是脑子,不是数据。


🧪 三期核心算法,带代码讲给你听

下面我把三期文章的核心算法拆开揉碎了讲给你。

每一段都附了核心代码——不用现在敲,先看明白逻辑。学习资料包里有完整的脚本文件,每行都有中文注释(比云杉哥哥看的那个版本还详细,他再敢说看不懂我就要生气了 😤)。


① 建筑覆盖率怎么算?(对应第2期·雄安七年)

第2期我们干了件什么事?就是把雄安2017年和2026年的卫星图叠在一起,算建筑覆盖率的变化。

听起来很玄乎?核心代码就这么几行:

# 下载建筑数据(building=True 就是要全部建筑)buildings = ox.features_from_place(”雄安新区, 中国”, tags={'building': True})# 投影到等面积坐标系——不投影的话面积算不准# 因为地球是圆的,地图是平的,直接算会变形buildings_proj = buildings.to_crs('EPSG:32650')# 覆盖率 = 建筑总面积 ÷ 区域总面积 × 100coverage = buildings_proj.area.sum() / total_area * 100

核心就三行:下载 → 投影 → 算比例。没了。

你可能会问:"瑶瑶,就这么简单?" 对,就这么简单。剩下的大部分代码都是在"画图让它好看",真正算数据的就这几行。


② 路网方正度怎么算?(对应第3期·路网最正城市)

第3期的结论你还记得吗?最"正"的不是西安,而是雄安。

这个"正"是怎么算出来的?看代码:

# 下载城市路网(drive=只要机动车道,不要人行道)G = ox.graph_from_place(”石家庄市, 河北省”, network_type='drive')_, edges = ox.graph_to_gdfs(G, nodes=False)# 对每条路:算它从起点到终点的方向角度for each road: calculate bearing from start to end# 核心公式:偏离度 = 方向映射到0~90°,再取平均# 0°=正南正北,90°=正东正西,都算”正的”# 45°=彻底斜着deviations = min(bearing % 90, 90 - bearing % 90)mean_deviation = mean(deviations)

石家庄 6.36°,西安 8.02°,成都 21.57°——这些数字就是这么蹦出来的。

云杉哥哥第一次跑这个脚本的时候,盯着玫瑰图看了十分钟,然后问我:"瑶瑶,这个图是不是画错了?成都怎么是最歪的?"

我说:"哥,数据不会骗人,成都的路就是歪的,这是府南河和放射路网的锅。"


③ 湖泊圆形度怎么算?(对应第4期·最圆的湖)

第4期我们测了20个湖,湖光岩最圆(PP=0.8337),鄱阳湖最不圆(PP=0.0190)。

PP 是啥?Polsby-Popper 圆形度,公式:4π × 面积 ÷ (周长 × 周长)

说白了就是:同样面积的形状里,圆的周长最短。所以你算出来的周长越接近"最短",就越圆。

# 读湖泊边界lake = gpd.read_file(”湖光岩.geojson”)# 投影,算面积和周长lake_proj = lake.to_crs('EPSG:32650')area = lake_proj.area[0]perimeter = lake_proj.length[0]# 套公式pp = 4 * 3.14159 * area / (perimeter * perimeter)

这一行公式,就能区分湖光岩(圆得像橙子)和鄱阳湖(扁得像鞋垫)。


总结一下三期核心算法:

就这?对,就这。Python 就是这么强大。


📦 学习资料包里有什么

我整理了前三期的完整学习脚本,每行代码都有中文注释(云杉哥哥亲测能看懂版)。

悄悄跟你们说,云杉哥哥太笨了,我写得这么详细他还跟我说看不懂。大家肯定比他聪明,一看就能看懂!😂

学习资料包/├── 📁 三期源码/ ← 主菜!三期完整脚本│ ├── 01_建筑覆盖率分析.py ← 第2期·雄安七年│ ├── 02_路网方向分析.py ← 第3期·路网最正城市│ └── 03_湖泊圆度计算.py ← 第4期·最圆的湖├── 📁 小作业_绿地分析/ ← 进阶任务(给学有余力的你)│ ├── 绿地分析_核心代码.py ← 填空框架│ └── 操作指导.md ← 答案提示├── 📁 数据/ ← 离线也能跑的样例└── 🔧 运行环境说明.md ← 环境配置

🎯 小作业:画出你家附近的绿地

跑完三期源码觉得不过瘾?来试试自己动手——

我准备了一个代码框架(在「小作业」文件夹里),里面用 XXX 标记了需要你填空的地方。

答案都在三期源码里,你对照着找就行:

填对了就能画出自己城市的绿地地图。填错了……那就多试几次,反正又不会烧电脑。


🔮 下期预告

下期我们拿你们画出来的绿地地图说事——你所在的城市,公园够用吗?有没有"公园荒漠"?


👇 如何获取学习资料包?

关注公众号「趣说图壤」,后台回复「GIS入门」,即可获取下载链接。

📌 关注 → 回复「GIS入门」→ 下载学习包 →和云杉笨蛋一起学代码😂

让我们一起,用数据重新认识脚下的世界。


—— 趣说图壤

编辑 / 云瑶(审核?这期我自己就是审核,云杉哥哥去学代码了 😎)

参考数据 / OpenStreetMap(© OpenStreetMap contributors)

—— 俯瞰大地,细数星河

📍 河北·石家庄📅 2026.07 · GIS+AI工具箱第1期

本文及配图版权归「趣说图壤」所有,未经许可不得转载或商用。

最新文章

随机文章