Подтвердить что ты не робот

Каков наилучший способ чтения, представления и отображения картографических данных?

Мне интересно писать упрощенное навигационное приложение в качестве проекта для домашних животных. После поиска бесплатных картографических данных я обосновался в US Census Bureau TIGER 2007 Данные карты линии Line/Shapefile. Данные разделяются на zip файлы для отдельных округов, и я загрузил только данные карты графства для своей области.

Каким будет лучший способ чтения в этих картографических данных в полезный формат?

Как мне:

  • Прочитайте в этих файлах
  • Разбирайте их - Регулярное выражение или некоторая библиотека, которая уже может анализировать эти файлы Shapefiles?
  • Загрузите данные в мое приложение. Должен ли я загружать точки непосредственно в некоторую структуру данных в памяти? Использовать небольшую базу данных? Я не нуждаюсь в постоянстве, как только вы закрываете приложение данных карты. Пользователь может снова загрузить Shapefile.

Каким будет лучший способ визуализации карты после того, как я прочитал данные в Shapefile?

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

Как мне:

  • Преобразовать точки lat/lon в координаты экрана? - Насколько я знаю, Shapefile использует долготу и широту для своих точек. Поэтому, очевидно, мне придется преобразовать их так или иначе, чтобы отобразить координаты для отображения функций карты.
  • Отобразить данные карты (серия полилиний для дорог, границ и т.д.) таким образом, чтобы я мог легко поворачивать и масштабировать всю карту?
  • Отобразить всю мою карту как серию "плиток", так что отображаются только объекты/линии в области просмотра?

Ex. данных TIGER, отображаемых как отображаемая карта:
alt text http://i43.tinypic.com/ngosjl.png

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

EDIT: Чтобы уточнить, я не хочу использовать API Google или Yahoo. Точно так же я не хочу использовать OpenStreetMap. Я ищу более простой подход, чем использование этих apis/programs. Это будет настольное приложение.

4b9b3361

Ответ 1

Во-первых, я рекомендую использовать 2008 TIGER файлы.

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

Если вы хотите начать с нижнего уровня

Синтаксический

Построение собственного анализатора TIGER (достаточно просто - всего лишь DB линейных сегментов), и создание простого рендеринга поверх этого (строки, многоугольники, буквы/имена) также будет довольно простым. Вы хотите посмотреть на различные типы проекций карты для фазы визуализации. Наиболее часто используемым (и, следовательно, самым знакомым для пользователей) является проекция Меркатора - это довольно просто и быстро. Вы можете играть с поддержкой других прогнозов.

Это даст немного "удовольствия" с точки зрения того, как проектировать карту и как отменить эту проекцию (например, пользователь нажимает на карту, вы хотите видеть, что lat/lon они нажали - требуется реверсирование текущее проекционное уравнение).

Rendering

Когда я разработал свой рендерер, я решил основать свое окно на фиксированном размере (встроенное устройство) и фиксированное увеличение. Это означало, что я мог бы центрировать карту на лат /lon, а с центром pixel = center lat/lon при данном увеличении, и, учитывая проекцию меркатора, я мог бы вычислить, какой пиксель представлял каждый lat/lon, и наоборот.

Некоторые программы вместо этого позволяют изменять окно, и вместо использования увеличения и фиксированной точки они используют две неподвижные точки (часто верхние левые и нижние правые углы прямоугольника, определяющие окно). В этом случае становится тривиальным определять передачу пикселя в lat/lon - это всего лишь несколько расчетов интерполяции. Вращение и масштабирование делают эту передаточную функцию немного более сложной, но не должны быть значительно такими - это еще прямоугольное окно с интерполяцией, но углы окна не обязательно должны быть в какой-либо конкретной ориентации относительно северного. Это добавляет несколько угловых случаев (вы можете повернуть карту наизнанку и просмотреть ее, как если бы изнутри земли, например), но они не обременительны и могут быть рассмотрены, когда вы работаете над ней.

После того, как вы выполнили передачу с использованием lat/lon to pixel, линии рендеринга и многоугольники довольно просты, за исключением обычных проблем с графикой (например, края линий или многоугольников, перекрывающихся ненадлежащим образом, сглаживание и т.д.). Но предоставление базовой уродливой карты, например, сделанной многими рендерингами с открытым исходным кодом, довольно просто.

Вы также сможете играть с расчетами расстояний и больших кругов - например, хорошее эмпирическое правило состоит в том, что каждая степень lat или lon на экваторе составляет приблизительно 111,1KM, но каждый изменяется по мере приближения к полюс, в то время как другой продолжает оставаться на уровне 111,1 км.

Хранение и структуры

Как вы храните и ссылаетесь на данные, однако, во многом зависит от того, что вы планируете делать с ним. Возникает множество трудных проблем, если вы хотите использовать одну и ту же структуру базы данных для демографии и маршрутизации - данная структура базы данных и индексирование будут быстрыми для одного и медленными для другого.

Использование zipcodes и загрузка только близлежащих zipcodes работает для небольших проектов рендеринга карт, но если вам нужен маршрут по всей стране, вам нужна другая структура. В некоторых реализациях есть "оверлейные" базы данных, которые содержат только основные дороги и привязки маршрутов к оверлею (или через множественные оверлеи - локальные, метро, ​​уезд, штат, страну). Это приводит к быстрой, но иногда неэффективной маршрутизации.

Черепица

Наложение вашей карты на самом деле непросто. При меньших увеличениях вы можете отобразить всю карту и разрезать ее. При более высоких увеличениях вы не можете отобразить все сразу (из-за ограничений памяти/пространства), поэтому вам нужно нарезать его.

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

Вы увидите, о чем я говорю, когда вы работаете над этой проблемой.

Нет ничего сложного в том, чтобы найти данные, которые попадают в данную плиту, - линия может иметь оба конца за пределами данной плитки, но перемещаться по плиткам. Вам нужно будет проконсультироваться с графическими книгами об этом (Майкл Абраш - это основная ссылка, свободно доступная по предыдущей ссылке). Хотя речь идет в основном об играх, здесь применяются окна, обрезка, полигоны, столкновение и т.д.

Однако вы можете играть на более высоком уровне.

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

Обратное геокодирование достаточно просто. Введите lat/lon (или щелкните по карте) и получите ближайший адрес. Это объясняет, как интерпретировать адреса по сегментам линии в данных TIGER.

Основное геокодирование - сложная проблема. Написание парсера адресов - полезный и интересный проект, а затем преобразование его в lat/lon с использованием данных TIGER является нетривиальным, но очень весело, Начните простые и маленькие, требуя точного совпадения имени и формата, а затем начните искать "подходящее" соответствие и фонетическое соответствие. Там много исследований в этой области - посмотрите на поисковые проекты для некоторой помощи здесь.

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

По пути и упреждающим инструкциям не так просто, как при первом румянце. Учитывая набор инструкций со связанным массивом пар lat/lon, "следуйте" по маршруту с использованием внешнего входа (GPS или имитируемого GPS) и разработайте алгоритм, который дает пользовательские инструкции по мере приближения к каждому реальному пересечению. Обратите внимание, что есть больше пар лат/лон, чем инструкции из-за извилистых дорог и т.д., И вам нужно будет определить направление движения и т.д. Множество угловых случаев, которые вы не увидите, пока не попытаетесь его реализовать.

Поиск по интересам.. Это интересно - вам нужно найти текущее местоположение, и все интересующие вас объекты (а не часть TIGER, сделайте свой собственный или получите другой источник) в пределах определенное расстояние (как ворона, или более тяжелое - расстояние движения) от источника. Это интересно в том, что вам нужно преобразовать базу данных POI в формат, который легко найти в этом случае. Вы не можете потратить время на миллионы записей, выполнить расчет расстояний (sqrt (x ^ 2 + y ^ 2)) и вернуть результаты. Вы должны иметь некоторый метод или алгоритм, чтобы сначала сократить объем данных.

Путешественник. Маршрутизация с несколькими пунктами назначения. Только более сложная версия регулярной маршрутизации.

Вы можете найти несколько ссылок на многие проекты и источники информации по этому вопросу здесь.

Удачи, и, пожалуйста, опубликуйте, что бы вы ни делали, независимо от того, насколько они рудиментарны или уродливы, поэтому другие могут принести пользу!

-Adam

Ответ 2

SharpMap - это механизм отображения .NET 2.0 с открытым исходным кодом для WinForms и ASP.NET. Это может обеспечить все необходимые функции. Он имеет дело с наиболее распространенными форматами данных ГИС и растровых данных, включая шейп файлы ESRI.

Ответ 3

решение:

  • геопространственный сервер, такой как maperver, geoserver, degree (opensource).

Они могут читать и обслуживать шейп файлы (и многое другое). Например, геосервер (когда установлен) обслуживает данные из шейп файлов TIGER Бюро переписей США в качестве демонстрации

  • картографическую библиотеку javascript, такую ​​как openlayers (см. примеры в текст ссылки

В Интернете есть много примеров использования этого решения

Ответ 4

Смешной вопрос. Вот как я это делаю.

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

Затем я написал программу, которая "компилирует" эти определения фигур в форму, которая эффективна для рендеринга. Это означает, что любые преобразования прогнозов и форматов данных необходимы для эффективного отображения данных. Некоторые подробности:

  • Для 2D-приложения вы можете использовать любой желаемый прогноз: Map Projections.
  • Для 3D, вы хотите преобразовать эти широты/долготы в 3D-координаты. Ниже приведена математика о том, как это сделать: преобразование из сферические координаты к нормальным прямоугольным координатам.
  • Разбить все примитивы на квадранты/окте (2D/3D). Листовые узлы в этом дереве содержат ссылки на всю геометрию, которая пересекает граничную рамку node (по оси). (Это означает, что фрагмент геометрии можно ссылаться более одного раза.)
  • Затем геометрия разбивается на таблицу вершин и таблицу команд рисования. Это идеальный формат для OpenGL. Команды могут быть выданы через glDrawArrays с использованием вершинных буферов (Vertex Buffer Objects).
  • Для прохода quadtree/octree используется общий шаблон посетителя. Прогулка включает проверку того, пересекает ли посетитель данные узлы дерева до тех пор, пока не встретится лист node. Посетители включают: рисование, обнаружение столкновения и выбор. (Поскольку листья дерева могут содержать повторяющиеся ссылки на геометрию, ходок отмечает узлы как посещаемые и игнорирует их после этого. Эти метки должны быть reset или иным образом обновлены перед выполнением следующего шага.)
  • Использование системы пространственного разбиения (одного из деревьев) и эффективного представления чертежа имеет решающее значение для достижения высоких кадров. Я обнаружил, что в этих типах приложений вы хотите, чтобы ваша частота кадров была как можно выше 20 кадров в секунду. Не говоря уже о том, что большая производительность даст вам массу возможностей для создания лучшей карты. (Шахта далека от хорошего взгляда, но будет там когда-нибудь.)
  • Пространственное разбиение помогает повысить производительность за счет уменьшения количества команд рисования, отправленных процессору. Однако может наступить время, когда пользователь действительно хочет просмотреть весь набор данных (возможно, арийский вид). В этом случае вам нужна система управления деталями. Поскольку мое приложение касается улиц, я отдаю приоритет дорогам и дорогам. Мой код чертежа знает о том, сколько примитивов я могу сделать, прежде чем моя частота кадров снизится. Примитивы также сортируются по этому приоритету. Я рисую только первые x элементы, где x - количество примитивов, которые я могу нарисовать по желаемой частоте кадров.

Остальное - управление камерой и анимация любых данных, которые вы хотите отобразить.

Вот несколько примеров моей существующей реализации:

Изображение http://seabusmap.com/assets/Picture%205.png Изображение http://seabusmap.com/assets/Picture%207.png

Ответ 5

для хранения данных тигра локально, я бы выбрал Postgresql с postgis.

у них есть внушительная коллекция инструментов, особенно для вас Tiger Geocoder предлагает хороший способ импорта и использования данных тигра.

вам нужно будет взглянуть на инструменты, которые взаимодействуют с postgis, скорее всего, какой-то mapserver

из http://postgis.refractions.net/documentation/:

В настоящее время существует несколько инструментов с открытым исходным кодом, которые работают с PostGIS. Проект uDig работает с полной рабочей средой для чтения и записи, которая может работать с PostGIS напрямую. Для интернет-картографии Университет Миннесоты Mapserver может использовать PostGIS в качестве источника данных. Инструментарий GeoTools Java GIS поддерживает PostGIS, также как и сервер веб-функций GeoServer. GRASS поддерживает PostGIS в качестве источника данных. В JMSP Java Desktop GIS viewer есть простой плагин для чтения данных PostGIS, а рабочий стол QGIS имеет хорошую поддержку PostGIS. Данные PostGIS могут быть экспортированы в несколько выходных форматов ГИС с использованием библиотеки OGR С++ и инструментов командной строки (и в курсе с упакованным файловым файлом Shape). И, конечно же, любой язык, который может работать с PostgreSQL, может работать с PostGIS - список включает Perl, PHP, Python, TCL, C, С++, Java, С# и т.д.

edit: depate mapserver, имеющий слово SERVER в своем имени, это будет использоваться в среде рабочего стола.

Ответ 6

Хотя вы уже решили использовать данные TIGER, вас может заинтересовать OSM (Open Street Map), beacuse OSM имеет полный импорт данных TIGER в нее, обогащенный пользовательскими данными. Если вы придерживаетесь формата TIGER, ваше приложение будет бесполезно для международных пользователей, а OSM вы получите TIGER и все остальное сразу.

OSM - это открытый проект с совместной редактируемой свободной картой мира. Вы можете получить все эти данные, а также структурированный XML, либо запрос для региона, либо загрузить весь мир в большой файл.

Есть некоторые средства отображения карт для OSM, доступные на разных языках программирования, большинство из которых с открытым исходным кодом, но все еще многое предстоит сделать.

Существует также служба маршрутизации OSM. Он имеет веб-интерфейс и может также быть запрошен с помощью API веб-сервисов. Опять же, это не все закончилось. Пользователи могут определенно использовать приложение для настольных компьютеров или мобильных маршрутов, построенное поверх этого.

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

Ответ 7

Вы также можете работать с Microsoft Visual Earth mapping application и api или использовать Google api. Я всегда программировал коммерчески с продуктами ESRI и не играл с открытым api.

Кроме того, вы можете посмотреть на Maker! и Finder! Это относительно новые программы, но я думаю, что они свободны. Может быть ограничено вложением данных. Maker можно найти здесь.

Проблема заключается в том, что пространственная обработка является довольно новой в некоммерческом масштабе.

Ответ 8

Когда я дал этот ответ, вопрос был помечен

"Каким будет лучший способ визуализации Shapefile (данные карты) с помощью полилиний в .Net?"

Теперь это другой вопрос, но я оставляю свой ответ на исходный вопрос.

Я написал версию .net, которая могла бы рисовать векторные данные (такие как геометрия из файл shp), используя простой GDI + в С#. Это было довольно весело.

Причина в том, что нам нужно было обрабатывать различные версии геометрии и атрибуты с большим количеством дополнительной информации, чтобы мы могли не использовать коммерческий компонент карты или с открытым исходным кодом.

Главное, когда это делается создать окно просмотра и переводить/преобразовывать координаты WGIS84 к уменьшенному масштабу и GDI + x, y координаты и ждать с проекцией если вам вообще нужно перепрограммировать.

Ответ 9

Если вы не против платить за решение Safe Software производит продукт под названием FME. Этот инструмент поможет вам перевести данные из любого формата в любой другой. Включая KML в формат Google Earth или отображая его как JPEG (или серии JPEG). После преобразования данных вы можете вставлять google earth в свое приложение, используя API или просто отображать черепичные изображения.

Как сторона не FME - очень мощная платформа, поэтому при выполнении ваших переводов вы можете добавлять или удалять части данных, которые вам не нужны. Объедините источники, если у вас их несколько. Преобразование координат (я не помню, что именно использует Google Earth). Храните резервные копии в базе данных. Если серьезно, если вы готовы выложить несколько долларов, вы должны изучить это.

Вы также можете создавать флаги (как и на вашей карте выборки), которые содержат местоположение (где его помещать) и другие данные/комментарии о местоположении. Эти флаги бывают разных форм и размеров.

Ответ 10

Одно упрощение над Меркатором или другой проекцией - это принять постоянный коэффициент преобразования для широты и долготы. Умножьте градусы широты на 69.172 миль; для долготы, выберите среднюю широту вашей области карты и умножьте (180-долготу) на косинус (средняя) * 69.172. Когда вы перейдете в мили, вы можете использовать другой набор преобразований, чтобы получить координаты экрана.

Это то, что сработало для меня еще в 1979 году.

Мой источник для количества миль на градус.

Ответ 11

Одним из решений является использование MapXtreme. У них есть API для Java и С#. API может загружать эти файлы и отображать их.

Для Java:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-java

Для .NET:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-2008

Я использовал это решение в настольном приложении, и он работал хорошо. Он предлагает гораздо больше, чем только предоставление информации.

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