Проблема с запросом Sql 2008 - какой LatLong существует в географическом полигоне?
-
08-07-2019 - |
Вопрос
у меня есть следующие две таблицы:-
Геоформы
- Идентификатор GeoShapeId INT
- Имя VARCHAR(100)
- ГЕОГРАФИЯ шейп - файла [ это замкнутый полигон с широтой / длинами ]
Места совершения преступлений
- Идентификатор CrimeLocationId INT IDENTITY
- ГЕОГРАФИЯ Латлонга [ это точка Широты /Лонга ]
Сейчас у меня есть около 10 тысяч результатов геошейпа и около 500 местоположений преступлений.
Я пытаюсь выяснить, внутри каких геофайпов существуют все 500 криминальных точек широты / длины.
:( Я просто не понимаю этого!Я пытался сделать STIntersects
по подзапросу, но это не сработало.Есть какие-нибудь предложения?
ваше здоровье!
ПРАВКА 1:Я не могу использовать ни одного GEOMETRY
функции ..потому что (как указано выше) все это географические типы.
ПРАВКА 2:Я знаю, как использовать STContains
и STIntersects
.Пожалуйста, не приводите простых примеров этого.Мне больше интересно выполнить сложный запрос с моей структурой таблицы, описанной выше.
Решение
Что касается ваших "правок", не часто вы видите вопрос, который включает в себя "пожалуйста, не предоставляйте ...".Конечно, каждая мелочь помогает?Особенно с тех пор, как вы на самом деле не показали нам, что вы делай знать о STContains
или STIntersects
(или Filter()
если уж на то пошло)...
В любом случае, у меня была под рукой база данных почтовых индексов и местоположений магазинов, поэтому я переименовал таблицы / столбцы в соответствии с вашими (тогда у меня было 6535 криминальных кодов и 3285 геошейпов).Я предполагаю, что вы уже поняли это, но кто-то другой может счесть это полезным...
Следующий запрос возвращает количество Места совершения преступлений в каждом Геометрические фигуры.Шейп-файл
SELECT G.Name, COUNT(CL.Id)
FROM GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
ORDER BY 2 DESC
Для этого требуется века (примерно 20 минут), потому что я не настроил никаких геопространственных индексов, а мои шейп-файлы имеют большое количество точек, но они выполняются успешно.Если бы я хотел ограничить результаты, как вы предлагаете:
SELECT G.Name, COUNT(CL.Id)
FROM GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
HAVING COUNT(CL.Id) = 500
Конечно, вы не хотите жестко кодировать число 500, поэтому вы могли бы добавить COUNT(*) FROM CrimeLocations
подзапрос там, или переменная с итогом из отдельного запроса.
Достаточно ли это сложно?