Я полагал, что
Intersection возвращает
None в случае, если пересечение не найдено. Но на самом деле он возвращает объект геометрии, но пустой. Проверить его лучше методом
IsEmpty, а в вашем коде проверка какая-то слишком замороченная.
Код: Выделить всё
intersection = geom_i.Intersection(geom_j)
if not intersection.IsEmpty():
# запись в выходной файл
В отношении симметричной разности.
Согласно документации есть специальный метод
SymDifference. В плане алгоритма нам надо:
1. взять первые два объекта из слоя
2. получить их разность
3. взять разность и следующий объект
4. получить уже их разность
5. повторить 3. и 4. пока объекты не закончатся
6. последняя разность и будет искомым результатом
Код: Выделить всё
layer = inputData.GetLayer(0)
first_geom = next(layer).GetGeometryRef()
second_geom = next(layer).GetGeometryRef()
diff = first_geom.SymDifference(second_geom)
for goem in layer:
# удобно, что layer это итератор, можно продолжить брать из него объекты
diff = diff.SymDifference(geom.GetGeometryRef())
# В итоге в diff получаем _мультиполигон_, который и представляет собой
# конечный результат симметричной разности. Тут его можно записать в
# выходной файл
Вроде все просто, но могут быть какие-то нюансы.
По поводу пустого id.
Вы сначала в feature устанавливаете геометрию, потом записываете feature в файл, потом для feature устанавливаете значение поля id... но стоп! Вы же уже записали его в файл!
В следующей итерации цикла у вас feature уже с id, который остался с прошлого раза. Вы устанавливаете ему геометрию и пишете в файл... В общем, сначала установите все настройки для feature, а только потом создавайте из него объект в файле.
Код: Выделить всё
feature.SetGeometry(intersection)
feature.SetField("id", id)
outputLayer.CreateFeature(feature)
Не уверен, что такое подробное объяснение требовалось. Мне просто показалось это забавным.