Визначення того, чи перекриваються форма форми та растрові в Python за допомогою OGR / GDAL? [зачинено]


9

Я будую сценарій у python за допомогою OGR / GDAL.

У мене є набір форм-файлів та набір растрових файлів GeoTiff.

Я хотів би, щоб мій сценарій ігнорував форми файлів, якщо вони не перетинаються з растровою областю.

Файл форми не є прямокутником, тому я не можу просто порівняти значення xmin / xmax, ymin / ymax, повернуті шаром.GetExtent (). Мені потрібен власне багатокутник, який представляє його загальну форму, а потім якийсь спосіб визначити, чи перетинається цей багатокутник з растровим квадратом.

Я думав, що можу якось об'єднати всі багатокутники у форміфайлу в одну особливість, а потім прочитати геометрію цієї функції, а потім порівняти цю інформацію в растровій мірі. Однак я не знаю конкретно, як це виконати.

  1. Як витягнути інформацію з полігону на кордоні з формфайлу?
  2. Як визначити, чи перетинає цей багатокутник задану площу квадрата?

Я не знайомий з osgeo, але еквівалент arcpy міг би (можливо) включати: читати растрові розміри, створювати полігони, що охоплюють масштаби в пам'яті, перебирати форми, обрізаючи кожен прямокутник, щоб перевірити, чи є щось.
флоема

Відповіді:


17

Наступний скрипт визначає обмежувальну рамку растру і створює на основі обмежувальної коробки геометрію.

import ogr, gdal

raster = gdal.Open('sample.tif')
vector = ogr.Open('sample.shp')

# Get raster geometry
transform = raster.GetGeoTransform()
pixelWidth = transform[1]
pixelHeight = transform[5]
cols = raster.RasterXSize
rows = raster.RasterYSize

xLeft = transform[0]
yTop = transform[3]
xRight = xLeft+cols*pixelWidth
yBottom = yTop-rows*pixelHeight

ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(xLeft, yTop)
ring.AddPoint(xLeft, yBottom)
ring.AddPoint(xRight, yTop)
ring.AddPoint(xRight, yBottom)
ring.AddPoint(xLeft, yTop)
rasterGeometry = ogr.Geometry(ogr.wkbPolygon)
rasterGeometry.AddGeometry(ring)

Далі визначається геометрія векторного многокутника. Це відповідає на ваше перше запитання.

# Get vector geometry
layer = vector.GetLayer()
feature = layer.GetFeature(0)
vectorGeometry = feature.GetGeometryRef()

Нарешті, геометрію вектора та растру перевіряють на перетин (повернення Trueчи False). Це відповідає на ваше друге запитання.

print rasterGeometry.Intersect(vectorGeometry)

2
Спасибі, саме це я шукав. Ця відповідь чітко показує, як створювати, витягувати та запускати функції між об’єктами геометрії, саме це я шукав.
JFerg

Це рішення перевіряє, чи перетинається багатокутник FID = 0 з растром. Як ви отримуєте загальну геометрію файлу форми, коли жоден багатокутник не представляє цього?
JFerg

1
EDIT: Збільшення часу на обчислення не має наслідків, тому я перевіряю, чи перетинається зараз кожен багатокутник у файлі форм.
JFerg

4

Я вважаю рішення @ustroetz дуже корисним, але його потрібно було виправити в двох місцях. По-перше, pixelHeight = перетворення [5] - це вже від’ємне значення, тому рівняння має бути

yBottom = yTop+rows*pixelHeight

По-друге, порядок точок в кільці повинен бути проти годинникової стрілки. У мене були проблеми з цим. Правильний порядок:

ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(xLeft, yTop)
ring.AddPoint(xLeft, yBottom)
ring.AddPoint(xRight, yBottom)
ring.AddPoint(xRight, yTop)
ring.AddPoint(xLeft, yTop)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.