Удалить данные геометрии, находящиеся за пределами многоугольника - PullRequest
0 голосов
/ 19 марта 2019

Я создаю таблицу SQL Server, которая берет данные из уровня OS MasterMap, если он находится в слое SITES_TEST.

Сначала я использую STIntersects, чтобы получить данные OS MM на уровне ASSETS.

INSERT INTO ASSETS(GEOMETRY, THEMES) 
    (select b.GEOMETRY, b.THEMES from 
          SITES_TEST a,
          MM_TOPO b
          where a.geometry.STBuffer(1).STIntersects(b.geometry) = 1 AND  (b.THEMES ='Land' or b.THEMES ='Roads Tracks And Paths')) 

Синяя граница - это слой моего сайта и в фоновом режиме ОС MasterMap. Blue boundary is my site layer

После выполнения вышеуказанного запроса в SQL Server он возвращает перекрывающиеся данные, а также содержащиеся в них данные. Я получаю, что могу использовать STContains, но тогда это исключает данные, которые идут как внутри, так и за ее пределами.

* +1012 *enter image description here

Я надеялся, что смогу запустить UPDATE для таблицы ASSETS, используя STDifference.

UPDATE ASSETS(GEOMETRY) 
        (select b.GEOMETRY from 
              SITES_TEST a,
              MM_TOPO b
              where a.geometry.STDifference(b.geometry)=1) 

Но я думаю, что поступаю неправильно, так как это возвращает логическую ошибку.

Неверный оператор для типа данных. Оператор равно равно, тип равно геометрии.

Резюме: Я пытаюсь удалить геометрию, которая находится за пределами другой геометрии. На первом рисунке показан синий многоугольник, затем запускается сценарий SQL, в результате чего на втором изображении отображаются красные данные, которые находятся за пределами синего граничного многоугольника с первого изображения. Я хочу удалить данные, которые сейчас находятся за пределами синего многоугольника.

1 Ответ

1 голос
/ 20 марта 2019

Вместо того, чтобы просто запрашивать геометрии, которые intersect представляют интересующий многоугольник, который возвращает всю пересекающуюся геометрию (как вы выяснили), вы хотите только части геометрии, которые пересекают ваш многоугольникинтерес.Так что-то вроде:

INSERT INTO ASSETS(GEOMETRY, THEMES) 
    (select b.GEOMETRY.STIntersection(a.geometry, b.THEMES from 
          SITES_TEST a,
          MM_TOPO b
          where a.geometry.STBuffer(1).STIntersects(b.geometry) = 1 AND  (b.THEMES ='Land' or b.THEMES ='Roads Tracks And Paths')) 
...