Как сделать шейп файл

Обновлено: 02.07.2024

Научиться создавать и редактировать векторные данные и их атрибуты.

Редактирование, оцифровка, heads-up, таблица, база данных.

Обзор¶

Как QGIS хранит данные?¶

Как и все остальные приложения, ГИС-приложение может сохранять свои данные в файлы на диске. Существует множество различных форматов для ГИС-данных, но наиболее распростаненным, пожалуй, является shape-файл. Название немного странное, так как хотя мы и называем его shape-файлом (в единственном числе), на самом деле он состоит как минимум из трех разных файлов, которые и используются для хранения ваших векторных данных в цифровом виде, как показано в таблице table_shapefile.

В этом файле хранится геометрия векторных объектов

Файл содержит атрибуты объектов

Это индексный файл, помогающий ГИС-приложению находить объекты быстрее.

Table Shapefile 1: Основные файлы, образующие shape-файл.

Если вы посмотрите на файлы, образующие shape-файл, в файловом менеджере, вы увидите что-то похожее на рисунок figure_shapefile. Если вам необходимо передать данные, хранящиеся в shape-файле другому человеку, обязательно убедитесь, что вы дали ему все эти файлы. Так, в случае трёх файлов, изображенных на рисунке figure_shapefile, вы должны передать файлы trees.shp , trees.shx , trees.dbf , trees.prj и trees.qml .

Figure Shapefile 1:

../../_images/shapefile_on_disk.jpg

Файлы, образующие shape-файл «trees», в файловом менеджере.

Многие ГИС-приложения также могут хранить данные в базе данных. В общем случае, хранение ГИС-данных в базе является хорошим решением, так как база может хранить большие объемы данных эффективно и может предоставлять их ГИС-приложению очень быстро. Использование базы данных также позволяет одновременную работу нескольких пользователей с одним и тем же векторным слоем. Настройка базы данных для хранения ГИС-данных сложнее использования shape-файлов, поэтому в пока мы будем рассматривать создание и редактирование shape-файлов.

Планирование¶

Прежде чем создать новый векторный слой (который будет храниться в shape-файле), необходимо определиться с типом геометрии слоя (точечный, линейный или полигональный), а также с набором атрибутов. Чтобы было понятнее, рассмотрим несколько примеров.

Пример 1: Создание туристической карты¶

Представьте, что вы решили создать хорошую туристическую карту вашего региона. Вы решили, что это должен быть лист топографической карты масштаба 1:50000 с наложенными маркерами, отмечающими интересные туристам места. Сначала подумаем о геометрии. Мы знаем, что векторный слой может содержать точки, линии или полигоны. Что же выбрать для нашей туристической карты? Можно использовать точки, если мы хотим отмечать определеные места, например, обзорные площадки, мемориалы, места сражений и т.п. Если мы хотим провести туристов по маршруту, например живописному маршруту через горный перевал, возможно, стоит использовать полилинии. Ну а если необходимо показать целые области, представляющие интерес для туристов, такие как заповедники, то полигоны будут хорошим выбором.

Figure Tourism 1:

../../_images/tourism_map.jpg

Туристическая карта. Мы использовали три разных типа геометрии для правильного отображения различных объектов, чтобы дать пользователям всю необходимую информацию.

Пример 2: Создание карты загрязнений реки¶

Если вы хотите замерить уровень загрязнения вдоль реки, вы будете двигаться по реке на лодке или идти вдоль берегов. Через равные промежутки вы будете останавливаться и проводить различные измерения, такие как уровень растворенного кислорода, число бактерий кишечной палочки, уровень мутности и pH. Вам также необходимо отмечать своё положение на карте или записывать его с помощью приемника GPS.

Для хранения, собранных таким образом, данных в ГИС-приложении вы скорее всего создатите точечный слой. Использование точек в данном случае имеет смысл, т.к. каждый образец был получен в определенном месте.

Что касается атрибутов, то нам потребуется поле для каждого собранного параметра. Поэтому наша таблица атрибутов будет выглядеть примерно как таблица table_river_attributes.

Создание пустого shape-файла¶

Процесс обычно начинается с выбора «нового векторного слоя» в вашем ГИС-приложении и указании типа геометрии (см. рисунок figure_new_shapefile). Как было сказано выше, это выбор между точками, линиями и полигонами.

Figure New Shapefile 1:

../../_images/new_shapefile.jpg

Для создания нового векторного слоя необходимо всего лишь заполнить небольшую форму. Сначала выбирается тип геометрии, а потом добавляются атрибуты.

Затем необходимо добавить поля таблицы атрибутов. Как правило, названия полей должны быть короткими, не содержать пробелов и отражать тип хранимой информации. Например, поля могут иметь имена «ph», «RoofColor», «RoadType» и т.д. Помимо имени поля необходимо также указать какая информация будет в нем храниться, т.е. это число, слово или предложение, или же дата.

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

И наконец (как показано на рисунке figure_save_shapefile), для создания shape-файла необходимо задать его имя и расположение на диске компьютера. Ещё раз напомним, что файлам следует давать короткие и значащие имена. Хорошие примеры: «rivers», «watersamples» и другие.

Figure New Shapefile 2:

../../_images/save_shapefile.jpg

После определения геометрии и атрибутов нового слоя, его необходимо сохранить на диск. Shape-файлам желательно давать короткие, но осмысленные имена.

Подведем итоги. Для создания shape-файла необходимо определиться с типом геометрии, затем создать одно или несколько полей атрибутивной таблицы и, наконец, сохранить файл на диске под понятным именем. Как два байта переслать!

Добавление данных в shape-файл¶

Пока мы создали только пустой shape-файл. Теперь начнем редактирование shape-файла, выбрав пункт «начать редактирование» в меню или нажав соответствующую кнопку на панели инструментов. Shape-файлы по умолчанию открываются в режиме «только чтение» чтобы предотвратить случайное изменение или удаление данных. После перехода в режим редактирования можно добавлять данные. Создание записи в shape-файле условно разбивается на два шага:

Процесс создания геометрии имеет свои особенности в зависимости от того, что создаётся: точки, линии или полигоны.

Figure Attribute Dialog 1:

../../_images/attribute_dialog.jpg

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

Процесс создания полилинии похож на создание точки, вначале необходимо переместиться в окрестности нужного места. Кроме того необходимо выбрать достаточное приближение, чтобы создаваемая линия была в правильном масштабе (см. Векторные данные для более подробной информации о проблемах масштаба). Когда всё буде готово, активируйте инструмент создания полилинии и начинайте рисовать, щелкая по карте. После первого щелчка вы должны увидеть, что отрезок тянется как резиновая нить и следует за курсором мыши. Каждый раз, когда выполняется щелчок левой кнопкой мыши, создаётся новый узел. Этот процесс показан на рисунке figure_capture_polyline.

Figure Capture Polyline 1:

../../_images/capture_polyline.jpg

Когда создание линии закончено, используйте правую кнопку мыши, чтобы завершить редактирование. Как и в случае создания точки, после этого появится диалог ввода атрибутов нового объекта.

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

Для добавления нового объекта после первого, просто ещё раз щелкните по карте инструментом создания точки, линии или полигона и рисуйте новый объект.

После того как все объекты созданы, убедитесь, что вы отключили режим редактирования нажатием на соответствующую кнопку панели инструментов. При этом ГИС-приложение сохранит созданные вами данные.

Экранная оцифровка¶

Если вы выполняли описанные выше действия, то наверняка заметили, что создавать пространственно правильные объекты при отсутствии других объектов, которые можно использовать в качестве точек опоры, очень трудно. Одним из возможных решений этой проблемы является использование растрового слоя (например, аэрофотосъемки или спутникового изображения) в качестве подложки. Такой слой можно использовать как для контроля, так и обводить по нему объекты. Этот процесс называется экранной оцифровкой и показан на рисунке figure_headsup_digitizing.

Figure Digitizing 1:

../../_images/headsup_digitizing.jpg

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

Оцифровка с использованием графического планшета¶

Другим сопособо создания векторных данных является использование графического планшета. Этот подход используется реже, применяется в основном ГИС-профессионалами и требует наличия дорогостоящего оборудования. Процесс оцифровки можно описать следующим образом. На поверхности планшета зажимами неподвижно закрепляется бумажная карта. Затем специальное устройство, называемое «шайба», используется для трассировки объектов с карты. Небольшое перекрестие в центре шайбы используется для контроля точности оцифровки линий и точек. Шайба подключается к компьютеру и каждый объект, оцифрованный с её помощью, сохраняется в памяти компьютера. Общий вид шайбы показан на рисунке figure_digitizing_table.

Figure Digitizing 2:

../../_images/digitizing_table.jpg

Графический планшет и шайба используются ГИС-профессионалами при оцифровке объектов с существующих карт.

После оцифровки объектов. ¶

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

Частые ошибки / о чем стоит помнить¶

Если оцифровка выполняется с растрового слоя, например с аэрофотоснимка или спутникового изображения, необходимо убедиться, что растр имеет правильную привязку. Слой с правильной привязкой отображается в ГИС-приложении на своем рельаном месте. Результат использования некорректно привязанного изображения показан на рисунке figure_georeference_issue.

Figure Digitizing 2:

../../_images/georeferencing_issue.jpg

Важность использования правильно привязанных изображений при экранной оцифровке. Слева находится правильно привязанное изображение, объекты слоя дорог (показаны оранжевым) хорошо совмещаются с подложкой. Если изображение привязано неправильно (как на рисунке справа) объекты не будут совмещаться. Ещё хуже, когда это изображение используется для оцифровки новых объектов, ведь созданные объекты будут неправильными!

Также стоит помнить, что необходимо устанавливать правильный масштаб, чтобы получаемые векторные объекты можно было использовать. Как было показано в предыдущем разделе, выполнять оцифровку в масштабе 1:1000 000 для дальнейшего использования данных при масштабе 1:50 000 не самая лучшая идея.

Что мы узнали?¶

Оцифровка это процесс сохранения информации о геометрии и атрибутах объекта в цифровом формате на диске компьютера.

ГИС-данные могут храниться в базе данных или в файлах.

Наиболее распространенным форматом является shape-файл, который на самом деле состоит из трех и более файлов ( .shp , .dbf and .shx ).

Перед созданием нового векторного слоя необходимо определиться с его геометрией и набором атрибутов.

Геометрия может быть точечной, линейной или полигональной.

Атрибуты могут иметь тип integer (целые числа), floating point (плавающая точка), string (строка) или date (дата).

Процесс оцифровки можно разбить на рисование геометрии на карте и ввод атрибутов. Эти шаги повторяются для каждого объекта.

Экранная оцифровка часто используется для упрощения ориентирования при оцифровке и использует растр в качестве подложки.

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

Попробуйте сами!¶

Вот некоторые идеи для заданий:

Составьте список объектов вокруг школы, которые было бы интересно оцифровать. Например, граница школы, расположение пожарных щитов, кабинеты и т.д. Постарайтесь использовать различные типы геометрии. Затем разбейте учащихся на группы и каждой группе выдайте объекты для оцифровки. Попросите их настроить отображение полученных слоёв, чтобы они были более информативными. Используйте слои, подготовленные всеми группами, для создания карты школы и её окрестностей!

Найдите речку и возьмите пробы воды вдоль её течения. Тщательно обозначьте места взятия проб при помощи GPS или отмечая положение на топографической карте. Для каждого образца измерьте ряд параметров, например pH, уровень растворенного кислорода и т.п. Внесите собранные данные в ГИС-приложение и создайте карту проб, используя подходящую символику. Можете ли вы определить по ней проблемные участки? Способствовало ли этому использование ГИС-приложения?

Стоит учесть¶

Если у вас нет компьютера, можно использовать прозрачную пленку и лист бумаги. Используйте распечатанный аэрофотоснимок, ортофото или спутниковое изображение в качестве подложки. На листе бумаги нарисуйте пустую таблицу и подпишите названия столбцов для каждого атрибута. Затем обрисуйте геоеметрии объекта на прозрачной пленке и пронумеруйте их. Теперь впишите эти номера в первый столбец вашей таблицы и заполните другие столбцы дополнительной информацией.

Дополнительная литература¶

Дополнительную информацию по оцифровке в QGIS можно найти в Руководстве пользователя QGIS.

Что дальше?¶

В следующем разделе мы познакомимся с растровыми данными и узнаем как они используются в ГИС.

Если не указано иное, всё содержимое распространяется под лицензией Creative Commons Attribution-ShareAlike 3.0 (CC BY-SA)

Здравствуйте, я биолог - изучаю использование пространства животными в городе.
Сейчас нахожусь на этапе анализа данных - методы "minimum convex polygon" и "local convex hull" - суть методов проста: по имеющимся точкам (координатам) определить площади внутри полигона и по изоплетам.

В этом и есть моя задача: отобразить на карте имеющиеся совокупности точек для разных животных, посчитать основные площади по ним.
Нашёл ресурсы для анализа:
1) он-лайновый - не очень удобен по формату вывода данных
2) скрипт R - не удобен в работе, так как через командную строку - поэтому не разобрался как с ним работать.

Расчёты веду на онлайновом ресурсе по текстовым файлам координат точек - но он визуализацию выдаёт без отображения на карте - просто полигоны и их площади.
Он же предлагает использовать не текстовые файлы с координатами, а ESRI's shapefiles. На сколько я понял, эти шейпфайлы позволяют визуализировать полученные полигоны на конкретной карте. А это то, что мне и нужно.
Вопрос как создать эти шейп-файлы?
И есть ли более удобные ресурсы, программы, оболочки для таких расчётов и визуализаций?
Заранее благодарен

Репутация: 488 Ваше звание: Модератор по ArcGIS Откуда: Москва Контактная информация: если у вас есть ArcGIS то все можно сделать в нем. инструмент рассчета выпуклой оболочки для точек присутствует.
Он же предлагает использовать не текстовые файлы с координатами, а ESRI's shapefiles. На сколько я понял, эти шейпфайлы позволяют визуализировать полученные полигоны на конкретной карте. А это то, что мне и нужно.
Вопрос как создать эти шейп-файлы?

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

шейпы можно открыть практически в любом современном гис-пакете: от ArcGIS/QGIS/MapInfo до Панорамы и прочих

То есть я через ArcMap открываю текстовый файл с координатами точек и создаю шейп-файл уже в нём? Репутация: 488 Ваше звание: Модератор по ArcGIS Откуда: Москва Контактная информация: Репутация: 792 Ваше звание: званий не имею Откуда: Москва

Но, вообще, для _анализа_ данных лучше, конечно, заморочиться с R

Редактор материалов, модератор форума Репутация: 488 Ваше звание: Модератор по ArcGIS Откуда: Москва Контактная информация: Adding x,y coordinate data as a layer
Click the Tools menu and click Add XY Data.
Choose a table that contains x,y coordinate data. If the table is not on the map, click the Browse button to access it from disk.
Click the X Field drop-down arrow and click the field containing x-coordinate values.
Click the Y Field drop-down arrow and click the field containing y-coordinate values.
Click Edit to define the coordinate system and units represented in the x and y fields.
The x,y coordinates will be automatically transformed to match the coordinate system of the data frame.
Click OK. Здравствуйте ещё раз.
Я долго и вдумчиво пытался читать мануалы к АркГИС 9.3.1, но простого и доступного алгоритма работы у меня так и не сложилось.
Моя задача:
Дано: у меня есть координаты точек, в которых регистрировали животное-1, животное-2 и т.д., на каждого около 50 точек. (Координаты уже перевёл в десятичные).
Задача: визуализировать эти точки на карте и попробовать простейшие измерения площадей, плюс работа со скриптом R.
Решение. У меня сбои на первых же шагах.
Добавление карты в АркМап - jpg с последующей привязкой пробовал (привязка не получилась), потом через АркГисовские ресурсы попробовал - получилось.
Добавляю файл с координатами - из екселя - таблица добавляется, но на карте не визуализируется.
Так что до spatial analys и до шейпов я так и не дошёл.
Может я что-то важное упускаю?
Подскажите, пожалуйста, каков должен быть алгоритм.
добавление карты-добавление таблицы-а дальше? Репутация: 731 Ваше звание: NextGIS Откуда: Москва Контактная информация: Репутация: 906 Ваше звание: программист Откуда: Казань marratt писал(а): Здравствуйте, я биолог - изучаю использование пространства животными в городе.
Сейчас нахожусь на этапе анализа данных - методы "minimum convex polygon" и "local convex hull" - суть методов проста: по имеющимся точкам (координатам) определить площади внутри полигона и по изоплетам.

судя по приведенным отрывочным данным, вы пытаетесь построить что-то типа ареала распространения?

Если ваши исходные данные - точки наблюдения, то разумнее строить оценку плотности (вероятности) - если точек много. И как минимум использовать бутстрап (и считать сумму полученных полигонов), чтобы хоть как-то учесть неопределенности в данных. Поэтому, как уже указано, учите R - других доступных средств анализа в настоящее время нет - даже в коммерческих ГИС только некоторые элементарные инструменты, которые создают иллюзию решения задачи .

судя по приведенным отрывочным данным, вы пытаетесь построить что-то типа ареала распространения?

Если ваши исходные данные - точки наблюдения, то разумнее строить оценку плотности (вероятности) - если точек много. И как минимум использовать бутстрап (и считать сумму полученных полигонов), чтобы хоть как-то учесть неопределенности в данных. Поэтому, как уже указано, учите R - других доступных средств анализа в настоящее время нет - даже в коммерческих ГИС только некоторые элементарные инструменты, которые создают иллюзию решения задачи .

Репутация: 906 Ваше звание: программист Откуда: Казань

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

привлекательность_участка + предпочтения собаки

в которой предпочтения собаки есть случайный эффект. Возможно, еще добавится пространственная автокорреляция, поскольку у собаки есть "своя территория". Или вы эту территорию и пытаетесь аппроксимировать выпуклой оболочкой?

а бутстрап затем, что добавьте/уберите одну точку, и выпуклая оболочка поменяется. Поэтому было бы логично считать "среднюю" оболочку, откуда вылезет стабильное "ядро" и нечеткая периферия. И получится нечеткая выпуклая оболочка, учитывающая неопределенность данных. Как-то так .

Или вы эту территорию и пытаетесь аппроксимировать выпуклой оболочкой?

а бутстрап затем, что добавьте/уберите одну точку, и выпуклая оболочка поменяется. Поэтому было бы логично считать "среднюю" оболочку, откуда вылезет стабильное "ядро" и нечеткая периферия. И получится нечеткая выпуклая оболочка, учитывающая неопределенность данных. Как-то так .

У вас аналитический ум - мне до таких высот ещё далеко, я пока ставлю перед собой просто описательные задачи: у каждой собаки есть "своя" территория - та, на которой она реализует все свои жизненные потребности. Её размеры зависят от многих факторов: от размера собаки, её статуса, от возможностей самой территории и пр. Я хотел просто описать, что для частного сектора города размер участка в среднем такой-то, а вот для многоэтажного - такой-то. Поэтому планировал использовать средние значения, но только не по бутстрэпу для каждой собаки, а средняя оболочка от всех собак данного типового участка.
Т.е. Для каждой собаки на типовом участке я строю выпуклую оболочку - в итоге получаю определённое множество этих выпуклых оболочек - далее получаю среднюю выпуклую оболочку для данного типового участка. Констатирую, что для собак такой-то зоны города характерны такие-то размеры индивидуального участка. Затем сравниваю с другим типовым участком.

При таком подходе, вербальная модель, наверное, выглядит следующим образом:
Размер_индивидуального_участка_собаки

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

Новый шейп-файл можно создать через ArcCatalog или с помощью инструмента Создать класс пространственных объектов (Create Feature Class). При создании нового шейп-файла необходимо указать типы пространственных объектов, которые будут в нем содержаться, а также будут ли эти объекты представлять собой маршруты (иметь m значения) и будут ли они трехмерными (иметь z значения). После создания шейп-файла эти свойства уже не могут быть изменены. Также есть возможность определить систему координат шейп-файла. Если вы отложите задание системы координат шейп-файла, то она будет определена как Неизвестная (Unknown).

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

  1. Выберите папку или подключение папки в Дереве каталога.
  2. Щелкните меню Файл (File) , выберите Новый (New) , затем щелкните Шейп-файл (Shapefile) .
  3. Щелкните текстовое поле Имя (Name) и введите имя нового шейп-файла.
  4. Щелкните по стрелке ниспадающего списка Тип пространственных объектов (Feature Type) и выберите тип геометрии, которая будет содержаться в шейп-файле.
  5. Щелкните Редактировать (Edit) , чтобы задать систему координат шейп-файла.
  6. Выберите из списка, импортируйте или задайте новую систему координат.

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

В ходе работы столкнулся с задачей чтения файлов с расширением ".shp". Та информация, которую я нашел в интернете, была разрозненной и расплывчатой, и, поэтому, я решил объединить то, до чего мне пришлось доходить самостоятельно, и рассказать вам.

Постановка задачи

У нас имеется файл с расширением ".shp". В этом файле находится карта в виде изолиний: каждая изолиния сделана отдельным шейпом; наименованием шейпа является высотная характеристика изолинии. Нашей задачей станет считать данные из этого в массив. Массив представляет собой набор точек определенный тремя координатами (x, y, z). Далее этот массив нужно занести в базу данных, но данный момент мы упустим из рассмотрения.

Немного теории

Рассмотрим важные для нас особенности формата "*.shp". На самом деле ShapeFile содержит много информации, но у нас узкий интерес. Во первых нам нужно знать, что ShapeFile разделен на так называемые «Шейпы» (англ. Shape — Фигура). Шейп представляет собой фигуру или набор фигур (возможно не связанных между собой) сложных форм. Хранится шейп в виде отдельных точек и информации о линиях соединяющих их. В нашем случае каждый шейп это непрерывная кривая обозначающая положение точек земного ландшафта имеющих одинаковую высоту (наименование шейпа соответствует численному значение высоты). В виду специфичности задачи нас не будет интересовать информация о линиях соединяющих точки, а только информация о положении точек и их высота.

Стоит так же отметить, что вместе с файлом формата "*.shp" формируется файл формата "*.dbf" содержащий заголовочную информацию о наших шейпах. Файл "*.dbf" должен иметь такое же название, что и файл ".shp".

MapWindowGIS

image

После того, как Вы скачаете данную библиотеку необходимо ее установить. После установки, запускаем среду разработки 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. С поставленной задачей мы справились полностью. Конечно, данный обзор является только вершиной айсберга, но я надеюсь эта вводная статья поможет вам в дальнейшем освоении этого направления.


Вот наконец-то, я добрался и до MapWindow GIS, давненько, я про него ничего не писал, но это не просто так, так как уже почти большую часть, я про него рассказал, и Вы уже спокойно можете начинать делать свою небольшую ГИС. Осталось рассмотреть совсем не большие темы, а на этот раз мы рассмотрим, как можно из своего проекта создать сам слой карты, то есть shp-файл.

Хотя, на самом деле, созданием одного слоя мы не обойдемся. Я надеюсь, Вы помните, какие файлы еще должны находиться, в одной папке с shape-файлом, если нет, то я напоминаю:

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

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

Ну что, приступим к созданию нашего проекта. Давайте установим следующие компоненты на форму:

Ну сам компонент, TMap, нам понадобится для того, чтобы отобразить то, что мы создадим, то есть отобразить наш слой, а по нажатию на кнопку, мы будем создавать слой и его отображать в компоненте TMap.

Давайте разберем те функции, которые нам потребуются для создания shape-файла. Все функции, что рассмотрим, относятся к интерфейсу IShapeFile:

  1. CreateNew(ShapeFileName:String; ShapeFileType:ShpFileType):Boolean — функция, которая создает shape-файл, в параметрах необходимо указать имя shape-файла, а также тип создаваемого слоя, он может принимать следующие значения:
    • SHP_NULLSHAPE
    • SHP_POINT
    • SHP_POLYLINE
    • SHP_POLYGON
    • SHP_MULTIPOINT
    • SHP_POINTZ
    • SHP_POLYLINEZ
    • SHP_POLYGONZ
    • SHP_MULTIPOINTZ
    • SHP_POINTM
    • SHP_POLYLINEM
    • SHP_POLYGONM
    • SHP_MULTIPOINTM
    • SHP_MULTIPATCH
  2. StartEditingShapes(StartEditTable:Boolean;cBack:iCallBack):Boolean — функция, которая разрешает редактировать shape-объект, в том числе, таблица атрибутов, также должна быть в режиме редактирования.
  3. EditInsertField(NewField:Field;ByRef:Ineger;cBack:iCallback):Boolean — функция, которая разрешает ввод/редактирования параметров таблицы атрибутов, в параметрах требуется указать объект интерфейса IField, который необходимо редактировать или добавить в него что-то, а также номер столбца.
  4. EditInsertShape(Shape:Shape;ByRef:Integer):Boolean — функция, которая вставляет фигуру на наш слой (точка, полигон, линия и т.д), в параметрах указывается объект интерфейса IShape и номер фигуры, которую необходимо отредактировать или вставить.
  5. EditCellValue(FieldIndex:Integer;ShapeIndex:Integer;NewVal:OleVariant):Boolean — функция, которая редактирует данные таблицы атрибутов, с параметрами все понятно должно быть тут.
  6. StopEditingShapes(ApplyChanges:Boolean;StopEditTable:Boolean;cBack:ICallback):Boolean — функция, которая запрещает редактировать наш shape - файл.

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

Переменная shp-наш shape-файл, переменная fld-для работы с таблицей атрибутов, переменная pt-для создания точек, на нашем слое, переменная sh-для работы с фигурами слоя.

В начале создаем наш shape-файл, размещаем его на диске C:\ и сразу же с помощью функции StartEditingShapes разрешаем его редактировать.

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

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

Дальше все просто, с помощью функции EditCellValue, записываем значения в таблицу атрибутов, чтобы данный слой можно было использовать и другой программой, ну и запрещаем редактирование shape-файла, c помощью функции StopEditingShapes.

В самом конце, просто отображаем все наши линии в компонент TMap

Читайте также: