чем открыть шейп файл
Работа с ShapeFile (*.shp) в среде Delphi
В ходе работы столкнулся с задачей чтения файлов с расширением «.shp». Та информация, которую я нашел в интернете, была разрозненной и расплывчатой, и, поэтому, я решил объединить то, до чего мне пришлось доходить самостоятельно, и рассказать вам.
Постановка задачи
У нас имеется файл с расширением «.shp». В этом файле находится карта в виде изолиний: каждая изолиния сделана отдельным шейпом; наименованием шейпа является высотная характеристика изолинии. Нашей задачей станет считать данные из этого в массив. Массив представляет собой набор точек определенный тремя координатами (x, y, z). Далее этот массив нужно занести в базу данных, но данный момент мы упустим из рассмотрения.
Немного теории
Рассмотрим важные для нас особенности формата «*.shp». На самом деле ShapeFile содержит много информации, но у нас узкий интерес. Во первых нам нужно знать, что ShapeFile разделен на так называемые «Шейпы» (англ. Shape — Фигура). Шейп представляет собой фигуру или набор фигур (возможно не связанных между собой) сложных форм. Хранится шейп в виде отдельных точек и информации о линиях соединяющих их. В нашем случае каждый шейп это непрерывная кривая обозначающая положение точек земного ландшафта имеющих одинаковую высоту (наименование шейпа соответствует численному значение высоты). В виду специфичности задачи нас не будет интересовать информация о линиях соединяющих точки, а только информация о положении точек и их высота.
Стоит так же отметить, что вместе с файлом формата «*.shp» формируется файл формата «*.dbf» содержащий заголовочную информацию о наших шейпах. Файл «*.dbf» должен иметь такое же название, что и файл «.shp».
MapWindowGIS
После небольших поисков в сети, мною была обнаружены библиотека MapWindowGIS. Возможности этой библиотеки весьма широки и она поможет нам в достижении наших целей. Скачать ее можно по следующей ссылке.
После того, как Вы скачаете данную библиотеку необходимо ее установить. После установки, запускаем среду разработки Delphi. Выполняем команду Component-Import AciveX Control… после чего появится окно:
В списке библиотек ActiveX находим — MapWinGIS Component и нажимаем на кнопку «Install…«, после чего необходимо установить данную библиотеку как обычный компонент. После успешной установки данной библиотеки, компонент TMap появиться на вкладке ActiveX.
Добавляем отображение карты
Для начала добавим на форму компонент Map1 типа TMap. Как уже говорилось, он находится на последней позиции вкладки ActiveX.
Для того что бы наш компонент отображал карту, содержащуюся в нашем файле, достаточно простого кода:
shp:Shapefile; //переменная ассоциируемая с шейп-файлом
HandleLayer:integr; //необходимо для индексации слоев в шейп файле
shp:=CoShapefile.Create; //создание шейп-файла
shp.Open(‘map.shp’,nil); //считывание из файла ‘map.shp’
Map1.Focused; //в некоторых случаях, если не добавить данную строчку возникает ошибка
HandleLayer:=Map1.AddLayer(shp,true); //добавление слоя карты на компонент
Map1.ZoomToMaxExtents; //уменьшение (или увеличение) масштаба так, что бы все влезло
Считывание заголовочной информации о шейпах
Что бы считать заголовочную информацию из файла формата «*.dbf» мы будем использовать компоненты TTable и TDataSource. Для этого добавим на форму компоненты Table1 типа TTable и DataSource1 типа TDataSource из вкладок «BDE» и «Data Access» соответственно. Компонент Table1 оставляем без изменения, а в компоненте DataSource1 в параметре «DataSet» выбираем «Table1».
Для удобства добавляем на форму компонент OpenDialog1 типа TOpenDialog из вкладки «Dialogs». В параметре «Filter» компонента OpenDialog1, добавляем фильтр с наименованием «Shape files (.shp)» и фильтрацией «*.shp» (без кавычек). Кроме того добавим кнопки «Открыть» и «Сохранить».
Полный код процедуры на кнопку «Открыть» будет выглядеть следующим образом:
nameDB:WideString; //в этой переменной будет содержаться наименование файла
HandleLayer:integr;
nameDB:=OpenDialog1.FileName; //присваиваем наименование в соответствии с выбором пользователя
shp:=CoShapefile.Create;
shp.Open(nameDB,nil);
Map1.Focused;
HandleLayer:=Map1.AddLayer(shp,true);
Map1.ZoomToMaxExtents;
Delete(nameDB,length(nameDB)-2,3); //обрубаем разрешение
nameDB:=nameDB+’dbf’; //меняем разрешение на «.dbf»
Table1.TableName:=nameDB; //ассоциируем таблицу с фалом «*.dbf»
Table1.Active:=True; //»запускаем» таблицу
Не забываем, что переменную shp нужно добавить в раздел глобальных переменных.
Считываем точки из файла
Для начала приведу код процедуры назначенной на кнопку «Сохранить»:
i,j:integer; //индексирующие переменные
z:integer; //высота точек, считываемая из наименования
if shp<>nil then //проверка на наличие информации в переменной shp
begin
Table1.First; //берем первый шейп из заголовочной таблицы
k:=0;
for i:=0 to shp.NumShapes-1 do //перебор всех шейпов
begin
z:=StrToInt(Table1.Fields[2].Value); //считывание высоты из заголовочной таблицы шейпов
for j:=0 to shp.Shape[i].numPoints-1 do //перебор всех точек шейпа
begin
Mas[k].x:=shp.Shape[i].Point[j].x;
Mas[k].y:=shp.Shape[i].Point[j].y;
Mas[k].z:=z;
inc(k);
end;
Table1.Next; //переходим к следующему шейпу
end;
..
//тут можно например сохранить массив в базу данных
..
end
else ShowMessage(‘Файл не открыт’);
end;
Давайте рассмотрим некоторые особенности. Итак, Mas — одномерный массив точек имеющий три параметра типа Double (x, y, z). Параметр shp.NumShapes равен количеству шейпов внутри файла. Параметр Table1.Fields[2].Value — это наименование текущего шейпа (файл «*.dbf» устроен таким образом, что наименование записано в 3-тьем столбце). shp.Shape[i].numPoints, как вы наверно уже догадались — количество точек в i-том шейпе. shp.Shape[i].Point[j].x и shp.Shape[i].Point[j].y — те самые заветные координаты j-той точки i-того шейпа. Остальное, думаю, понятно из комментариев.
Заключение
Вот мы и закончили рассматривать особенности работы с ShapeFile в среде Delphi. С поставленной задачей мы справились полностью. Конечно, данный обзор является только вершиной айсберга, но я надеюсь эта вводная статья поможет вам в дальнейшем освоении этого направления.
Расширение файла SHP
Shapes Format
Что такое файл SHP?
Формат файла SHP (сокращение от формы) используется для хранения векторной графики и данных, связанных с геопространственной информацией, используемой программным обеспечением географической информационной системы (ГИС). Файл SHP может содержать географические и пространственные данные, которые описывают такие объекты, как ориентиры, реки, улицы или почтовые зоны.
Идея в формате SHP
Файл SHP представляет собой 2D / 3D изображение, созданное с использованием точек, линий и многоугольников. Каждый элемент проекта может иметь атрибуты (хранящиеся в отдельном файле, сохраненном в формате DBF), которые описывают связанные элементы.
SHP и дополнительные файлы
SHP обычно сопровождается дополнительными файлами, некоторые из которых являются обязательными, а некоторые необязательными. Обязательные файлы: SHP, DBF и SHX. Дополнительные файлы: XML, SBX и PRJ. Необходимые файлы должны находиться в той же папке, что и основной файл.
Программы, которые поддерживают SHP расширение файла
В следующем списке перечислены программы, совместимые с файлами SHP, которые разделены на категории 2 в зависимости от операционной системы, в которой они доступны. SHP файлы можно встретить на всех системных платформах, включая мобильные, но нет гарантии, что каждый из них будет должным образом поддерживать такие файлы.
Программы, обслуживающие файл SHP
Как открыть файл SHP?
Проблемы с доступом к SHP могут быть вызваны разными причинами. К счастью, наиболее распространенные проблемы с файлами SHP могут быть решены без глубоких знаний в области ИТ, а главное, за считанные минуты. Мы подготовили список, который поможет вам решить ваши проблемы с файлами SHP.
Шаг 1. Получить AutoCAD
Проблемы с открытием и работой с файлами SHP, скорее всего, связаны с отсутствием надлежащего программного обеспечения, совместимого с файлами SHP на вашем компьютере. Эта проблема может быть решена путем загрузки и установки # РЕКОМЕНДОВАННОЙ # или другой совместимой программы, такой как 3ds Max, CorelCAD, ArcView. Полный список программ, сгруппированных по операционным системам, можно найти выше. Одним из наиболее безопасных способов загрузки программного обеспечения является использование ссылок официальных дистрибьюторов. Посетите сайт AutoCAD и загрузите установщик.
Шаг 2. Проверьте версию AutoCAD и обновите при необходимости
Если проблемы с открытием файлов SHP по-прежнему возникают даже после установки AutoCAD, возможно, у вас устаревшая версия программного обеспечения. Проверьте веб-сайт разработчика, доступна ли более новая версия AutoCAD. Иногда разработчики программного обеспечения вводят новые форматы вместо уже поддерживаемых вместе с новыми версиями своих приложений. Причиной того, что AutoCAD не может обрабатывать файлы с SHP, может быть то, что программное обеспечение устарело. Последняя версия AutoCAD должна поддерживать все форматы файлов, которые совместимы со старыми версиями программного обеспечения.
Шаг 3. Назначьте AutoCAD для SHP файлов
Если проблема не была решена на предыдущем шаге, вам следует связать SHP файлы с последней версией AutoCAD, установленной на вашем устройстве. Процесс связывания форматов файлов с приложением по умолчанию может отличаться в деталях в зависимости от платформы, но основная процедура очень похожа.
Изменить приложение по умолчанию в Windows
Изменить приложение по умолчанию в Mac OS
Шаг 4. Убедитесь, что SHP не неисправен
Если вы выполнили инструкции из предыдущих шагов, но проблема все еще не решена, вам следует проверить файл SHP, о котором идет речь. Проблемы с открытием файла могут возникнуть по разным причинам.
1. Проверьте SHP файл на наличие вирусов или вредоносных программ.
Если случится так, что SHP инфицирован вирусом, это может быть причиной, которая мешает вам получить к нему доступ. Рекомендуется как можно скорее сканировать систему на наличие вирусов и вредоносных программ или использовать онлайн-антивирусный сканер. SHP файл инфицирован вредоносным ПО? Следуйте инструкциям антивирусного программного обеспечения.
2. Убедитесь, что файл с расширением SHP завершен и не содержит ошибок
Если вы получили проблемный файл SHP от третьего лица, попросите его предоставить вам еще одну копию. Возможно, файл был ошибочно скопирован, а данные потеряли целостность, что исключает доступ к файлу. Если файл SHP был загружен из Интернета только частично, попробуйте загрузить его заново.
3. Убедитесь, что у вас есть соответствующие права доступа
Иногда для доступа к файлам пользователю необходимы права администратора. Переключитесь на учетную запись с необходимыми привилегиями и попробуйте снова открыть файл Shapes Format.
4. Проверьте, может ли ваша система обрабатывать AutoCAD
Если в системе недостаточно ресурсов для открытия файлов SHP, попробуйте закрыть все запущенные в данный момент приложения и повторите попытку.
5. Убедитесь, что ваша операционная система и драйверы обновлены
Последние версии программ и драйверов могут помочь вам решить проблемы с файлами Shapes Format и обеспечить безопасность вашего устройства и операционной системы. Устаревшие драйверы или программное обеспечение могли привести к невозможности использования периферийного устройства, необходимого для обработки файлов SHP.
Учимся создавать векторное изображение карт.
Мне сказали, на пикабу читать инструкции не любят, ведь можно просто показать, куда ткнуть. Поэтому я постараюсь уложиться в минимум слов, чтобы оставить максимум места для тыкания.
Будем разбирать на примере Швейцарии из моей карты (точнее, уже подаренной):
Мы будем работать с shape-файлами.
Что такое shape-файлы
Это слои трех видов: точки, кривые, полигоны. В основном вы будете скачивать архив, в котором много файлов *.shp. Все они будут названы интуитивно понятно:
Waterways – реки, buildings – постройки и т.д.
Где найти shape-файлы
Пример: Швейцария. Нас интересует архив *.shp.zip. Но его качать не нужно, так как слои слишком детальны.
Подходит, если вы собираетесь создавать карту области (например, ЦФО) на большом формате.
Подходит, если вам нужно создать карту города, так как большую область сайт экспортировать не даст.
Подходит, если выбранная область города на сайте Openstreetmap слишком большая для экспорта, но весь ЦФО вам качать не нужно.
Подходит для одной страны, если нужна граница одной страны.
Подходит для больших областей (часть света, карта всего мира).
Подходит для карты небольшой страны, на небольшом формате (а4).
7. Просто забивайте в поисковик “Нужная область” shape.
В чем открывать скачанные shape-файлы
Скачиваем Qgis. Не забываем про разрядность системы. Устанавливаем и запускаем ярлык:
Как работать в программе Qgis
Скачиваем с сайта Gadm границу Швейцарии:
В программе Qgis добавляем слой к проекту:
Жмем ОБЗОР. Выбираем файл CHE_adm0.shp из распакованного архива. Жмем ОТКРЫТЬ. Вы должны получить примерно следующее (цвет может отличаться):
Сразу обращаем внимание, что это полигон, и что вид Швейцарии не внушает доверия. Нам нужно изменить систему координат проекта. О координатах можно говорить много, но я скажу только необходимое:
1. В нашем проекте будем использовать систему Sphere Mercator.
2. На картах, где изображен весь мир, координаты сильно искажены. Поэтому наиболее правильно использовать координаты WGS 84. Но использовать их можно только на небольших областях (город, страна, область которой умещается в одной UTM zone).
Для небольшой области UTM zone ищите в поисковике.
Пример: для Парижа правильно использовать координаты WGS 84/ UTM zone 31N.
Примечание: чтобы понять почему только на небольших областях, загрузите границы России с системой координат для Парижа.
Меняем систему координат проекта:
Включаем галочку сверху Enable ‘on the fly’. В поиске ищем Sphere_Mercator. Выбираем. Жмем ОК. Любуемся результатом:
Добавим к проекту озера. Заходим на сайт Naturalearthdata. Скачиваем архив с озерами по верхней кнопке и дополнительные озера Европы по нижней. Добавляем к проекту файлы слоев с озерами (расширение *.shp).
Реки я хочу взять с сайта Mapcruzin. Одна Швейцария будет пусто смотреться, если скачать реки с Naturalearthdata. Нам нужны Switzerland Waterways. Добавляем к проекту файл слоя с реками (расширение *.shp).
Замечаем, что озера – это тоже полигоны. А нам нужен векторный файл из одних линий. Идем в меню:
И преобразуем по очереди два слоя озер (граница нам еще пригодится в качестве полигона). После преобразования слой автоматически добавится в проект, и будет назван «Линии из полигонов».
Совет: сразу переименовывайте автоматически добавленные слои после преобразований, а старые слои можно удалять из проекта.
Управление слоями расположено слева внизу:
Помимо удаления и переименования, можно перейти в свойства слоя, нажав правой кнопкой мыши по нему, и, например, изменить цвет слоя.
Теперь нужно удалить всё, что выходит за границы страны. Переходим в меню:
Исходный слой – слой, который нужно обрезать (например, реки). Слой обрезки – полигон, границы которого определят линию обрезки (полигон границы). По очереди обрезаем реки и озера, не забывая переименовывать слоя после автоматического добавления в проект и удалять ненужные слои, чтобы не путаться.
Осталось совсем немного! Преобразуем полигон границы в линию. Должно получиться нечто похожее:
Теперь необходимо пересохранить слои, чтобы создать единый слой (почему-то без пересохранения операция объединения вызывает стабильную ошибку). Правой кнопкой по слою/сохранить как.
Формат выбираем – AutoCAD DXF.
На строке File name нажимаем обзор, и выбираем место сохранения и имя файла.
После сохранения слой автоматически добавится в проект с новым именем. Всплывающее окно будет спрашивать про систему координат. По умолчанию там стоит система, в который вы сохраните слой, поэтому просто нажимаем ОК. Проделываем данную процедуру для каждого слоя.
Осталось объединить слои. Заходим в меню:
Сохраняем слой, как сохраняли предыдущие слои в формате AutoCAD DXF. Открываем в любом редакторе, который понимает данный формат (Corel Draw, Компас).
После открытия не забываем себе сказать, что вы великолепны.
Небольшой бонус до комментариев. Ответ на вопрос, который терзал мне душу около недели:
Как в Delphi / Lazarus / С++ Builder работать с картами в формате SHP
ShapeFile, они же «Шейпы» (англ. Shape — Фигура) представляют собой фигуру или набор фигур (возможно не связанных между собой) сложных форм. Фигуры бывают в виде точек, полилиний или полигонов.
Если один из файлов набора будет утерян, данные могут быть повреждены или же вовсе проект будет утерян.
ArcGIS является географической информационной системой (ГИС) для работы с картами и географической информацией. Он используется для создания и использования карт, составления географических данных, анализа отображенной информации, обмена и обнаружения географической информации, с использования карт и географической информации в ряде приложений и управлений географической информации в базе данных. Подробнее о технологии ArcGIS.
В контексте ГИС векторные форматы данных (или по сути – векторные модели хранения данных) являются одним из способов отображения объектов реального мира.
Вы можете открыть файлы SHP с помощью следующих программ: CADE Pro, Parallels, Tools Center, AutoCAD, ESRI’s ArcExplorer, Free File Viewer Pro.
Преимущества шейп-файлов
Недостатки шейп-файлов
Шейп-файлы подходят для хранения простой геометрии пространственных объектов. Однако имеются серьезные проблемы, связанные с хранением атрибутов. Например, они не могут округлять числа, имеют ограниченную поддержку символов Unicode, не могут хранить поля, имена которых длиннее 10 знаков, и не могут хранить дату и время в одном поле. Это только основные ограничения. Кроме того, они не поддерживают возможности, присутствующие в базах геоданных, например, работу с доменами и подтипами. Поэтому, не следует использовать шейп-файлы, если вы хотите хранить сложные атрибуты и пользоваться возможностями, предоставляемыми базами геоданных.
Ограничения по геометрии Shape-файлов
Каждый файл-компонент шейп-файла не может быть более 2 GB, что составляет примерно 70 миллионов точечных объектов, потому что для ссылок внутри файла используются 4-байтные числа. Количество линейных или полигональных объектов, которые могут содержаться в шейп-файле, зависит от числа вершин этих объектов (вершина является эквивалентом точки).
В классах объектов базы геоданных значения допуска (x;y) хранится напрямую, в шейп-файлах совершенно по-другому. Допуск по (x;y) – это минимальное расстояние между координатами, ближе которого они будут считаться идентичными. Между пространственными объектами одного класса объектов, или между объектами нескольких различных классов при оценке взаимосвязей используется тот самый допуск. Также он активно используется при редактировании объектов. Если вы используете такие операции и инструменты как: Наложение (Overlay), Вырезать (Clip), Выбрать в слое по расположению (Select Layer By Location), или любой инструмент, который использует в качестве входных данных два или более класса пространственных объектов, то вместо шейп-файлов лучше использовать класс объектов базы геоданных(где доступ осуществляется по x, y).
Шейп-файл может занимать от трех до пяти раз больше места, по сравнению с файловой базой геоданных или SDE, поскольку использует иные методы сжатия.
Шейп-файлы поддерживают объекты-мультипатчи, но не поддерживают следующие возможности мультипатчей:
Пространственный индекс шейп-файла малоэффективен по сравнению с индексом класса объектов базы геоданных. Пространственные запросы такие как выбор объектов в пределах полигона займут у вас больше времени в отличие от того же класса объектов базы геоданных. Данный недостаток наблюдается только с большим количеством пространственных объектов.
Параметрически заданные кривые (также известные как кривые дуговых сегментов) не поддерживаются в шейп-файлах. Параметрические кривые можно создать, отредактировав класс объектов базы геоданных. Для построения кривых используются математические формулы. При экспорте класса объектов базы геоданных, который содержит параметрические кривые, в шейп-файл, кривые будут трансформированы в простые линейные объекты, вершины которых будут расположены очень близко друг к другу, чтобы сохранить соответствующую форму.
В отличие от других форматов, шейп-файл хранит числовые атрибуты в символьном, а не бинарном формате. Для реальных числовых значений (например, с десятичными знаками), это может привести к ошибкам из-за округления. Это ограничение касается только атрибутов, и не относится к хранению координат.
Как создать файл в формате SHP с помощью кода
Про сам формат поговорили и как готовые файлы открыть узнали, а как работать в Delphi? Тут есть три пути:
Создаём файл с картой в формате SHP
Заходим в FR Designer. Находим Object “Map” и добавляем его в документ.
Для добавления нового слоя нажмите кнопку «Добавить. «. Будет показано следующее окно:
На этом шаге нужно выбрать тип слоя:
Если вы выбрали слой на основе файла карты, укажите дополнительно, как хранить картографические данные:
— данные внедряются в файл отчета. При этом отчет может сильно увеличиться в размерах.
— файл отчета ссылается на файл карты, внедрения не происходит. Этот режим полезен, если у вас есть несколько отчетов, использующих одни и те же карты.
Карты большого объема (более 30Мб) или с большим количеством полигонов (более 20000) серьезно замедлят работу отчета.
При нажатии на Fill мы попадаем в редактор заливки. Во вкладке Кисть есть 3 свойства:
Стиль кисти имеет несколько готовых видов форматирования:
Цвет фона, как и цвет переднего плана можно выбрать из готовой палитры цветов или настроить необходимый цвет нажав на Other.
Во второй вкладке у нас настройки градиента для фона.
Стиль градиента может быть горизонтальным, вертикальным, овальным, прямоугольным, вертикальным с переходом в другой цвет по центру, горизонтальным с переходом в другой цвет по центру.
Начальный и конечный цвет можно выбрать из готовой палитры цветов или настроить необходимый цвет нажав на Other.
В третьей вкладке настройки заливки в виде стекла.
Имеется выбор ориентации: вертикальный, горизонтальный, вертикальное и горизонтальное зеркало.
Цвет можно выбрать из готовой палитры или настроить необходимый цвет нажав на Other.
Вернёмся в редактор карты и найдём уже редактор рамок.
Блок линий: можно выбрать стиль из предложенных вариантов, задать ширину линии и выбрать цвет.
Блок рамки: в центре у нас образец кадра, выбираем к каким сторонам применить стиль линий через образец или с помощью кнопочек (поля на всех сторонах, без полей или стороны по отдельности).
Добавляя тень мы также можем указать ширину и цвет.
Цвет рамки можно выбрать из готовой палитры цветов, установив ширину рамок. Выставляем позицию шкалы. На примере у нас расположение в правом нижнем углу.
Название шкалы вписываем в поле Text, через Font… настроим шрифт и его размер.
Вкладка Размер шкалы по виду не отличается от Цвета шкалы, поэтому повторяться не буду.
Сохранив полученный результат переходим во вкладку превью и видим готовый результат. Наша карта не будет статичной, ещё можно масштабировать в любом месте, а при наведении на определённую область (в нашем случае на любую страну) будет подсвечиваться весь этот фрагмент.
Создаём карту в формате SHP с помощью кода
Shape далеко не единственный формат для работы с картами, существуют ещё OpenStreetMap (OSM) и GPS eXchange Format, но о них я расскажу в других статьях.