我正在寻找将栅格转换为多边形(无ArcPy)的开源python解决方案。
我确实知道将栅格转换为多边形的GDAL函数,这是手册:http : //pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band
不过,我希望输出可以是形状多边形或任何临时存储在内存中的对象,而不是另存为文件。是否有任何程序包或代码来处理此问题?
如果栅格是在numpy数组中处理的,则此方法将在下面列出。
我正在寻找将栅格转换为多边形(无ArcPy)的开源python解决方案。
我确实知道将栅格转换为多边形的GDAL函数,这是手册:http : //pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band
不过,我希望输出可以是形状多边形或任何临时存储在内存中的对象,而不是另存为文件。是否有任何程序包或代码来处理此问题?
如果栅格是在numpy数组中处理的,则此方法将在下面列出。
Answers:
使用Sean Gillies的栅格。它可以轻松地与Fiona(读取和写入shapefile)结合使用,并且形状相同。
在脚本rasterio_polygonize.py中 ,开头是
import rasterio
from rasterio.features import shapes
mask = None
with rasterio.drivers():
with rasterio.open('a_raster') as src:
image = src.read(1) # first band
results = (
{'properties': {'raster_val': v}, 'geometry': s}
for i, (s, v)
in enumerate(
shapes(image, mask=mask, transform=src.affine)))
结果是GeoJSON功能的生成器
geoms = list(results)
# first feature
print geoms[0]
{'geometry': {'type': 'Polygon', 'coordinates': [[(202086.577, 90534.3504440678), (202086.577, 90498.96207), (202121.96537406777, 90498.96207), (202121.96537406777, 90534.3504440678), (202086.577, 90534.3504440678)]]}, 'properties': {'raster_val': 170.52000427246094}}
您可以将其转换为几何形状
from shapely.geometry import shape
print shape(geoms[0]['geometry'])
POLYGON ((202086.577 90534.35044406779, 202086.577 90498.96206999999, 202121.9653740678 90498.96206999999, 202121.9653740678 90534.35044406779, 202086.577 90534.35044406779))
创建geopandas数据框,并启用易于使用的空间连接,绘图,另存为geojson,ESRI shapefile等功能。
geoms = list(results)
import geopandas as gp
gpd_polygonized_raster = gp.GeoDataFrame.from_features(geoms)
if value > src.nodata
对列表的理解,以利用源的nodata值并丢弃与之对应的任何形状。不知道如果没有数据的话会发生什么。:o)
这是我的实现。
from osgeo import ogr, gdal, osr
from osgeo.gdalnumeric import *
from osgeo.gdalconst import *
import fiona
from shapely.geometry import shape
import rasterio.features
#segimg=glob.glob('Poly.tif')[0]
#src_ds = gdal.Open(segimg, GA_ReadOnly )
#srcband=src_ds.GetRasterBand(1)
#myarray=srcband.ReadAsArray()
#these lines use gdal to import an image. 'myarray' can be any numpy array
mypoly=[]
for vec in rasterio.features.shapes(myarray):
mypoly.append(shape(vec))
如果存在安装问题,则安装rasterio的方法是通过“ conda install -c https://conda.anaconda.org/ioos rasterio”。
myarray=srcband.ReadAsArray() #or any array