# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl Geo-Vector.t' ######################### use Test::More qw(no_plan); BEGIN { use_ok('Geo::Vector') }; use Geo::OGC::Geometry; #use Data::Dumper; ######################### for ('dbf','prj','shp','shx') { unlink "t/test.$_"; } eval { $test = Geo::Vector->new(); }; ok(($test and ($@ eq '')), "open memory as a data source: $@"); for (@Geo::OGR::Geometry::GEOMETRY_TYPES) { next if $_ =~ /GeometryC/; next if $_ =~ /Multi/; next if $_ =~ /Unkno/; next if $_ =~ /None/; next if $_ =~ /Ring/; eval { $test = Geo::Vector->new(create=>'test'.$_, geometry_type=>$_); }; my $tt = ''; $tt = $test->geometry_type() unless $@; ok($_ eq $tt,"Create layer with $_ type: $@"); } eval { $test = Geo::Vector->new(driver=>'ESRI Shapefile', data_source=>'./t', create=>'test', geometry_type=>'Point'); }; ok($@ eq '', "create a layer into the new dataset: $@"); eval { $test->schema(Fields => [{Name => 'int', Type=> 'Integer'}, {Name => 'real', Type => 'Real'}]); }; ok($@ eq '', "add a schema into the layer: $@"); eval { $test->add_feature(Geometry=>Geo::OGC::Point->new(1.123,2.345),int=>12,real=>3.4); $test->feature({Geometry=>Geo::OGC::Point->new(2.123,2.345),int=>13,real=>4.4}); $test->add_feature(Geometry=>Geo::OGC::Point->new(0.123,2.345),int=>15,real=>7.4); }; ok($@ eq '', "add a feature into the layer: $@"); @range = $test->value_range(field_name=>'int',filter_rect=>[1,2,3,3]); ok($range[1] == 13, 'value_range with filter_rect'); undef $test; eval { $test = new Geo::Vector(data_source=>'./t', open=>'test'); }; ok($@ eq '', "open a layer: $@"); ok ($test->feature_count == 3, 'feature_count '.$test->feature_count); @w = $test->world; ok (@w == 4, 'world size'); eval { $f = $test->feature(0); }; ok($@ eq '', "retrieve a feature: $@"); #ok (abs($f->{geometry}->X - 1.123) < 0.01, 'returns correct data'); #ok (abs($f->{real}-3.4) < 0.01, 'returns correct attr'); $f = 1; ok(1); ok(1); for ('dbf','prj','shp','shx') { unlink "t/test.$_"; } # test a layer of features with varying schema $v = Geo::Vector->new( features => [] ); $v->add_feature(sfield => 'string', ifield => 1, rfield => 1.23, Geometry => Geo::OGC::Point->new(12.34, 56.78)); ok($v->feature_count == 1, 'fset: feature count'); my $s = $v->feature(0)->Schema; ok($s->field('rfield')->{Name} eq 'rfield', 'fset: schema'); ok($s->field('sfield')->{Name} eq 'sfield', 'fset: schema'); my $ogc = Geo::OGC::Point->new(1,2); my $ogr = Geo::OGR::CreateGeometryFromWkt($ogc->AsText); ok($ogc->AsText eq $ogr->ExportToWkt, "OGC and OGR wkts equal in Point"); $ogc = Geo::OGC::LineString->new(); $ogc->AddPoint(Geo::OGC::Point->new(1,2)); $ogc->AddPoint(Geo::OGC::Point->new(3,4)); $ogc->AddPoint(Geo::OGC::Point->new(6,5)); $ogr = Geo::OGR::CreateGeometryFromWkt($ogc->AsText); my $wkt = $ogr->ExportToWkt; my $ogc2 = Geo::OGC::Geometry->new(Text => $wkt); ok(is_deeply($ogc, $ogc2), "OGC and OGR wkts equal in LineString"); $C = new Geo::OGC::GeometryCollection; $C->AddGeometry(Geo::OGC::Point->new(0, 0)); $ogr = Geo::OGR::CreateGeometryFromWkt($C->AsText); $box = Geo::Vector->new(); $box->add_feature(Geometry=>'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'); $points = Geo::Vector->new(); $points->add_feature(Geometry=>'POINT(1 1)'); $points->add_feature(Geometry=>'POINT(20 1)'); $within = $points->features( that_are_within => $box->geometry(0) ); ok($within->[0]->GetGeometry->ExportToWkt eq 'POINT (1 1)', 'Within, WKT'); $g = Geo::OGR::Geometry->create(WKT => 'POINT (1 1)'); $v = Geo::Vector->new(geometries => [$g]); $p = $v->geometry(0); ok($g->ExportToWkt eq $p->ExportToWkt, "geometries"); #$c = Geo::Vector->new(features=>"t/data/a.geojson");