Я работал над этим дальше (и заметил, что вы редактировали свой вопрос).
A) Какой самый простой способ попросить обычных пользователей, не являющихся техническими специалистами, ввести координаты GPS?
Самым простым и удобным для пользователя способом, позволяющим пользователям, не являющимся специалистами, вводить данные, будет использование Карт Google. Это позволит вам использовать Google Geocoder для анализа их ввода (и обеспечить более стандартизированный и форматированный вывод). Кроме того, если местоположение, которое вводит пользователь, является его текущим местоположением, вы можете посмотреть на него с помощью функции геолокации, предлагаемой некоторыми современными браузерами.
B) Как мне преобразовать вышеупомянутое в окончательный формат? Любые встроенные функции, которые обрабатывают эти изменения при вводе данных?
На основе ваших тестовых данных я сформулировал регулярное выражение PHP для его анализа и получения предсказуемого и стандартизированного вывода.
$rexp = '/^(\-?\d+(?:\.\d+)?)(?:\D+(\d+)\D+(\d+)([NS]?))?[^\d\-]+(\-?\d+(?:\.\d+)?)(?:\D+(\d+)\D+(\d+)([EW]?))?$/i';
$data = array(
"21° 16' 674S, 27° 30' 318E" ,
'21 16 674S, 27 30 318E' ,
'9.182, -39.140625' ,
'9.182 / -39.140625' ,
'9.182,-39.140625' ,
'9.182 -39.140625'
);
foreach( $data as $test ) {
if( !preg_match( $rexp , $test , $matches ) ) {
echo '<b>Failed</b>';
} else {
// Match Found
}
}
Выходы:
array(
[0] => Matched Text ,
[1] => Full Degrees ,
[2] => Minutes ,
[3] => Seconds ,
[4] => Hemisphere (N or S) ,
[5] => Full Degrees ,
[6] => Minutes ,
[7] => Seconds ,
[8] => Hemisphere (E or W)
)
Пример:
// Matching 21° 16' 674S, 27° 30' 318E
array(
[0] => "21° 16' 674S, 27° 30' 318E" ,
[1] => "21" , [2] => "16" , [3] => "674" , [4] => "S" ,
[5] => "27" , [6] => "30" , [7] => "318" , [8] => "E"
)
// Matching 21 16 674S, 27 30 318E
array(
[0]=> "21 16 674S, 27 30 318E" ,
[1]=> "21" , [2]=> "16" , [3]=> "674" , [4]=> "S" ,
[5]=> "27" , [6]=> "30" , [7]=> "318" , [8]=> "E"
)
// Matching 9.182, -39.140625
array(
[0]=> "9.182, -39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
// Matching 9.182 / -39.140625
array(
[0]=> "9.182 / -39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
// Matching 9.182,-39.140625
array(
[0]=> "9.182,-39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
// Matching 9.182 -39.140625
array(
[0]=> "9.182 -39.140625" ,
[1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" ,
[5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> ""
)
Затем вы можете затем обработать результаты Регулярного выражения, чтобы создать число с плавающей запятой для ссылки Lat / Long так:
// (Replacing the "Match Found" comment)
$latitude = $matches[1]+((int)$matches[2]/60)+((int)$matches[3]/3600)*(strtolower($matches[4])=='s'?-1:1);
$longitude = $matches[5]+((int)$matches[6]/60)+((int)$matches[7]/3600)*(strtolower($matches[8])=='w'?-1:1);
Который производит:
// Matching 21° 16' 674S, 27° 30' 318E
$latitude = -21.4538888889
$longitude = 27.5883333333
// Matching 21 16 674S, 27 30 318E
$latitude = -21.4538888889
$longitude = 27.5883333333
// Matching 9.182, -39.140625
$latitude = 9.182
$longitude = -39.140625
// Matching 9.182 / -39.140625
$latitude = 9.182
$longitude = -39.140625
// Matching 9.182,-39.140625
$latitude = 9.182
$longitude = -39.140625
// Matching 9.182 -39.140625
$latitude = 9.182
$longitude = -39.140625