{
// Start with a blank search
$aSearches = array(
- array('iSearchRank' => 0, 'iNamePhrase' => -1, 'sCountryCode' => false, 'aName'=>array(), 'aAddress'=>array(), 'aFullNameAddress'=>array(),
- 'aNameNonSearch'=>array(), 'aAddressNonSearch'=>array(),
- 'sOperator'=>'', 'aFeatureName' => array(), 'sClass'=>'', 'sType'=>'', 'sHouseNumber'=>'', 'fLat'=>'', 'fLon'=>'', 'fRadius'=>'')
+ array('iSearchRank' => 0,
+ 'iNamePhrase' => -1,
+ 'sCountryCode' => false,
+ 'aName' => array(),
+ 'aAddress' => array(),
+ 'aFullNameAddress' => array(),
+ 'aNameNonSearch' => array(),
+ 'aAddressNonSearch' => array(),
+ 'sOperator' => '',
+ 'aFeatureName' => array(),
+ 'sClass' => '',
+ 'sType' => '',
+ 'sHouseNumber' => '',
+ 'fLat' => '',
+ 'fLon' => '',
+ 'fRadius' => ''
+ )
);
// Do we have a radius search?
if ($this->bIncludePolygonAsPoints)
{
- // Translate geometry string to point array
- if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['astext'],$aMatch))
- {
- preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER);
- }
- elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#',$aPointPolygon['astext'],$aMatch))
- {
- preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER);
- }
- elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#',$aPointPolygon['astext'],$aMatch))
+ $aPolyPoints[] = geometryText2Points($aPointPolygon['astext'],$fRadius);
+
+ // Output data suitable for display (points and a bounding box)
+ if (isset($aPolyPoints))
{
- $iSteps = max(8, min(100, ($fRadius * 40000)^2));
- $fStepSize = (2*pi())/$iSteps;
- $aPolyPoints = array();
- for($f = 0; $f < 2*pi(); $f += $fStepSize)
+ $aResult['aPolyPoints'] = array();
+ foreach($aPolyPoints as $aPoint)
{
- $aPolyPoints[] = array('',$aMatch[1]+($fRadius*sin($f)),$aMatch[2]+($fRadius*cos($f)));
+ $aResult['aPolyPoints'][] = array($aPoint[1], $aPoint[2]);
}
}
}
- // Output data suitable for display (points and a bounding box)
- if ($this->bIncludePolygonAsPoints && isset($aPolyPoints))
- {
- $aResult['aPolyPoints'] = array();
- foreach($aPolyPoints as $aPoint)
- {
- $aResult['aPolyPoints'][] = array($aPoint[1], $aPoint[2]);
- }
- }
-
if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 0.0000001)
{
$aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius;
return array('lat' => $fQueryLat, 'lon' => $fQueryLon, 'query' => $sQuery);
}
+
+
+
+ function geometryText2Points($geometry_as_text,$fRadius)
+ {
+ $aPolyPoints = NULL;
+ if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$geometry_as_text,$aMatch))
+ {
+ preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER);
+ }
+ elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#',$geometry_as_text,$aMatch))
+ {
+ preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER);
+ }
+ elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#',$geometry_as_text,$aMatch))
+ {
+ $iSteps = max(8, min(100, ($fRadius * 40000)^2));
+ $fStepSize = (2*pi())/$iSteps;
+ $aPolyPoints = array();
+ for($f = 0; $f < 2*pi(); $f += $fStepSize)
+ {
+ $aPolyPoints[] = array('',$aMatch[1]+($fRadius*sin($f)),$aMatch[2]+($fRadius*cos($f)));
+ }
+ }
+ return $aPolyPoints;
+ }
count( getWordSets(array_fill( 0, 18, 'a'),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', '30', '10'],
+ ['40 40', '40', '40'],
+ ['20 40', '20', '40'],
+ ['10 20', '10', '20'],
+ ['30 10', '30', '10']
+ ),
+ geometryText2Points('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', $fRadius)
+ );
+
+ // MULTIPOLYGON
+ // only the first polygon is used
+ $this->assertEquals(
+ array(
+ ['30 20', '30', '20'],
+ ['45 40', '45', '40'],
+ ['10 40', '10', '40'],
+ ['30 20', '30', '20'],
+
+ // ['15 5' , '15', '5' ],
+ // ['45 10', '45', '10'],
+ // ['10 20', '10', '20'],
+ // ['5 10' , '5' , '10'],
+ // ['15 5' , '15', '5' ]
+ ),
+ geometryText2Points('MULTIPOLYGON(((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))', $fRadius)
+ );
}