最近遇到一个问题:怎么用线矢量去切割面矢量。这个功能看似很简单,其实还是要一定的功夫才能完成它。所以也才有了这篇技术文章的记录。
目的:使用线段分割多边形,并将分割后的多边形保存为Shapefile文件
代码#!/usr/bin/env python
# -*- coding: utf-8 -*-
import geopandas as gpd
from shapely.geometry import Polygon, LineString
from shapely.ops import split
def split_polygon_with_lines(polygon, lines):
# 使用每条线段分割多边形
for line in lines:
parts = [split(poly, line) for poly in polygon]
# 将列表扁平化并从GeometryCollection中获取几何体
polygon = [item for sublist in parts for item in sub ...
引言传统操作面矢量合并,在arcgis是一个常见的操作。使用ArcGIS合并重叠的多边形的步骤如下:
准备数据:首先需要准备待处理的重叠多边形数据,这可以通过遥感影像解译、野外实地调查等方式获得。
构建重叠区域图层:使用ArcGIS的”Union”工具,将重叠的多边形数据层合并为一个新图层。
进行拓扑合并:使用ArcGIS的”TopologicalUnion”工具,对重叠区域图层进行拓扑合并。这个过程会自动将重叠区域合并为一个新的多边形。
完成上述步骤后,即可完成多边形的合并。注意,以上步骤可能会根据具体的重叠情况和数据类型有所变化,需要具体问题具体分析。
那如何用代码实现这个功能呢?
测试数据以德国矢量作为测试数据。
代码#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : DissolveOverlappingPolygons.py
# 合并重叠的多边形
import fiona
from shapely.ops import unary_union
from shapely.geometry import sha ...
引言
打开不了shp文件同学们在平常使用arcgis的时候,是否遇到了下面这样的情况。
这是由于shp文件丢失了部分数据,导致在arcgis打不开。
1个 Shape文件结构Shape文件的文件构成Shape文件由3 个文件构成: 主文件、索引文件、数据文件。它们分别是“.shp” , “.shx””.dbf”文件。
如果数据文件dbf,丢失了部分数据,就会出现上面说的打不开的错误。
修复Shapefile的Python源代码Shapefile实际上是一组几个相关文件的集合,其中最重要的是.shp(包含几何信息)、.dbf(包含属性信息)和.shx(包含索引信息)文件。有时,.shp文件和.dbf文件中的记录数量可能会不一致,这可能会导致GIS软件无法正确读取Shapefile。这个脚本的目的就是修复这种不一致。
代码详解接下来,我将逐段解释这个脚本的代码:
导入所需的模块:脚本开始时,导入了需要的Python模块。这包括os、shutil(用于文件操作)、struct(用于处理二进制数据)和dbf(用于处理.dbf文件)。
定义RestoreShp类:这个类是脚本的核心,它包含了 ...
需求现在有一份SHP文件,需要把这份矢量文件制作为深度学习的标签。这时候第一个步骤是:把矢量栅格化。
代码#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/11/30 10:53
# @File : shp2tif.py
'''
shp to tif
'''
from osgeo import gdal, ogr
def shp_to_tiff(shp_file,refore_tif, output_tiff):
"""
将shp文件转换成tiff文件
:param shp_file: 边界矢量数据
:param output_tiff: 转换的tiff结果
:param projection: 转换后的tiff格式
:return: 矢量栅格图像
"""
# 读取shp文件
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.Open(s ...
在知乎上看到这个问题,记录一下解决的过程。
命令行的方式如果你安装编译好gdal,可以使用以下命令:
gdalwarp -tr 100 100 input.tif output.tif
代码的方式此外,你还可以用python代码的方式进行重采样,把影像重采样到100米。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/12/22 20:39
# @File : resample_100.py
from osgeo import gdal
def resample_to_100m(input_path, output_path):
"""Resamples a raster dataset to 100 meters using GDAL.
Args:
input_path: Path to the input raster dataset.
output_path: Path to the output raster dataset.
"""
...
需要把非84坐标的矢量转换为WGS84坐标的矢量。
方法介绍跟栅格数据投影转换一样,使用GDAL库,我们有两种方法进行矢量数据的重投影:
1.使用命令工具及其对应的命令行API接口进行转换(简单,准确,实践中一定要用这种方法)
GDAL提供了ogr2ogr命令行工具进行矢量数据投影转换,命令如下:ogr2ogr -t_srs "+proj=aea +lat_1=25 +lat_2=47 +lat_0=30 +lon_0=105 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs " China_Projected.shp China.shp
-t_srs选项制定输出数据投影,当然可以是ESPG,也可以是PROJ4或者OGC WKT格式的投影定义都OK
GDAL对该命令的封装的C/C++函数是GDALVectorTranslate(),Python中是gdal.VectorTranslate()
2.使用GDAL提供的基本API进行实现。如果要自己利用基本API函数实现的话,基本思路如下:
利用osgeo.ogr.Dri ...
pyside6
未读需求pyside6将图片资源转为py格式, 是为了打包为exe的时候不丢失图片文件
步骤新建img.qrc文件,例子如下:
<RCC>
<qresource prefix="pic">
<file>icon.jpg</file>
</qresource>
</RCC>
在img.qrc同名目录下,存在icon.jpg
在这个目录下,进入命令行输入
pyside6-rcc img.qrc -o img.py
在该目录下,生成一个img.py文件
在pyside6的主程序中调用图片资源
最后的界面如下:
某些地理空间数据格式很常见。但有些并不常见。笔者汇总 GIS 文件格式:
矢量 GIS 文件格式
矢量数据不是由像素网格组成的。相反,矢量图形由顶点和路径组成
矢量数据的三种基本符号类型是点、线和面(面)。这些GIS文件格式包含矢量数据。
文件类型
后缀
描述
Esri Shapefile
.SHP,.DBF,.SHX
到目前为止,shapefile 是最常见的地理空间文件类型。所有商业和开源都接受 shapefile 作为 GIS 格式。它无处不在,已成为行业标准。SHP文件必须包含三个文件,这些文件是构成 shapefile 所必需的。三个必需的文件是:1.SHP 是特征几何。2.SHX 是形状索引位置。DBF 是属性数据。
GeoJSON
.GEOJSON.JSON
GeoJSON 是一种使用 JavaScript 对象表示法 (JSON) 对地理数据结构(如点、线和多边形)进行编码的格式。它是在线 Web 制图应用程序最常见的开放标准格式之一。
Geography Markup Language (GML)
.GML
GML 以文本形式存储地理实体(要素 ...
python
未读在项目开发中,我们有时会引入一些包,后续由于种种原因,并没有 import 到项目中。如果在部署到时候使用 pip freeze,则会将这些并未引入到包也列到 requirements 中,而实际这些包是不需要的。
pipreqs 这个包就可以解决这个问题,它会分析项目中的代码,只列出被导入了的包。使用方法:
pip install pipreqs
pipreqs --encoding=utf-8-sig your_project_path --force
pipreqs 会生成 requirements.txt 到你分析的项目根目录中,与 pip freeze 生成的文件格式一致,可以使用 pip install -r requirements.txt 安装。
matplotlib==3.5.0
numpy==1.22.4
opencv_contrib_python==4.5.4.60
opencv_python_headless==4.5.5.64
Pillow==8.3.2
torch==1.9.0+cpu
torchvision==0.10.0
tqdm==4.66.1
列出 ...
python
未读读取tif文件正常来说,读取tif文件,使用gdal库就能解决了。
gdal库在遥感行业过于强大、简单、易用,以至于很多商业软件的底层也调用了gdal。
平常在python环境下使用gdal库对tif文件进行读写是很简单的,大佬们都把函数、接口封装得很好,咱们直接调用对应的API就OK了。
常用的语句如下:
from osgeo import gdal # 导入gdal
tif_file = r'xxx.tif' # 待读取的tif文件
ds = gdal.Open(tif_file) # 调用gdal的接口,ds是gdal的对象
array = ds.ReadAsArray() # 这个对象中有ReadAsArray方法
以上四句语句,把tif_file全部读取在内存里。
不使用gdal读取tif文件为什么会有这个奇怪的需求呢?
因为…
我有个朋友,他在linux因为没有linux的权限,安装不了 gdal。
这个朋友肯定不是我。
所以只能通过其他方法,把tif文件读取到内存里。
搜索一番,发现有2种方法可以成功实现这个需求。另外第2种方法只能实现部分需求。
skim ...