Короткая инструкция, как получать геометрию и атрибутику из shape-файлов с помощью Perl. Сначала нужно установить расширение Perl Geo::ShapeFile. Скачиваем архив и распаковываем содержимое в Perl. Это расширение позволяет читать и записывать shape-формат в Perl, разберемся для начала как считывать и то и другое. Разберем небольшой скрипт построчно:
Для начала объявим используемый интерпретатор:
#!/usr/bin/perl |
Подключим используемое расширение:
use Geo::ShapeFile; |
Укажем имя исходного shape-файла (указывается без расширения):
my $filename = "Data/test"; |
С помощью процедуры Geo::ShapeFile() назначим содержимое shape-файла переменной $shapefile:
my $shapefile = new Geo::ShapeFile($filename); |
shapes() позволяет получить количество объектов в shape-файле, выведем его на экран
printf "%d shapes\n", $shapefile->shapes(); |
Этот массив содержит объекты, с которыми можно выполнять некоторый набор операций. Обычная задача – циклом сделать что-то с каждым из объектов, например так:
for (my $i=1; $i<=$shapefile->shapes(); $i++) { ... } |
Далее, для получения геометрии каждого объекта используем функцию get_shp_record():
my $shape = $shapefile->get_shp_record($i); |
Подобная функция есть и для получения атрибутики get_dbf_record(), она получает весь список атрибутов для объекта:
my $db = $shapefile->get_dbf_record($i); |
Для получения конкретного атрибута, нам надо знать его имя, причем записывается оно большими буквами, например получим значение для каждого объекта в поле ISLAND:
my $island = $db->{ISLAND}; |
и выведем Id объекта
if ($island = "yes") { print $db->{ID}."\n"; } |
Все вышеупомянутое одним скриптом:
#!/usr/bin/perl use Geo::ShapeFile; my $filename = "Data/NGA_GlobalShoreline_cd22"; my $shapefile = new Geo::ShapeFile($filename); printf "%d shapes\n", $shapefile->shapes(); for (my $i=1; $i<=$shapefile->shapes(); $i++) { my $shape = $shapefile->get_shp_record($i); my $db = $shapefile->get_dbf_record($i); my $island = $db->{ISLAND}; if ($island = "yes") { print $db->{ID}."\n"; } } |
Для других языков где нет библиотек для SHP можно перевести его в KML с помощью ogr2ogr и работать как с обычным XML.
интересно что быстрее, парсить Perl’ом shape или expat/libxml – xml….