惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
《GIS基础原理与技术实践》配套案例(Python版)
charlee44 · 2026-05-28 · via 博客园_首页

🚀 快速开始

1️⃣ 安装 Conda 环境

本项目依赖 Conda 进行环境隔离与包管理。如果您尚未安装 Conda,请根据个人习惯选择以下任意一种发行版进行安装:

  • Anaconda:功能全面的科学计算发行版(如果您已安装 Anaconda,可跳过此步骤)。
  • Miniconda:仅包含 Conda 和 Python 的轻量级发行版,推荐追求简洁环境的用户。

2️⃣ 获取项目代码

克隆或下载本项目到本地目录,在根目录的 Python 子目录中找到并确保包含核心配置文件 environment.yml

3️⃣ 创建专属环境

在终端(Terminal / CMD / PowerShell)中进入 Python 目录文件夹,运行以下命令一键创建名为 gis-basic 的虚拟环境:

conda env create -f environment.yml

💡 注意:首次创建可能需要几分钟时间,请耐心等待依赖包下载与解析完成。

4️⃣ 激活环境

环境创建成功后,执行以下命令切换至该环境:

conda activate gis-basic

5️⃣ 配置环境变量

本项目的部分案例需要读取外部数据路径。请在运行代码前设置全局环境变量 GISBasicRepo,指向您的项目根目录

  • Windows (PowerShell):
    $env:GISBasicRepo = "D:\Github\GISBasic"
    
  • macOS / Linux:
    export GISBasicRepo="/path/to/GISBasic"
    

上述命令仅在当前终端会话中有效。为了获得最佳体验,建议您将其配置为系统的持久化全局环境变量,这样在任何位置启动项目都能自动识别路径。

⚠️ 注意Python版案例与原书案例(C++版案例)设置的环境变量不同,请注意区分。

6️⃣ 运行示例

环境准备就绪后,您可以运行任意示例代码进行测试:

python example-3-1-srs.py

📌 运行说明

由于开源生态的持续演进,第三方依赖库的版本迭代较快,加之网络环境的差异,严格按照“快速开始”中的步骤有时可能会遇到不可预见的兼容性问题。因此,本项目的运行并不强制绑定特定的 Conda 环境。

如果您在复现过程中遇到阻碍,完全可以采用本地已有的 Python 环境或其他包管理工具进行替代。无论使用何种环境构建方案,请确保您的系统中已正确安装并配置了以下核心依赖库:

  • 空间数据处理: GDAL, GEOS, PROJ
  • 科学计算: NumPy, SciPy
  • 几何算法: triangle (约束三角剖分), trimesh
  • 计算机视觉: OpenCV

若您使用的依赖库版本与本项目存在较大差异,部分代码可能需要根据新版 API 进行微调即可正常运行。

在实际的 GIS 开发与学习中,单纯依赖终端命令往往不够高效。建议您使用专业的集成开发环境(IDE)来查阅代码、断点调试及可视化输出。Visual Studio Code (VS Code) 凭借其轻量级和高扩展性,是运行本书案例(Python版)的理想选择。具体的 VS Code 安装与 Python 运行教程,网络上已有海量优质资源,建议读者按需检索学习。

🔍 版本差异

由于底层语言生态与运行机制的根本性不同,本书的 Python 案例版本与 C++ 案例版本在实现细节上存在一定差异。这些差异主要体现在以下三个方面:

1️⃣ 生态限制与替代方案

部分在 C++ 领域极为专业的第三方库(如 CGALOpenSceneGraph),官方并未提供完善的 Python 绑定接口。为了兼顾案例的可运行性与代码复杂度,笔者在 Python 版本中采用了功能相近的开源库进行替代。另外,存在极少数案例找不到第三方库的替代方案,无法实现 Python 版本的案例。

2️⃣ 数据处理机制差异

Python 作为解释型语言,在处理大规模栅格数据(数字图像处理)时,其内存访问效率远低于编译型的 C++。如果在 Python 中直接沿用 C++ 式的多重 for 循环去遍历像素矩阵,将会产生巨大的性能开销,导致程序运行极慢,从而使教学案例失去实际运行的意义。为了解决这一痛点,Python 版本部分案例采用了 NumPy 向量化操作。这种机制将底层的循环交由高度优化的 C/Fortran 库去执行,实现了真正的并行加速。

举例说明

假设我们需要对一幅栅格影像的所有像素值统一乘以系数 0.5(例如进行亮度衰减处理):

  • C++ 风格(基于内存缓冲区的多重循环)
    // C++ 可以直接操作底层内存缓冲区,通过双重循环逐像素计算
    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            buffer[y * width + x] *= 0.5; 
        }
    }
    
  • Python 风格(NumPy 向量化操作)
    import numpy as np
    
    # Python 严禁使用嵌套循环遍历大数组,而是直接将整个矩阵视为一个整体进行数学运算
    # 这行代码背后会自动触发高度优化的底层并行计算,速度比循环快数百倍
    raster_array = raster_array * 0.5
    

3️⃣ 维度对齐机制

除了向量化操作,另一个 Python 空间计算的核心机制是广播机制(Broadcasting)。在 C++ 中,如果要对两个形状不同的矩阵进行加法运算,开发者通常需要手动编写复杂的嵌套循环来扩展维度或对齐索引;而在 NumPy 中,广播机制能够自动根据一定的规则将较小维度的数组“拉伸”以匹配较大维度的数组,从而在不实际复制内存数据的前提下完成高效的逐元素运算。

广播机制的核心逻辑可以概括为以下两点:

  1. 右对齐与补位原则:当两个数组的维度数量不一致时,NumPy 会从最右边的维度开始向前比对。如果某个数组的维度较少,系统会自动在其左侧(即前面)补充尺寸为 1 的维度,直到两者的维度数相同。
  2. 兼容扩展原则:在对应维度的尺寸上,只有满足以下两种情况之一,才能进行广播运算:
    1. 两个数组在该维度上的尺寸完全相等;
    2. 其中一个数组在该维度上的尺寸为 1(此时该维度会被隐式拉伸以匹配另一个数组的尺寸)。

举例说明

假设我们有一个代表高程数据的二维矩阵(3行4列),需要给每一行分别加上一个特定的偏移量(长度为4的一维数组):

import numpy as np

# 定义一个 3x4 的高程矩阵
elevation = np.array([
    [100, 101, 102, 103],
    [200, 201, 202, 203],
    [300, 301, 302, 303]
])

# 定义一个长度为 4 的行偏移向量
offset = np.array([1, 2, 3, 4])

# 直接使用加法!NumPy 会自动将 offset “广播”成 3x4 的矩阵,然后与 elevation 相加
result = elevation + offset

print(result)
# 输出结果:
# [[101 103 105 107]
#  [201 203 205 207]
#  [301 303 305 307]]

在这个例子中,二维矩阵 elevation 的形状是 (3, 4),而一维偏移向量 offset 的形状是 (4,)。根据广播规则,NumPy 首先在 offset 的左侧补一个 1,使其形状变为 (1, 4);随后发现其第一个维度为 1,便将其沿行方向隐式拉伸了 3 次,最终完美匹配成 (3, 4) 的形状完成加法运算。理解并熟练运用这些规则,将帮助读者在处理多维空间数据时,彻底告别繁琐的手动循环与维度拼接。

❓常见问题 (FAQ)

Q: 运行 conda env create 时速度极慢或报错怎么办?
A: 这可能是由于网络连接问题导致。environment.yml 中已经添加了清华源,您可以试试去掉使用代理,或者添加其他国内镜像源。

Q: 提示找不到 GISBasicRepo 环境变量?
A: 请确认您在第 5 步中正确设置了该变量。如果是在 IDE(如 VS Code 或 PyCharm)中运行代码,请记得在 IDE 的运行配置(Run Configuration)中手动添加该环境变量。

Q: 为什么 Python 版本的案例不完整?
A: 这些案例使用的第三方库找不到 Python 环境的替代方案,使用原生 Python 代码实现难度太高,这属于语言生态问题。

💻 配套开源项目GitHub | GitCode