Example #1
0
 public function out()
 {
     $args = func_get_args();
     $format = array_shift($args);
     $type_map = geoPHP::getAdapterMap();
     $processor_type = $type_map[$format];
     $processor = new $processor_type();
     array_unshift($args, $this);
     $result = call_user_func_array(array($processor, 'write'), $args);
     return $result;
 }
 function testAdapters()
 {
     foreach (scandir('./input', SCANDIR_SORT_NONE) as $file) {
         $parts = explode('.', $file);
         if ($parts[0]) {
             $format = $parts[1];
             $input = file_get_contents('./input/' . $file);
             echo "\nloading: " . $file . " for format: " . $format;
             $geometry = geoPHP::load($input, $format);
             // Test adapter output and input. Do a round-trip and re-test
             foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) {
                 if ($adapter_key != 'google_geocode') {
                     //Don't test google geocoder regularily. Uncomment to test
                     $output = $geometry->out($adapter_key);
                     $this->assertNotNull($output, "Empty output on " . $adapter_key);
                     if ($output) {
                         $adapter_loader = new $adapter_class();
                         $test_geom_1 = $adapter_loader->read($output);
                         $test_geom_2 = $adapter_loader->read($test_geom_1->out($adapter_key));
                         $this->assertEquals($test_geom_1->out('wkt'), $test_geom_2->out('wkt'), "Mismatched adapter output in " . $adapter_class . ' (test file: ' . $file . ')');
                     }
                 }
             }
             // Test to make sure adapter work the same wether GEOS is ON or OFF
             // Cannot test methods if GEOS is not intstalled
             if (!geoPHP::geosInstalled()) {
                 return;
             }
             foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) {
                 if ($adapter_key != 'google_geocode') {
                     //Don't test google geocoder regularily. Uncomment to test
                     // Turn GEOS on
                     geoPHP::geosInstalled(TRUE);
                     $output = $geometry->out($adapter_key);
                     if ($output) {
                         $adapter_loader = new $adapter_class();
                         $test_geom_1 = $adapter_loader->read($output);
                         // Turn GEOS off
                         geoPHP::geosInstalled(FALSE);
                         $test_geom_2 = $adapter_loader->read($output);
                         // Turn GEOS back On
                         geoPHP::geosInstalled(TRUE);
                         // Check to make sure a both are the same with geos and without
                         $this->assertEquals($test_geom_1->out('wkt'), $test_geom_2->out('wkt'), "Mismatched adapter output between GEOS and NORM in " . $adapter_class . ' (test file: ' . $file . ')');
                     }
                 }
             }
         }
     }
 }
Example #3
0
 static function load()
 {
     $args = func_get_args();
     $data = array_shift($args);
     $type = array_shift($args);
     $type_map = geoPHP::getAdapterMap();
     // Auto-detect type if needed
     if (!$type) {
         // If the user is trying to load a Geometry from a Geometry... Just pass it back
         if (is_object($data)) {
             if ($data instanceof Geometry) {
                 return $data;
             }
         }
         $detected = geoPHP::detectFormat($data);
         if (!$detected) {
             return FALSE;
         }
         $format = explode(':', $detected);
         $type = array_shift($format);
         $args = $format;
     }
     $processor_type = $type_map[$type];
     if (!$processor_type) {
         throw new exception('geoPHP could not find an adapter of type ' . htmlentities($type));
     }
     $processor = new $processor_type();
     // Data is not an array, just pass it normally
     if (!is_array($data)) {
         $result = call_user_func_array(array($processor, "read"), array_merge(array($data), $args));
     } else {
         $geoms = array();
         foreach ($data as $item) {
             $geoms[] = call_user_func_array(array($processor, "read"), array_merge(array($item), $args));
         }
         $result = geoPHP::geometryReduce($geoms);
     }
     return $result;
 }
Example #4
0
function test_adapters($geometry, $format, $input)
{
    // Test adapter output and input. Do a round-trip and re-test
    foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) {
        if ($adapter_key != 'google_geocode') {
            //Don't test google geocoder regularily. Uncomment to test
            $output = $geometry->out($adapter_key);
            $adapter_loader = new $adapter_class();
            $test_geom_1 = $adapter_loader->read($output);
            $test_geom_2 = $adapter_loader->read($test_geom_1->out($adapter_key));
            // Check to make sure a round-trip results in the same geometry
            if ($test_geom_1->out('wkt') != $test_geom_2->out('wkt')) {
                print "Mismatched adapter output in " . $adapter_class . "\n";
            }
        }
    }
    // Test to make sure adapter work the same wether GEOS is ON or OFF
    // Cannot test methods if GEOS is not intstalled
    if (!geoPHP::geosInstalled()) {
        return;
    }
    foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) {
        if ($adapter_key != 'google_geocode') {
            //Don't test google geocoder regularily. Uncomment to test
            // Turn GEOS on
            geoPHP::geosInstalled(TRUE);
            $output = $geometry->out($adapter_key);
            $adapter_loader = new $adapter_class();
            $test_geom_1 = $adapter_loader->read($output);
            // Turn GEOS off
            geoPHP::geosInstalled(FALSE);
            $test_geom_2 = $adapter_loader->read($output);
            // Turn GEOS back On
            geoPHP::geosInstalled(TRUE);
            // Check to make sure a both are the same with geos and without
            if ($test_geom_1->out('wkt') != $test_geom_2->out('wkt')) {
                print "Mismatched adapter output between GEOS and NORM in " . $adapter_class . "\n";
            }
        }
    }
}
function test_geometry($geometry, $test_adapters = TRUE)
{
    // Test common functions
    $geometry->area();
    $geometry->boundary();
    $geometry->envelope();
    $geometry->getBBox();
    $geometry->centroid();
    $geometry->length();
    $geometry->y();
    $geometry->x();
    $geometry->numGeometries();
    $geometry->geometryN(1);
    $geometry->startPoint();
    $geometry->endPoint();
    $geometry->isRing();
    $geometry->isClosed();
    $geometry->numPoints();
    $geometry->pointN(1);
    $geometry->exteriorRing();
    $geometry->numInteriorRings();
    $geometry->interiorRingN(1);
    $geometry->dimension();
    $geometry->geometryType();
    $geometry->SRID();
    $geometry->setSRID(4326);
    $geometry->getCoordinates();
    $geometry->getGeoInterface();
    // Aliases
    $geometry->getCentroid();
    $geometry->getArea();
    $geometry->getX();
    $geometry->getY();
    $geometry->getGeos();
    $geometry->getGeomType();
    $geometry->getSRID();
    $geometry->asText();
    $geometry->asBinary();
    // GEOS only functions
    $geometry->geos();
    $geometry->setGeos($geometry->geos());
    $geometry->pointOnSurface();
    $geometry->equals($geometry);
    $geometry->equalsExact($geometry);
    $geometry->relate($geometry);
    $geometry->checkValidity();
    $geometry->isSimple();
    $geometry->buffer(10);
    $geometry->intersection($geometry);
    $geometry->convexHull();
    $geometry->difference($geometry);
    $geometry->symDifference($geometry);
    $geometry->union($geometry);
    $geometry->simplify(0);
    // @@TODO: Adjust this once we can deal with empty geometries
    $geometry->disjoint($geometry);
    $geometry->touches($geometry);
    $geometry->intersects($geometry);
    $geometry->crosses($geometry);
    $geometry->within($geometry);
    $geometry->contains($geometry);
    $geometry->overlaps($geometry);
    $geometry->covers($geometry);
    $geometry->coveredBy($geometry);
    $geometry->distance($geometry);
    $geometry->hausdorffDistance($geometry);
    // Place holders
    $geometry->hasZ();
    $geometry->is3D();
    $geometry->isMeasured();
    $geometry->isEmpty();
    $geometry->coordinateDimension();
    $geometry->z();
    $geometry->m();
    // Test adapter output and input. Do a round-trip and re-test
    if ($test_adapters) {
        foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) {
            if ($adapter_key != 'google_geocode') {
                //Don't test google geocoder regularily. Uncomment to test
                $format = $geometry->out($adapter_key);
                $adapter_loader = new $adapter_class();
                $translated_geometry = $adapter_loader->read($format);
                #test_geometry($translated_geometry, FALSE);
            }
        }
    }
}