Làm thế nào để đa giác hóa raster để tạo hình đa giác


13

Tôi đang tìm kiếm một giải pháp python mã nguồn mở để chuyển đổi raster thành đa giác (không có ArcPy).

Tôi đã biết hàm GDAL để chuyển raster thành đa giác, và đây là hướng dẫn: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

Tuy nhiên, tôi hy vọng rằng đầu ra có thể là hình đa giác hoặc bất kỳ đối tượng nào, tạm thời trong bộ nhớ, không được lưu dưới dạng tệp. Có bất kỳ gói hoặc mã để xử lý vấn đề này?

Nếu raster đã được xử lý trong một mảng numpy, cách tiếp cận được liệt kê dưới đây.

Câu trả lời:


18

Sử dụng rasterio của Sean Gillies. Nó có thể dễ dàng kết hợp với Fiona (đọc và viết shapefiles) và tạo hình của cùng một tác giả.

Trong kịch bản rasterio_polygonize.py bắt đầu là

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)))

Kết quả là một trình tạo các tính năng của 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}}

Rằng bạn có thể biến thành hình học hình dạng

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))

Tạo geopandas Dataframe và cho phép dễ dàng sử dụng các chức năng tham gia không gian, vẽ đồ thị, lưu dưới dạng Geojson, ESRI shapefile, v.v.

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

Nếu raster đã được xử lý như một mảng numpy, có cách nào để chuyển đổi một mảng numpy thành đa giác không? Cảm ơn!
Vicky Liau

Về lý thuyết, có-
gen

1
Biến mặt nạ và tham số trong ví dụ của bạn có vẻ không cần thiết. Tuy nhiên, tôi khuyên bạn nên thêm if value > src.nodatavào phần hiểu danh sách để sử dụng giá trị nốt của nguồn và loại bỏ bất kỳ hình dạng nào tương ứng với nó. Không chắc chắn những gì sẽ xảy ra nếu không có gật đầu vaue mặc dù. : o)
bugmenot123

3
trong khi đó họ đã thay đổi rasterio.drivers thành rasterio.Env và src.affine thành src.transform
Leo

3

Đây là thực hiện của tôi.

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))

Cách để cài đặt rasterio là 'cài đặt conda -c https://conda.anaconda.org/ioos rasterio', nếu có sự cố cài đặt.


Kết quả của rasterio trực tiếp là một mảng khó chịu, do đó bạn không cầnmyarray=srcband.ReadAsArray() #or any array
gen

@gene Mình sửa lại ghi chú. Dòng này (myarray = srcband.ReadAsArray ()) sử dụng gdal để nhập hình ảnh.
Vicky Liau

nhập hình ảnh dưới dạng mảng numpy và rasterio nhập trực tiếp hình ảnh dưới dạng mảng numpy
gen

Điều này làm việc cho tôi mặc dù tôi đã phải lập chỉ mục vec vì nó được trả lại dưới dạng một tuple. hình dạng (vec [0])
user2723146
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.