Как сравнить геометрию в SQL Server?

Я использую SQL Server 2012.

У меня есть этот столбец типа geometry в моей таблице:

POINT (34.8780917279395 32.1872894246816)

В другой таблице у меня также есть столбец типа geometry:

0xE6100000010CB3314B4F6570414073F29019F9174040

Как можно сравнить эти столбцы, чтобы определить, совпадает ли эта точка?

3 ответа

Для Второй таблицы вам необходимо преобразовать точку из WKB в формат geom. Попробуйте ниже получить геом и сравнить с первым пунктом.

DECLARE @g geometry;   
SET @g = geometry::STGeomFromWKB(0xE6100000010CB3314B4F6570414073F29019F9174040, 0);  
SELECT @g.STAsText();  

Это может быть не то, что вы прочтете в документации. Когда мне нужно сравнить геометрию, я обычно добавляю второй столбец геометрии, который содержит MD5-хэш геометрии. Сравнение происходит быстрее, чем традиционное сравнение геометрии. SQL-операторы также становятся понятнее.

Однако существует дополнительная сложность, связанная с обновлением хеша MD5, и это также может быть некоторой ошибкой при таком подходе.

Геометрию можно сравнивать только при равных SRID. Взгляните на следующий пример (намеренно расширенный):

WITH Geometries AS
(
    SELECT
        --Convert to geometry)
        CAST(0xE6100000010CB3314B4F6570414073F29019F9174040 AS geometry) GB,
        --Get SRID          
        CAST(0xE6100000010CB3314B4F6570414073F29019F9174040 AS geometry).STSrid STSrid
)
SELECT
    STSrid,--SRID, make sure point 'belongs' to correct SRID
    GB.STDistance(geometry::STPointFromText('POINT(34.8780917279395 32.1872894246816)', STSrid)) Distance
FROM Geometries

Если точки являются точными копиями, вы также можете сравнить геометрию / двоичные представления. STDistance более гибкая.

Другие вопросы по тегам