Как стать автором
Обновить
7.2
Карма
0
Рейтинг
RollingStone @RollingStone

Пользователь

LINQ to SQL и пространственные данные SQL Server

.NET
Начиная с версии 2008 (и пока что заканчивая ей) MS SQL Server имеет встроенную поддержку пространственных данных. Прекрасно!

На данный момент времени уже существует несколько СУБД, предлагающих индексированное хранение пространственных данных. Наверное, самые популярные из них, это: «народная» MySql и PostGIS.

Программируя на c#, естественно, в очень многих случаях, отдаёшь предпочтение продуктам и решениям Microsoft. Причины просты: полнее поддержка одних технологий другими, хорошая документация, более полная реализация, например провайдеров данных, и гораздо меньшая глючность. Я выбрал SQL Server. Заодно захотелось освоить LINQ в общем и LINQ to SQL в. частности.

Поначалу всё было хорошо. Для меня хороший старт сделала, обнаруженная на msdn, статья «LINQ to SQL: .NET Language-Integrated Query for Relational Data».
Но я не сильно удивился, когда «всё хорошо» закончилось.

Для хранения геометрических данных в SQL Server были введены два дополнительных типа: geometry и geography. Первый используется для хранения геометрических объектов, описанных в декартовой системе координат, а второй — для геометрических объектов заданных географическими координатами (широта/долгота).
Такое разделение, по всей видимости, пришлось сделать из-за того, что пространственный индекс реализован в SQL Server на основе B-деревьев. При использовании этого индекса пространство шаблонно разбивается сеткой несколько раз и в «ячейки» этой сетки сохраняются ссылки на геометрические объекты. И оказалось невозможно строить универсальное разбиение и для прямоугольной системы координат и для эллипсоидальной. В MySql, например, выбран другой алгоритм индексирования, основанный на R-деревьях, работающий на совершенно другом принципе, и используется один тип данных. Какой способ индексирования лучше, а какой хуже — не очевидно, так что пока не понятно на кого ругаться и стоит ли.

Оказалось, что LINQ to SQL не понимает этих типов данных и работать с ними, а также со встроенными геометрическими функциями, отказывается. Хотя, наверное, правильнее сказать, что их не понимает провайдер. В любом случае, уверен, что поддерживаться эти данные будут, но сейчас такой поддержки нет.

Я не смог найти в интернет решения, обходящего эту проблему, поэтому пришлось изобрести его самому. Здесь нет никаких удивительных ходов, но есть детали, которые, думаю, будут интересны. Также в этой большой заметке, для вашего интереса, я чуть-чуть опишу работу с LINQ to SQL.
посмотрим
Всего голосов 28: ↑24 и ↓4 +20
Просмотры11.6K
Комментарии 12

Новости

Показать еще

Как загрузить большую карту с Google Maps — два

Чулан
В предыдущей записи этого блога обсуждалась загрузка больших фрагментов карт с Google Maps.

Я сделал новую версию своей программы BoobleMaps, которая как раз этим и занимается. Вы выделяете интересующий регион в Google Earth, сохраняете его в kml-файл и используете BoobleMaps для загрузки фрагментов и их сшивки. Загруженные фрагменты сохраняются в кэше. Программа имеет анти-бан защиту, но за её работу, понятное дело, не отвечаю. Кстати, замечено, что, во всяком случае раньше, банили только за спутник, но не за карты и оверлеи.

Небольшую статью посвященную краткому описанию, как хранятся данные на Google Maps я здесь перенабирать не буду, даю ссылку: ->

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

Архив с программой и библиотекой найдёте здесь: ->

Исходные коды программы маринуются на google.code здесь: ->

Ошибки, пожелания, замечания по коду (если кто снизойдёт) — приветствуются, буду рад.

Времени сейчас мало, но постараюсь быть адекватным хотя бы до исправления ошибок.

UPD.
Совсем забыл, хотел обратиться к сообществу, может кому будет не лень присоединиться к проекту: нужно научить программу читать настройки из внешнего файла, сейчас они забиты в классе Settings.
Также было бы неплохо реализовать автоматическое определение текущей версии фрагментов карт и спутника.

Всего голосов 31: ↑31 и ↓0 +31
Просмотры359
Комментарии 34

Информация

В рейтинге
5,828-й
Откуда
Россия
Дата рождения
Зарегистрирован
Активность