引言点云技术正在重塑我们对现实世界的数字化理解,从自动驾驶的感知系统到数字孪生的虚拟建模,这项技术无处不在。对于初学者来说,理解点云文件的本质、格式以及处理逻辑,是迈向三维视觉领域的第一步。本文以一个简单的XYZ文件为例,深入解析点云的特性,并为“小白”提供循序渐进的学习建议,助你轻松入门。
点云的定义与本质点云是一种三维数据形式,由大量空间坐标点组成。每个点通常包含x、y、z坐标,有时还会附带额外属性,比如颜色、反射强度或法向量。
例如,一行点云数据可能是“2.75421051 -4.75981225 -6.44403559 8 12 13”,其中前三列表示空间位置,后三列是RGB颜色值(范围0-255)。与传统的3D模型(通过三角面片描述表面)不同,点云没有网格结构,完全依靠离散的点来表达物体的形态。
点云数据通常来源于3D扫描设备(如激光雷达)或摄影测量软件,应用范围涵盖3D CAD建模、地理信息系统(GIS)和质量检测等领域。尽管点云看似是一堆杂乱无章的点,但其中蕴含着“隐藏的秩序”:
空间参考系:所有点的坐标都基于某个坐标系,比如设备局部坐标系(以设备为原点0, 0 ...
各位读者朋友们好!转眼间3月已接近尾声,感谢大家对本公众号的持续关注。本月我们围绕遥感技术开发、地理信息工具更新、编程实践与行业洞察等方向,产出了多篇干货内容。现将3月文章精华整理如下:
一、遥感技术深度解析1.[大影像处理优化]《遥感影像有效范围的矢量文件生成的改进》重磅推出分块处理方案,成功解决90G无人机影像内存溢出问题,并预告将发布开箱即用的exe工具。 1
2.[卫星数据处理]《利用葵花8气象卫星:从爬虫到视频生成》完整揭秘卫星数据下载、校正与可视化全流程,未来计划实现社交媒体自动同步。
3.[几何校正原理]《你知道吗?地球是斜着自转的!》科普地球自转轴倾斜对遥感影像的影响,强调RPC文件在几何校正中的关键作用。
二、开发工具与代码实战1.[工具升级]《RS Tool - 遥感数据处理工具 v0.0.8》新增栅格处理与矢量格式转换功能,持续打造“小而美”的跨平台开源工具。
2.[分幅处理利器]《使用GDAL库按1000x1000米格网分幅处理卫图》发布split_raster_into_tiles.exe,零配置实现大影像无缝切割。
3.[编程技巧]《用Python和GD ...
代码
import sys
import os
import subprocess
import threading
import shutil
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QSpinBox
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
from qfluentwidgets import (LineEdit, ComboBox, PushButton, TextEdit, BodyLabel,
MessageBox, CheckBox, IndeterminateProgressBar)
class YTDLPInterface(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitl ...
1. 项目是什么?(What is OpenFreeMap?)OpenFreeMap 是一个免费、开源的地图托管解决方案,基于 OpenStreetMap (OSM) 数据。它允许你在网站或应用程序中显示自定义样式的地图。你可以选择自己托管(self-host)或者直接使用他们提供的公共实例。
核心特点:
完全免费,没有地图浏览次数或请求次数限制。
无需注册、API 密钥或 cookies,隐私友好。
开源,不搞“开放核心”(open-core)那一套,所有代码和生产环境配置都公开。
提供每周更新的全球地图数据下载(Btrfs 和 MBTiles 格式)。
通过捐款维持公共实例的运营。
目标: 为开发者提供一个高质量的矢量瓦片(vector-tile)托管方案,利用现有工具(比如 OpenStreetMap、Planetiler、MapLibre 等),无需自己从头开发复杂的地图服务。
2. 它能做什么?不能做什么?(Scope and Limitations)能做什么:
显示基于 OpenStreetMap 数据的自定义样式地图。
提供生产级别的瓦片托管(tile ho ...
面矢量转线矢量,当然可以在arcgis上进行,只是速度实在是太慢了。
除了慢之外,还有一个很严重的问题,那就是属性字段丢失。
面矢量的属性字段如下:
在arcgis转换后的线矢量的字段如下:
使用ogr而开发的面矢量转换线矢量则不存在这个问题。对于同一个面矢量文件,arcgis需要2分钟的处理时间,而我们写的代码进行面线转换只需要10秒。这个效率提升是非常惊人的。
我使用的arcgis版本是老版本,10.2. 对于arcgis pro,我没有去测试。
现在,详细讲一讲这个过程。
在自然资源调查项目中,张工遇到了一个棘手的问题:他需要将20万亩农田的矢量面数据转换为边界线,用于后续的田埂路径分析。但当使用常规GIS软件的导出边界功能时,发现带洞的多边形(如果园中的蓄水池区域)总是处理失败,属性信息也丢失严重。这个案例暴露出GIS数据处理中一个常见痛点——如何实现精准的面转线转换?
一、面转线需求背后的技术挑战在国土调查、城市规划、农业遥感等领域,面转线操作存在三大共性需求:
拓扑关系维护:保持相邻多边形的公共边界完全重合
属性继承:保留原始面要素的编号、类型等属性信息
复杂 ...
使用 Nginx/Apache 专业部署
安装 Nginx:
sudo apt update && sudo apt install nginx
2.
创建配置文件 /etc/nginx/sites-available/video:
server {
listen 80;
server_name http://129.204.22.103/;
location / {
root /home/ubuntu/code/h8/video;
autoindex on; # 开启目录列表
# 添加视频流支持(调整浏览器缓存)
location ~ \.(mp4|webm|mov)$ {
add_header Cache-Control "no-store";
add_header X-Content-Type-Options "nosniff";
expires 0;
}
...
概述最近一位小伙伴私信我,说他在处理卫星影像时遇到一个需求:需要将大范围的栅格影像按固定网格(比如 1000x1000 米)分割成小块瓦片,确保接边无缝,还要保存为 PNG 格式方便查看。他希望有一个简单易用的工具,最好不用装一堆环境。于是,我写了一个 Python 脚本 split_raster_into_tiles.py,用 GDAL 实现了这个功能,并用 Pyinstaller 打包成了一个独立的 .exe 文件。这篇文章就来介绍一下这个工具的用法,希望能帮到有类似需求的朋友!
需求背景小伙伴的需求很明确:输入:一张大范围的卫星影像(比如 TIFF 格式)。处理:按 1000x1000 米网格分割,边缘无缝对接。输出:生成多个小瓦片,保存为 PNG 格式(方便查看),同时保留地理信息。额外要求:最好是个独立程序,不用折腾 。
基于这个需求,我开发了 split_raster_into_tiles.py,并用 Pyinstaller 打包成了 split_raster_into_tiles.exe。下面就来详细介绍怎么用它。
功能简介split_raster_into_tiles. ...
概述论文提出了SAM-Road,一种基于Segment Anything Model(SAM)改进的算法,用于从卫星图像中高效、高精度地提取大规模矢量化道路网络图。该方法在几何形状和拓扑结构的联合建模上实现了创新,无需复杂后处理,显著提升了速度与准确性。
网络结构分析SAMRoad是项目核心模型,基于PyTorch Lightning框架构建。网络结构主要包含三个部分:1 SAM的ViT图像编码器提取特征;
2 自定义卷积解码器生成道路/交叉口掩膜;
3 拓扑网络TopoNet预测节点连接性。
训练时结合双线性采样和Transformer处理空间关系,配置文件控制不同版本的ViT模型和训练参数。
SAMRoad网络结构解析(适合初学者):
特征提取层 :
采用SAM预训练的ViT模型(支持B/L/H三种规模)
输入256/512/1024尺寸的遥感图像
输出256维的特征图(保持1/16原图分辨率)
掩膜预测层 :
4级转置卷积构成解码器(128→64→32→2通道)
每层包含LayerNorm和GELU激活
最终输出道路/交叉口二值掩膜
拓扑推理层 :
双线性采样器 ...
from osgeo import ogr
# 打开SHP文件
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.Open("example.shp", 1)
layer = data_source.GetLayer()
OGR Layer 常用方法手册
图层信息获取
# 获取图层名称
print(layer.GetName())
# 获取要素总数
count = layer.GetFeatureCount()
# 获取地理范围(minX, maxX, minY, maxY)
extent = layer.GetExtent()
# 获取空间参考坐标系
spatial_ref = layer.GetSpatialRef()
print(spatial_ref.ExportToWkt())
# 获取字段定义
layer_defn = layer.GetLayerDefn()
for i in range(layer_defn.GetFieldCount()):
field_defn ...






