я пробую к созданному в поддержке местоположений в моем приложении, и я ожидаю, что пользователи введут координаты gps во множестве путей. Я должен преобразовать весь из ниже к: широта - направление (N/s), градусы, минуты, секунды; долгота (E/W) - градусы, minuts, секунды.
Отметьте, каждый ввод данных пользователем будет в одной строке. Я хотел бы, чтобы мои пользователи ввели только одним единственным способом, но люди определенно войдут как одно из следующих...:
например: 9.182,-39.140625
9.182/-39.140625
9.182,-39.140625
9.182 - 39.140625
21 ° 16' 674S [some_separator] 27 ° 30' 318E
21 16 674S [some_separator]27 30 318E
[some_separator] может быть одиночным пробелом также...
Заключительному формату нужно к beas:
latitude.direction = юг
latitude.degrees = 21
latitude.minutes = 16
latitude.seconds = 674
longitude.direction = восток
longitude.degrees = 27
longitude.minutes = 30
longitude.seconds = 318
(a) каков самый простой способ попросить, чтобы ordinary-non-tech пользователи ввели координату GPS? s
(b) как я преобразовываю вышеупомянутое в заключительный формат? кто-либо создал в функциях, которые обрабатывают эти вариации во вводе данных?
я видел формат GPS в PHP - но я должен обработать более варьировавшийся вход.
Я работал над этим дальше (и я заметил, что вы отредактировали свой вопрос).
A) Каков самый простой способ попросить обычных пользователей, не являющихся техническими специалистами, ввести координаты GPS?
Самым простым и удобным способом заставить пользователей, не обладающих техническими знаниями, ввести данные, будет использование Google Maps. Это позволит вам использовать геокодер Google для анализа их ввода (и обеспечить более стандартизованный и отформатированный вывод). Кроме того, если местоположение, вводимое пользователем, является его текущим местоположением, вы можете использовать функцию геолокации, предлагаемую некоторыми современными браузерами.
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]=> ""
)
Затем вы могли бы впоследствии обработать результаты регулярного выражения, чтобы получить число с плавающей запятой для ссылки широты / долготы, так:
// (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
Я думаю, что лучшим способом будет максимально ограничить ввод пользователя, чтобы он мог вводить только достоверные данные. Пусть пользователь разделяет данные в маркеры для вас, вместо того, чтобы вы пытались учесть все возможные варианты. Используйте столько текстовых полей/выпадающих элементов/и т.д., сколько необходимо, чтобы заставить пользователя вводить данные правильно. Я думаю, что желательно минимизировать количество и вариации анализа текста, который вы будете делать.
В каком формате пользователи получают свои данные? Если это просто десятичные широта/долгота, например, (50.32,123.55), тогда просто сделайте два числовых ввода, которые они могут заполнить, и, возможно, включите пример значения в поле. Если пользователи получают данные в формате градусы/минуты/секунды, то им нужно заполнить именно эти поля для каждой широты и долготы. Если вы допускаете как десятичное, так и градусное представление, это должно охватить всех ваших пользователей.
Имейте столько входов, сколько необходимо, чтобы разбить данные на достаточное количество лексем, что обеспечит последовательность при интерпретации их в вашей программе!
EDIT: Забавная идея, если вы сочтете ее приемлемой для вашего сайта, - это карта Google, где пользователь перетаскивает маркер в нужное ему место. Затем вы можете получить GPS-координаты последовательным образом от этого маркера и использовать их для дальнейшей работы!
Ваш лучший (но, по общему признанию, наименее гарантированный) метод - использовать поведение пользователя, чтобы попытаться отформатировать данные в стандартизированном и легко анализируемом формате. Даже просто наличие одного или двух простых основных форматов, чтобы попытаться побудить их к преобразованию, было бы отличным шагом и уменьшило бы количество требуемых исправлений ошибок / форматирования.
Помимо этого, я бы посоветовал создать регулярные выражения и функции, стоящие за этими регулярными выражениями, для стандартизации данных, которые вы собираетесь использовать.
Я выполнил несколько регулярных выражений для предоставленных вами тестовых данных, но у меня возникли проблемы с созданием пуленепробиваемого решения в этом отношении (возможно, вам понадобится несколько разных шаблонов, чтобы подобрать каждую комбинацию).
Я даже попытался проанализировать некоторые тестовые данные, предоставленные через API геокодирования Google (который, как правило, является довольно устойчивой системой, позволяющей использовать адресацию в виде обычного текста, а также использовать несколько форматов Lat / Long. ), но без радости.
Чем более стандартные данные поступают, тем легче создавать точную информацию. Возможно, интеграция карты (Google Maps или иначе) в фазу ввода позволит вам более точно проверить ввод.