Удалить геометрические данные, находящиеся за пределами полигона

#sql-server #database #gis #ogc

#sql-server #База данных #ГИС #ogc

Вопрос:

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

Сначала я использую STIntersects для переноса данных OS MM в слой АКТИВОВ.

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

Синяя граница — это слой моего сайта и на фоновой карте OS MasterMap.
Синяя граница - это слой моего сайта

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

введите описание изображения здесь

Я надеялся, что смогу запустить ОБНОВЛЕНИЕ таблицы РЕСУРСОВ, используя STDifference.

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

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

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

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

Комментарии:

1. Мне трудно понять, что вы хотите (даже с изображениями), но я отмечу, что STDifference() возвращает тип данных geography, и вы пытаетесь сравнить его с числовым типом данных в вашем предложении where. Об этом сообщает вам сообщение об ошибке.

2. @BenThul Привет, Бен, я пытаюсь удалить геометрию, которая находится за пределами другой геометрии. На первом рисунке показан синий полигон, затем запускается sql-скрипт, результатом которого является второе изображение, на котором показаны данные красным цветом, которые находятся за пределами синего граничного полигона, я хочу удалить данные, которые теперь находятся за пределами синего полигона.

3. Другими словами, вы ищете пересечение двух полигонов? Если это так, вы должны быть в состоянии выразить это пересечение с помощью STIntersects() и запустить обновление с помощью этого.

Ответ №1:

Вместо того, чтобы просто запрашивать геометрии, которые 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')) 
  

Комментарии:

1. Привет, Ян, у меня это сработало, мне просто нужно было удалить элемент .stbuffer (1), поскольку это вызывало ошибку «Не удалось найти метод ‘stbuffer’ для типа ‘Microsoft.SqlServerTypes. SqlGeometry’ в сборке’ Microsoft.SQLServer. Вводит'» Спасибо