- $fSearchDiam = $fSearchDiam * 2;
-
- // If we have to expand the search area by a large amount then we need a larger feature
- // then there is a limit to how small the feature should be
- if ($fSearchDiam > 2 && $iMaxRank > 4) $iMaxRank = 4;
- if ($fSearchDiam > 1 && $iMaxRank > 9) $iMaxRank = 8;
- if ($fSearchDiam > 0.8 && $iMaxRank > 10) $iMaxRank = 10;
- if ($fSearchDiam > 0.6 && $iMaxRank > 12) $iMaxRank = 12;
- if ($fSearchDiam > 0.2 && $iMaxRank > 17) $iMaxRank = 17;
- if ($fSearchDiam > 0.1 && $iMaxRank > 18) $iMaxRank = 18;
- if ($fSearchDiam > 0.008 && $iMaxRank > 22) $iMaxRank = 22;
- if ($fSearchDiam > 0.001 && $iMaxRank > 26) $iMaxRank = 26;
-
- $sSQL = 'select place_id,parent_place_id from placex';
- $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
- $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
- $sSQL .= ' and (name is not null or housenumber is not null)';
- $sSQL .= ' and class not in (\'waterway\')';
- $sSQL .= ' and (ST_GeometryType(geometry) not in (\'ST_Polygon\',\'ST_MultiPolygon\') ';
- $sSQL .= ' OR ST_DWithin('.$sPointSQL.', ST_Centroid(geometry), '.$fSearchDiam.'))';
- $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', geometry) ASC limit 1';
-//var_dump($sSQL);
- $aPlace = $oDB->getRow($sSQL);
- $iPlaceID = $aPlace['place_id'];
- if (PEAR::IsError($iPlaceID))
- {
- var_Dump($sSQL, $iPlaceID);
- exit;
- }
+ $sFound = $aData[0];
+ $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60);
+ $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[5] + $aData[6]/60);
+ }
+ // degrees decimal minutes
+ // 40 26.767 N, 79 58.933 W
+ // 40° 26.767′ N 79° 58.933′ W
+ // 1 2 3 4 5 6
+ elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\']*[ ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\' ]+([EW])\\b/', $sQuery, $aData))
+ {
+ $sFound = $aData[0];
+ $fQueryLat = ($aData[3]=='N'?1:-1) * ($aData[1] + $aData[2]/60);
+ $fQueryLon = ($aData[6]=='E'?1:-1) * ($aData[4] + $aData[5]/60);
+ }
+ // degrees decimal seconds
+ // N 40 26 46 W 79 58 56
+ // N 40° 26′ 46″, W 79° 58′ 56″
+ // 1 2 3 4 5 6 7 8
+ elseif (preg_match('/\\b([NS])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*[, ]+([EW])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*\\b/', $sQuery, $aData))
+ {
+ $sFound = $aData[0];
+ $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60 + $aData[4]/3600);
+ $fQueryLon = ($aData[5]=='E'?1:-1) * ($aData[6] + $aData[7]/60 + $aData[8]/3600);
+ }
+ // degrees decimal seconds
+ // 40 26 46 N 79 58 56 W
+ // 40° 26′ 46″ N, 79° 58′ 56″ W
+ // 1 2 3 4 5 6 7 8
+ elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\b/', $sQuery, $aData))
+ {
+ $sFound = $aData[0];
+ $fQueryLat = ($aData[4]=='N'?1:-1) * ($aData[1] + $aData[2]/60 + $aData[3]/3600);
+ $fQueryLon = ($aData[8]=='E'?1:-1) * ($aData[5] + $aData[6]/60 + $aData[7]/3600);
+ }
+ // degrees decimal
+ // N 40.446° W 79.982°
+ // 1 2 3 4
+ elseif (preg_match('/\\b([NS])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*[, ]+([EW])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*\\b/', $sQuery, $aData))
+ {
+ $sFound = $aData[0];
+ $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2]);
+ $fQueryLon = ($aData[3]=='E'?1:-1) * ($aData[4]);
+ }
+ // degrees decimal
+ // 40.446° N 79.982° W
+ // 1 2 3 4
+ elseif (preg_match('/\\b([0-9]+[0-9]*\\.[0-9]+)[° ]+([NS])[, ]+([0-9]+[0-9]*\\.[0-9]+)[° ]+([EW])\\b/', $sQuery, $aData))
+ {
+ $sFound = $aData[0];
+ $fQueryLat = ($aData[2]=='N'?1:-1) * ($aData[1]);
+ $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[3]);