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)); }
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; }