python 使用GDAL实现栅格tif转矢量shp的方式小结
作者:GIS开发者 发布时间:2021-10-02 07:13:56
前言
目前有一张tif格式的栅格影像,需要在web地图上进行展示,使用动态切片WMS的方式,渲染速度比较慢,而且大的时候会出现模糊的问题。并且后面需要做多期影像的切换,渲染与加载效率也值得关注。
计划是使用栅格转矢量的方式,将栅格数据转为矢量shp文件,然后进行矢量切片,使用Mapbox进行前端动态渲染。在网上查询了很多资料,有人说使用d3-contour
在node.js中生成或者使用rasterio
在python中进行转换,整体过程都比较麻烦,很不易实现。最终选定了使用GDAL进行栅格转矢量的方法,代码比较简单。
原始tif影像(12.8MB)如下:
核心函数
GDAL中栅格转矢量的函数主要是以下两个,二者的参数没有任何区别,只是功能有区别:
FPolygonize(*args, **kwargs)
FPolygonize(Band srcBand, Band maskBand, Layer outLayer, int iPixValField, char options=None, GDALProgressFunc callback=0, void * callback_data=None) -> int
将每个像元转成一个矩形。
Polygonize(*args, **kwargs) **
Polygonize(Band srcBand, Band maskBand, Layer outLayer, int iPixValField, char ** options=None, GDALProgressFunc callback=0, void * callback_data=None) -> int
将每个像元转成一个矩形,然后将相似的像元进行合并。
转换代码
from osgeo import gdal, ogr, osr
import os
import datetime
import numpy as np
path = "Z_NAFP20210727.tif"
if __name__ == '__main__':
start_time = datetime.datetime.now()
inraster = gdal.Open(path) # 读取路径中的栅格数据
inband = inraster.GetRasterBand(1) # 这个波段就是最后想要转为矢量的波段,如果是单波段数据的话那就都是1
prj = osr.SpatialReference()
prj.ImportFromWkt(inraster.GetProjection()) # 读取栅格数据的投影信息,用来为后面生成的矢量做准备
outshp = path[:-4] + ".shp" # 给后面生成的矢量准备一个输出文件名,这里就是把原栅格的文件名后缀名改成shp了
drv = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(outshp): # 若文件已经存在,则删除它继续重新做一遍
drv.DeleteDataSource(outshp)
Polygon = drv.CreateDataSource(outshp) # 创建一个目标文件
Poly_layer = Polygon.CreateLayer(path[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon) # 对shp文件创建一个图层,定义为多个面类
newField = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value,浮点型,
Poly_layer.CreateField(newField)
gdal.Polygonize(inband, None, Poly_layer, 0) # 核心函数,执行的就是栅格转矢量操作
# gdal.FPolygonize(inband, None, Poly_layer, 0) # 只转矩形,不合并
Polygon.SyncToDisk()
Polygon = None
end_time = datetime.datetime.now()
print("Succeeded at", end_time)
print("Elapsed Time:", end_time - start_time) # 输出程序运行所需时间
转换效果
使用FPolygonize
转换之后的矢量数据有270MB,非常大,打开非常卡
使用Polygonize
合并之后的矢量数据有48MB,相对第一种方法数据量大大减少
来源:https://blog.csdn.net/GISuuser/article/details/119452042


猜你喜欢
- 1、引言在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtra
- 这样写 <select id="search"> <option>baidu</optio
- 本节要讲解如下图所示的滑块验证码(更为复杂的滑动拼图验证码在下一篇介绍)。这种验证码机制比较简单:将滑块拖动到滑轨的最右端即可完成验证,如下
- 1、类有两个方法,一个是 new,一个是 init,有什么区别,哪个会先执行呢?class test(object): &nb
- 一、先看最简单的情况。有两个数组: $arr1 = array(1,9,5); $arr2 = array(6,2,4); array_mu
- 本文实例为大家分享了python实现简单贪吃蛇的具体代码,供大家参考,具体内容如下1. 导入游戏库import pgzrunimport r
- 报错:Uncaught SyntaxError: Unexpected token o in JSON at position 1at JS
- 1.MySQL官网下载压缩版文件,放至安装路径下载zip安装包MySQL :: Download MySQL Community Serve
- 前言:Python 中的画图工具——turtle(海龟绘图),turtle 是 Python 中自带
- 如何在线修改表?具体代码如下:<%Set conn1 = Server.CreateObject(&qu
- 用python爬取网页表格数据,供大家参考,具体内容如下from bs4 import BeautifulSoup import reque
- 提示:以下是本篇文章正文内容,下面案例可供参考一、uni-app中自带的弹窗示例:在前端开发中,为了优化用户的交互体验,常需要用到弹窗来进行
- 不知道有多少人清楚的知道,在Oracle中,如果一个复合索引,假定索引(a,b,c)三个字段,删除了(包括unused)其中一个字段,Ora
- 目录一:搭建webpack二:数据劫持三:总结一:搭建webpack简单的搭建一下webpack的配置。新建一个文件夹,然后init一下。之
- 准备工作开发环境:python2.6,reportlab准备中文字体文件:simsun.ttc代码:#!/usr/bin/env pytho
- 找了 很多 关于表格分页 点击事件 请求, table.render 并不支持监听点击事件,所以我就把 table.render 和 lay
- 最近做百度地图的模拟数据,需要获取某条公交线路沿途站点的坐标信息,貌似百度没有现成的API,因此做了一个模拟页面,工具而已,IE6/7/8不
- 在数据处理的时候,尤其在搞大数据竞赛的时候经常会遇到一个问题就是,多个表单的合并问题,比如一个表单有user_id和age这两个字段,另一个
- 当我们花费大量的精力训练完网络,下次预测数据时不想再(有时也不必再)训练一次时,这时候torch.save(),torch.load()就要
- 今天我上网站的管理后台,登录时提示MySQL error:Can't create/write to file '#sql_