три дня ломаю голову - переборовала все варинты, но безуспешно, может быть кто-то подскажет решение следующей задачи.
хочу сделать скрипт, который эдробит шейпфайл на отдельные шейпы по некоторому полю (аналог операции split by column например в arcview). Хотела написать именно через gdal но не получается из-за банальной вещи - не могу сделать список уникальных значения той колонки, по которой дробить.
Тот код, что ниже - работает, но! он дико неэффективный, т.к. перебирает последовательно все строки таблицы, а хотелось бы, чтобы цикл перебирал только уникальные значения, иначе уже для 10000 записей это удовольствие растягивается на минут 7.
Что делать?
Пробовала уже и просто подключать какую-то дополнительную библиотеку для работы с dbf - так там не работает sql запрос group by. вобщем, друзья, посоветуйте как получить уникальные значения для определенной колонки таблицы шейпфайла?
Код: Выделить всё
# information that we need:
$dsname = "."; # name of the datasource (in this case a directory)
$lname = "cirsium"; # name of the layer
$field = "SPECIES"; # name of the field whose value we need
$lname2 = "test2";
$datasource = Geo::OGR::Open($dsname);
$layer1 = $datasource->Layer($lname);
$osr = new Geo::OSR::SpatialReference;
$osr->SetWellKnownGeogCS('WGS84');
$schema = Geo::OGR::Layer::Schema ($layer1);
$layer1->ResetReading();
$counter = Geo::OGR::Layer::GetFeatureCount($layer1);
print "$count\n";
for ($count = 0; $count <= $counter; $count++) {
$feature = $layer1->GetFeature($count);
$value = $feature->GetField($field);
print "$value\n";
$sql = "select * from cirsium where SPECIES = '$value'";
$layer1 = $datasource->ExecuteSQL($sql);
$datasource2 = Geo::OGR::Driver('ESRI Shapefile')->Create($dsname) or die;
$layer2 = $datasource2->CreateLayer({ Name => $value, SRS => $osr, GeometryType => $layer1->GetLayerDefn->GeometryType, Schema =>$schema});
#$layer1->ResetReading();
while ($feature = $layer1->GetNextFeature()) {
$value = $feature->GetField($field);
print "$value\n";
$layer2->InsertFeature($feature);
}
}