+ // 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]);
+ }
+ // degrees decimal
+ // 12.34, 56.78
+ // [12.456,-78.90]
+ // 1 2 3 4
+ elseif (preg_match('/(\\[|^|\\b)(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData))
+ {
+ $sFound = $aData[0];
+ $fQueryLat = $aData[2];
+ $fQueryLon = $aData[3];
+ }
+
+ if (!validLatLon($fQueryLat, $fQueryLon)) return;
+ $sQuery = trim(str_replace($sFound, ' ', $sQuery));
+
+ return array('lat' => $fQueryLat, 'lon' => $fQueryLon, 'query' => $sQuery);
+ }