Как сравнить геометрию в 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 более гибкая.