Обеспечить хорошее распространение географических данных из базы данных SQL - PullRequest
0 голосов
/ 28 апреля 2010

Для отображения данных на картах Google у меня есть> 50 тыс. Строк данных в SQL Server 2005 со следующей (упрощенной) структурой

PointID
Latitude
Longitude
TypeID

Я могу выбрать небольшое подмножество в ограничивающей рамке, обеспечив приличное сочетание типов, например:

.....
(
@NELat float,
@NELong float,
@SWLat float,
@SWLong float
) 
as
select top 100 PointID, Latitude, Longitude,
rank() over (partition by PointTable.TypeID order by newid()) as NewRank
from PointTable
where
(
CONVERT(float, PointTable.Latitude) >= @SWLat and CONVERT(float, PointTable.Latitude) <=   @NELat and
CONVERT(float, PointTable.Longitude) >= @SWLong and CONVERT(float, PointTable.Longitude) <=  @NELong
)
order by NewRank

К сожалению, исходные данные смещены в сторону одного конкретного географического местоположения.

Какой самый эффективный / самый быстрый в вычислительном отношении способ гарантировать, что извлеченные данные имеют приличный географический разброс?

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

Я искал тип данных географии, доступный для SQL Server 2008, но он не похож на тот, который доступен в 2005 году. Также я знаю, что float не лучший тип данных для хранения координат, но это не было до меня.

1 Ответ

0 голосов
/ 04 мая 2010

В итоге я сделал следующее:

Расширена моя таблица, чтобы включить Иерархическая треугольная сетка ID для данного широты / долготы.

PointID
Latitude
Longitude
TypeID
HTMID

HTMID был создан с использованием функций из библиотеки пространственных данных из « Использование табличных функций в SQL Server 2005 для реализации библиотеки пространственных данных », с исходным кодом, загружаемым из Codeplex (обратите внимание, что мне нужно было сгенерировать новый sampleKey.snk для создания примера проекта. Я следовал этим инструкциям )

Затем HTMID можно округлить и использовать для группировки точек сближения.

.....
(
@NELat float,
@NELong float,
@SWLat float,
@SWLong float
) 
as
select top 100 PointID, Latitude, Longitude,
rank() over (partition by PointTable.TypeID order by newid()) as NewRank,
rank() over (partition by round(PointTable.HTMID,-7) order by newid()) as HTMRank
from PointTable
where
(
CONVERT(float, PointTable.Latitude) >= @SWLat and CONVERT(float, PointTable.Latitude) <=   @NELat and
CONVERT(float, PointTable.Longitude) >= @SWLong and CONVERT(float, PointTable.Longitude) <=  @NELong
)
order by HTMRank, NewRank

Это может быть не совсем точно, и я бы не использовал этот HTMID для вычисления чего-то более точного, не углубляясь в технические детали, но он, безусловно, достигает того, чего я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...