Возвращает многоугольник, в котором находится долгое время, используя типы пространственных данных SQL (STIntersect / STContains и т. Д.) - PullRequest
0 голосов
/ 24 сентября 2018

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

У меня есть таблицаназываемый "post_codes_new", он содержит следующие столбцы:

id (int)
post_code (varchar, example: "0612")
post_code_name (varchar, example: "Henderson")
latlongs (geography data type - forming a polygon)

Я пытаюсь сделать запрос к этой таблице, используя точку lat / long, чтобы вернуть любую запись post_codes, которая содержит этот lat / long (любую записьчто широта / долгота попадают в границы).

Вот над чем я работал;

DECLARE @point geography;
SET @point = geography::STGeomFromText('POINT(174.94280000 -36.75000000)',4326)
select post_code
from dbo.post_codes_new
WHERE latlongs.MakeValid().STContains(@point) = 1;

Независимо от того, какую точку широты / долготы я ввожу здесь, мой запрос возвращаетмне 931 из 1081 записей в этой таблице, и это занимает 22 секунды .... Он должен вернуть только одну запись.И я надеюсь на лучшую производительность, конечно.

Я пытаюсь достичь этого;

['PSEUDO-CODE' QUERY OF WHAT I'D LIKE TO ACHIEVE]
SELECT post_codes.* FROM post_codes WHERE latlongs.STIntersects(myLatLongPoint) = 1 

Все примеры, на которые я смотрел (на этом сайте и в других местах), кажутсяработать с полигонами, которые определены в запросе (т. е. точки перечислены в теле запроса в явном виде).Я видел несколько таких, которые смотрели на записи, содержащие границы многоугольников, но ни одна из них не сработала для меня.

Спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

Огромное спасибо @BenThul и @TomC.Оказалось, что мои точки были введены по часовой стрелке, что оборачивает «остальной мир, исключая ваш многоугольник» и создает его как область многоугольника - отсюда 931 из 1081 записей, возвращаемых в моем запросе.

Итак, я взял свои существующие точки многоугольника (которые я сохранил как строку nvarchar (MAX) вместе с моим столбцом географии) и перевернул их, а затем переписал свой столбец географии с этими обратными значениями.Затем я выполнил запросы по нескольким известным комбинациям адрес / почтовый индекс, и они отлично работали.Один почтовый индекс был возвращен на запрос, как и ожидалось.Отлично!

Требуется (последовательно) 16 секунд для выполнения запроса, но я рассмотрю эту проблему со скоростью как отдельную проблему.

Спасибо, ребята.

...