简介:这份资源是面向Blender用户的BlenderGIS插件压缩包,用于在Blender与地理数据之间建立桥梁,帮助三维建模人员将真实地理信息引入场景,适用于地形建模、城市三维重建、GIS可视化等场景,对具备一定Blender基础、希望结合地理数据创作的中高级用户尤为实用。压缩包共131个文件,整体约402KB,以78个Python脚本为核心实现插件功能,另含32个SVG图标、13张PNG示意图,以及README说明、LICENSE授权、UI布局与版本配置等辅助文件,结构完整、便于直接安装使用。目前已有6855人学习下载,热度较高。借助该插件,读者可在Blender中导入并处理地理参考数据,完成相机与地形的地理配准、LiDAR点云与OSM数据加载等操作,为三维场景搭建、地形生成与地理可视化项目提供可复用的工具与思路,适合作为GIS与三维建模结合方向的学习与参考素材。
1. 拿到 3D-BlenderGIS.zip 之后:它到底解决什么、谁该上手
你手上如果有一个叫 3D-BlenderGIS.zip 的包,大概率是别人分享的 Blender GIS 工作流整合包,里面通常包含 Blender 插件本体、示例数据、可能还有几个预设脚本。它要解决的核心问题很具体:把真实地理坐标的矢量、栅格、地形数据,直接搬进 Blender 的三维场景里,让做城市建模、地形可视化、场景预演的人不用在 GIS 软件和三维软件之间反复导出导入。BlenderGIS 这个插件本身在开源社区里被反复讨论,热搜词也集中在它身上,但很多人卡在第一步——装完插件发现菜单出不来,或者底图加载一片空白。这篇笔记按「装什么、怎么配、数据怎么进、坑在哪」的顺序走一遍,适合做建筑可视化、游戏场景地形、规划汇报动画的从业者,也适合想用免费工具替代商业 GIS 三维管线的个人开发者。读完你应该能独立跑通一条从坐标数据到 Blender 可渲染场景的最小链路。
2. 装插件与配环境:BlenderGIS 能跑起来的前置条件
2.1 版本匹配是第一个硬门槛
BlenderGIS 不是一个随 Blender 官方分发的插件,它依赖 Blender 的 Python API 版本。Blender 2.8 到 3.x 之间 API 变动不小,插件作者通常按大版本分支维护。你拿到 3D-BlenderGIS.zip 后,第一件事不是双击安装,而是确认里面插件的目录结构和你的 Blender 版本对不对得上。常见做法是解压后看有没有__init__.py和blender_gis这类文件夹,bl_info里会写支持的 Blender 版本区间。如果版本不匹配,表现是插件能勾选但面板不出现,或者出现后点任何按钮都报AttributeError。
我一般会先建一个干净的 Blender 配置目录来测试,避免和已有插件冲突。命令行启动时指定配置路径:
blender --config /tmp/blender_gis_test --python-expr "import bpy; print(bpy.app.version_string)"这样启动后装的插件只影响这个临时配置,翻车了直接删目录,不用重装 Blender。参数说明:--config指定配置目录,--python-expr用来快速打印版本,确认 Python 控制台可用。逻辑是先把环境隔离,再谈功能。
2.2 安装路径与依赖补齐
Blender 装插件的标准路径是Edit > Preferences > Add-ons > Install,选 zip 文件。但 3D-BlenderGIS.zip 如果是整合包,里面可能不止一个插件,还可能有requirements.txt。BlenderGIS 依赖numpy、Pillow,部分底图功能还依赖requests。Blender 自带的 Python 不一定装了这些,尤其是requests。你可以在 Blender 的 Python 控制台里跑:
import sys print(sys.executable)拿到 Blender 内置 Python 的路径后,用它的 pip 装依赖:
/path/to/blender/python/bin/python -m pip install requests pillow numpy注意不要用系统 Python 的 pip,否则装到外面去了,Blender 里还是 import 不到。这一步的坑在于 Windows 下路径带空格,命令行要加引号。装完重启 Blender,在插件列表里搜 “GIS” 应该能看到 BlenderGIS,勾选后 3D 视图的侧边栏(按 N)会多出一个 GIS 面板。
2.3 底图源与网络配置的边界
BlenderGIS 的底图功能会去请求在线瓦片服务。这里只讨论公开的、合规的地图瓦片源,比如 OpenStreetMap 的标准瓦片。你在插件设置里填瓦片 URL 模板时,格式通常是https://tile.openstreetmap.org/{z}/{x}/{y}.png。如果加载不出来,先看 Blender 控制台报的是 403 还是超时。403 多半是 User-Agent 被拒,可以在插件设置里改请求头;超时则是网络环境问题,换一个可访问的瓦片源即可。不要在这个环节折腾非公开的代理配置,合规的公开源足够跑通流程。
提示:底图只用于参考定位,最终渲染不要依赖在线瓦片,导出前把底图转成贴图或直接删掉,避免场景文件里留一堆外部依赖。
3. 把 GIS 数据送进 Blender:矢量、栅格、地形三条路
3.1 矢量数据导入:Shapefile 与 GeoJSON 的坐标处理
BlenderGIS 导入矢量的入口在GIS > Import > Shapefile或GeoJSON。它会把要素转成 Blender 的曲线或网格。关键参数是 CRS(坐标参考系统)。Shapefile 自带.prj文件,插件会读;GeoJSON 按规范是 WGS84 经纬度。如果你导入后图形跑到很远的地方或者比例不对,基本是 CRS 没对上。常见做法是先在 QGIS 里把数据统一到以米为单位的投影坐标系,比如 Web Mercator 或当地 UTM 带,再导入 Blender。因为 Blender 场景单位默认是米,经纬度直接进来数值太小,会缩成一团。
导入时插件会问是否按场景单位缩放,我一般选是,然后手动检查包围盒。下面这段是在 Blender Python 控制台里批量导入一个目录下所有 Shapefile 的写法:
import bpy import os from blender_gis import shapefile_import # 实际模块名以插件为准 data_dir = "/data/gis/shp" for f in os.listdir(data_dir): if f.endswith(".shp"): path = os.path.join(data_dir, f) # 导入并指定 CRS,具体函数名参考插件 API shapefile_import.import_shapefile(path, crs="EPSG:3857") print("imported", f)逻辑说明:遍历目录,逐个导入,统一指定 EPSG:3857 让所有图层在同一投影下对齐。参数crs要和你数据实际坐标系一致,写错会导致偏移。如果插件 API 名字不同,以你版本里的实际函数为准,思路是批量循环加统一 CRS。
3.2 栅格与 DEM 地形:把高程变成可雕刻的网格
DEM(数字高程模型)导入是 BlenderGIS 最常用的功能之一。入口在GIS > Import > Georeferenced Raster,选 GeoTIFF。插件会读地理变换参数,生成一个带高度位移的平面网格。关键参数有三个:一是Subdivision或网格分辨率,决定地形精细度,太高会卡;二是Elevation Scale,把高程值映射到 Blender 的 Z 轴,单位不一致时要调;三是CRS,同样要对。我一般先用低分辨率跑通,确认位置对了再提高细分。
导入后地形是一个平面加位移修改器,不是实心体。要做雕刻或布尔,先应用修改器。如果高程看起来是平的,检查 GeoTIFF 是不是只有单波段且被当成颜色读了。可以在插件设置里强制指定波段。
3.3 用 BlenderGIS 做建筑体块:从轮廓到拉伸
拿到建筑轮廓矢量后,常见做法是导入为曲线,然后加Solidify或直接挤出。BlenderGIS 导入的曲线默认在 XY 平面,Z 为 0。你可以用 Python 批量给每个轮廓按属性里的层数字段拉伸:
import bpy for obj in bpy.context.selected_objects: if obj.type == 'CURVE': # 读取自定义属性里的高度,属性名以你的数据为准 h = obj.get("height", 10.0) obj.data.extrude = h # 转成网格方便后续操作 bpy.ops.object.convert(target='MESH')逻辑说明:遍历选中曲线,按属性高度挤出,再转网格。参数height来自你的属性表字段,没有就设默认值。这一步的坑是曲线挤出方向可能朝下,检查法线或加负号。批量处理后场景里就是一片体块城市,适合做规划体量分析。
4. 避坑与排查:BlenderGIS 最常见的 5 个翻车现场
4.1 插件面板不出现
现象:勾选了 BlenderGIS,但 3D 视图侧边栏没有 GIS 标签。原因:Blender 版本和插件版本不匹配,或者安装时选错了 zip 层级。解决:确认 zip 解压后第一层就是插件目录,不要多套一层文件夹;换对应 Blender 版本的插件分支重装。
4.2 底图加载空白或报错
现象:点底图按钮后一片灰,控制台报HTTPError 403或超时。原因:瓦片源拒绝请求或网络不可达。解决:换公开瓦片源,改 User-Agent,确认 URL 模板里{z}/{x}/{y}占位符没写错。不要用需要密钥的私有源。
4.3 导入矢量位置偏移
现象:Shapefile 导入后跑到场景角落,和底图对不上。原因:CRS 不一致,或者数据本身没有投影信息。解决:在 QGIS 里统一重投影到 EPSG:3857 再导出,导入时手动指定同一 CRS。
4.4 DEM 地形是平的
现象:GeoTIFF 导入后没有起伏。原因:高程波段没被识别,或者 Elevation Scale 设成了 0。解决:检查栅格波段数,在插件里指定高程波段;把缩放值调到合理范围,比如 1.0 或按实际单位换算。
4.5 场景卡顿到无法操作
现象:导入高精度 DEM 或大量建筑后 Blender 几乎卡死。原因:网格面数过高,实时预览扛不住。解决:导入时降低细分,或用Decimate修改器减面;把底图和高精度数据分集合隐藏,渲染前再显示。
5. 进阶:用几何节点和脚本把 GIS 流程半自动化
走到这里你已经能手动跑通导入,但实际项目里数据会更新,手动重复很痛苦。我一般会把常用步骤写成 Blender 的启动脚本,配合几何节点做参数化处理。比如地形导入后,用几何节点按高程着色,或者按坡度筛选区域。下面是一个用几何节点属性做高程分层的思路,不贴完整节点树,只给关键设置:在几何节点里用Position节点的 Z 值接Map Range,映射到颜色渐变,再连到材质输出。这样地形高低一目了然,改范围不用重新导入。
另一个实用技巧是批量导出。BlenderGIS 导入的图层命名往往带原始文件名,渲染前用脚本统一加前缀和整理集合:
import bpy for col in bpy.data.collections: for obj in col.objects: if obj.type == 'MESH' and not obj.name.startswith("GIS_"): obj.name = "GIS_" + obj.name逻辑是给所有网格加统一前缀,方便后续按名称筛选和批量操作。参数没有,纯命名规范。这招在场景里有几十个图层时特别省事,找对象不用翻半天。
最后说一个我自己的习惯:每次导入新数据前,先存一个空白工程做备份,导入后立刻检查包围盒和坐标原点。GIS 数据动辄几百米到几公里范围,原点跑偏了后面全白做。这个后悔药我吃过不止一次,现在成了肌肉记忆。希望帮到你。
本文还有配套的精品资源,点击获取