получить разницу двух файлов формы - PullRequest
0 голосов
/ 05 июля 2018

У меня есть два файла формы, которые содержат многоугольники. Я пытаюсь найти дельту из этого. Попытка сделать это с помощью следующего кода, но не работает так, как я ожидал. Ниже приведены два файла формы, один из которых синий, это файл формы буфера, мне нужно удалить ту область буфера, которая пересекается с синим buffer.i.e. нужно получить разницу в геометрии так же, как Qgis разница функция

enter image description here

import fiona
from shapely.geometry import shape, mapping, Polygon

green = fiona.open(
    "/home/gulve/manual_geo_ingestion/probe-data/images/r/shape_out/dissolved.shp")
blue = fiona.open(
    "/home/gulve/manual_geo_ingestion/probe-data/images/g/shape/shape.shp")

print([not shape(i['geometry']).difference(shape(j['geometry'])).is_empty for i, j in zip(list(blue), list(green))])

schema = {'geometry': 'Polygon',
          'properties': {}}
crs = {'init': u'epsg:3857'}

with fiona.open(
        '/home/gulve/manual_geo_ingestion/probe-data/images/r/shape_out/diff.shp', 'w',
        driver='ESRI Shapefile', crs=crs, schema=schema
) as write_shape:
    for geom in [shape(i['geometry']).difference(shape(j['geometry'])) for i, j in zip(list(blue), list(green))]:
        if not geom.empty:
            write_shape.write({'geometry': mapping((shape(geom))), 'properties': {}})

Ожидаемый результат: enter image description here

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Я могу решить это с помощью стройных функций

Вот мой код ..

import fiona
from shapely.geometry import shape, mapping, Polygon
from shapely.ops import unary_union

buffered_shape = fiona.open(
    "dissolved.shp", 'r', encoding='UTF-8')
color_shape = fiona.open(
    "shape.shp", 'r', encoding='UTF-8')

print([not shape(i['geometry']).difference(shape(j['geometry'])).is_empty for i, j in
       zip(list(color_shape), list(buffered_shape))])

outmulti = []
for pol in color_shape:
    green = shape(pol['geometry'])
    for pol2 in buffered_shape:
        red = shape(pol2['geometry'])
        if red.intersects(green):
            # If they intersect, create a new polygon that is
            # essentially pol minus the intersection
            intersect = green.intersection(red)
            nonoverlap = green.symmetric_difference(intersect)
            outmulti.append(nonoverlap)
        else:
            outmulti.append(green)

finalpol = unary_union(outmulti)

schema = {'geometry': 'MultiPolygon',
          'properties': {}}
crs = {'init': u'epsg:4326'}

with fiona.open(
        'shape_out/diff.shp', 'w',
        driver='ESRI Shapefile', crs=crs, schema=schema
) as write_shape:
    for geom in finalpol:
        # if not geom.empty:
        write_shape.write({'geometry': mapping(Polygon(shape(geom))), 'properties': {}})
0 голосов
/ 05 июля 2018

После того, как вы импортировали шейп-файлы в PostgreSQL , просто выполните этот запрос:

CREATE TABLE not_intersects AS 
SELECT * FROM shape 
WHERE id NOT IN (SELECT DISTINCT shape.id
         FROM buffer,shape 
         WHERE ST_Intersects(buffer.geom,shape.geom)); 

Этот запрос создаст третью таблицу (называемую здесь not_intersects), содержащую многоугольники, которые не пересекаются между двумя таблицами (файлами форм).

enter image description here

Здесь результат представлен желтым цветом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...