วิธีทำให้รูปหลายเหลี่ยมแรสเตอร์เป็นรูปหลายเหลี่ยมได้ดี


14

ฉันกำลังค้นหาโซลูชันไพ ธ อร์โอเพนซอร์ซเพื่อแปลงแรสเตอร์เป็นรูปหลายเหลี่ยม (ไม่มี ArcPy)

ฉันรู้จักฟังก์ชัน GDAL เพื่อแปลง raster เป็นรูปหลายเหลี่ยมและนี่คือคู่มือ: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

อย่างไรก็ตามฉันคาดหวังว่าผลลัพธ์จะเป็นรูปหลายเหลี่ยมหรือวัตถุใด ๆ ที่อยู่ในหน่วยความจำชั่วคราวไม่ได้บันทึกเป็นไฟล์ มีแพ็คเกจหรือรหัสเพื่อจัดการกับปัญหานี้หรือไม่?

หาก raster ได้รับการประมวลผลในอาเรย์ numpy วิธีการจะแสดงอยู่ด้านล่าง

คำตอบ:


21

ใช้rasterioของ Sean Gillies สามารถใช้ร่วมกับฟิโอน่าได้อย่างง่ายดาย(อ่านและเขียนรูปร่างไฟล์) และหุ่นดีของผู้เขียนคนเดียวกัน

ในสคริปต์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 เป็นต้น

geoms = list(results)
import geopandas as gp
gpd_polygonized_raster  = gp.GeoDataFrame.from_features(geoms)

หาก raster ได้รับการประมวลผลเป็นอาร์เรย์ numpy มีวิธีใดที่จะแปลงอาร์เรย์ numpy เป็นรูปหลายเหลี่ยม? ขอบคุณ!
Vicky Liau

ตามทฤษฎีแล้วใช่
ยีน

1
ตัวแปรหน้ากากและพารามิเตอร์ในตัวอย่างของคุณดูเหมือนไม่จำเป็น อย่างไรก็ตามฉันขอแนะนำให้เพิ่มif value > src.nodataความเข้าใจในรายการเพื่อใช้ประโยชน์จากค่าที่เป็นแหล่งข้อมูลและละทิ้งรูปร่างใด ๆ ที่สอดคล้องกับมัน ไม่แน่ใจว่าจะเกิดอะไรขึ้นหากไม่มี nodata vaue : o)
bugmenot123

3
ในขณะเดียวกันพวกเขาเปลี่ยน rasterio.drivers เป็น rasterio.Env และ src.affine เป็น src.transform
Leo

4

นี่คือการดำเนินการของฉัน

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' หากมีปัญหาในการติดตั้ง


ผลลัพธ์ของ rasterio นั้นเป็นอาร์เรย์แบบ numpy โดยตรงดังนั้นคุณไม่จำเป็นต้องใช้myarray=srcband.ReadAsArray() #or any array
ยีน

@ gene ฉันแก้ไขบันทึกย่อ บรรทัดนี้ (myarray = srcband.ReadAsArray ()) ใช้ gdal เพื่อนำเข้าภาพ
Vicky Liau

นำเข้ารูปภาพเป็นอาร์เรย์ numpy และ rasterio นำเข้ารูปภาพโดยตรงเป็น numpy array
ยีน

สิ่งนี้ใช้ได้กับฉันแม้ว่าฉันจะต้องจัดทำดัชนี vec เพราะมันถูกส่งคืนเป็นสิ่งอันดับ รูปร่าง (vec [0])
2723146
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.