Exemple #1
0
 public function test_geometryText2Points()
 {
     $fRadius = 1;
     // invalid value
     $this->assertEquals(NULL, geometryText2Points('', $fRadius));
     // POINT
     $aPoints = geometryText2Points('POINT(10 20)', $fRadius);
     $this->assertEquals(101, count($aPoints));
     $this->assertEquals(array([10, 21], [10.062790519529, 20.998026728428], [10.125333233564, 20.992114701314]), array_splice($aPoints, 0, 3));
     // POLYGON
     $this->assertEquals(array(['30', '10'], ['40', '40'], ['20', '40'], ['10', '20'], ['30', '10']), geometryText2Points('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', $fRadius));
     // MULTIPOLYGON
     $this->assertEquals(array(['30', '20'], ['45', '40'], ['10', '40'], ['30', '20']), geometryText2Points('MULTIPOLYGON(((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))', $fRadius));
 }
Exemple #2
0
 function getOutlines($iPlaceID, $fLon = null, $fLat = null, $fRadius = null)
 {
     $aOutlineResult = array();
     if (!$iPlaceID) {
         return $aOutlineResult;
     }
     if (CONST_Search_AreaPolygons) {
         // Get the bounding box and outline polygon
         $sSQL = "select place_id,0 as numfeatures,st_area(geometry) as area,";
         $sSQL .= "ST_Y(centroid) as centrelat,ST_X(centroid) as centrelon,";
         $sSQL .= "ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,";
         $sSQL .= "ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon";
         if ($this->bIncludePolygonAsGeoJSON) {
             $sSQL .= ",ST_AsGeoJSON(geometry) as asgeojson";
         }
         if ($this->bIncludePolygonAsKML) {
             $sSQL .= ",ST_AsKML(geometry) as askml";
         }
         if ($this->bIncludePolygonAsSVG) {
             $sSQL .= ",ST_AsSVG(geometry) as assvg";
         }
         if ($this->bIncludePolygonAsText || $this->bIncludePolygonAsPoints) {
             $sSQL .= ",ST_AsText(geometry) as astext";
         }
         $sFrom = " from placex where place_id = " . $iPlaceID;
         if ($this->fPolygonSimplificationThreshold > 0) {
             $sSQL .= " from (select place_id,centroid,ST_SimplifyPreserveTopology(geometry," . $this->fPolygonSimplificationThreshold . ") as geometry" . $sFrom . ") as plx";
         } else {
             $sSQL .= $sFrom;
         }
         $aPointPolygon = $this->oDB->getRow($sSQL);
         if (PEAR::IsError($aPointPolygon)) {
             echo var_dump($aPointPolygon);
             failInternalError("Could not get outline.", $sSQL, $aPointPolygon);
         }
         if ($aPointPolygon['place_id']) {
             if ($aPointPolygon['centrelon'] !== null && $aPointPolygon['centrelat'] !== null) {
                 $aOutlineResult['lat'] = $aPointPolygon['centrelat'];
                 $aOutlineResult['lon'] = $aPointPolygon['centrelon'];
             }
             if ($this->bIncludePolygonAsGeoJSON) {
                 $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson'];
             }
             if ($this->bIncludePolygonAsKML) {
                 $aOutlineResult['askml'] = $aPointPolygon['askml'];
             }
             if ($this->bIncludePolygonAsSVG) {
                 $aOutlineResult['assvg'] = $aPointPolygon['assvg'];
             }
             if ($this->bIncludePolygonAsText) {
                 $aOutlineResult['astext'] = $aPointPolygon['astext'];
             }
             if ($this->bIncludePolygonAsPoints) {
                 $aOutlineResult['aPolyPoints'] = geometryText2Points($aPointPolygon['astext'], $fRadius);
             }
             if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 1.0E-7) {
                 $aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius;
                 $aPointPolygon['maxlat'] = $aPointPolygon['maxlat'] + $fRadius;
             }
             if (abs($aPointPolygon['minlon'] - $aPointPolygon['maxlon']) < 1.0E-7) {
                 $aPointPolygon['minlon'] = $aPointPolygon['minlon'] - $fRadius;
                 $aPointPolygon['maxlon'] = $aPointPolygon['maxlon'] + $fRadius;
             }
             $aOutlineResult['aBoundingBox'] = array((string) $aPointPolygon['minlat'], (string) $aPointPolygon['maxlat'], (string) $aPointPolygon['minlon'], (string) $aPointPolygon['maxlon']);
         }
     }
     // CONST_Search_AreaPolygons
     // as a fallback we generate a bounding box without knowing the size of the geometry
     if (!isset($aOutlineResult['aBoundingBox']) && isset($fLon)) {
         if ($this->bIncludePolygonAsPoints) {
             $sGeometryText = 'POINT(' . $fLon . ',' . $fLat . ')';
             $aOutlineResult['aPolyPoints'] = geometryText2Points($sGeometryText, $fRadius);
         }
         $aBounds = array();
         $aBounds['minlat'] = $fLat - $fRadius;
         $aBounds['maxlat'] = $fLat + $fRadius;
         $aBounds['minlon'] = $fLon - $fRadius;
         $aBounds['maxlon'] = $fLon + $fRadius;
         $aOutlineResult['aBoundingBox'] = array((string) $aBounds['minlat'], (string) $aBounds['maxlat'], (string) $aBounds['minlon'], (string) $aBounds['maxlon']);
     }
     return $aOutlineResult;
 }