GIS-LAB

Географические информационные системы и дистанционное зондирование

Чтение shape-формата в Perl

Максим Дубинин, 14.09.2008

Короткая инструкция, как получать геометрию и атрибутику из 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";
        }
}

Комментарии (2) к статье “Чтение shape-формата в Perl”

  1. denis27 says:

    Для других языков где нет библиотек для SHP можно перевести его в KML с помощью ogr2ogr и работать как с обычным XML.

  2. sim says:

    интересно что быстрее, парсить Perl’ом shape или expat/libxml – xml….

Оставьте комментарий


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter