преобразование широты/долготы GPS от различных форматов до одного формата (в PHP)

я пробую к созданному в поддержке местоположений в моем приложении, и я ожидаю, что пользователи введут координаты 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 - но я должен обработать более варьировавшийся вход.

5
задан Community 23 May 2017 в 11:48
поделиться

4 ответа

Я работал над этим дальше (и я заметил, что вы отредактировали свой вопрос).

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
11
ответ дан 18 December 2019 в 16:36
поделиться
  1. разделите широту и долготу, используя explode () или preg_split ().
  2. Как для широты, так и для долготы определите, указывается ли она в виде числа с плавающей запятой или в минутах.
  3. Преобразовать значение в градусы (как число с плавающей запятой)
0
ответ дан 18 December 2019 в 16:36
поделиться

Я думаю, что лучшим способом будет максимально ограничить ввод пользователя, чтобы он мог вводить только достоверные данные. Пусть пользователь разделяет данные в маркеры для вас, вместо того, чтобы вы пытались учесть все возможные варианты. Используйте столько текстовых полей/выпадающих элементов/и т.д., сколько необходимо, чтобы заставить пользователя вводить данные правильно. Я думаю, что желательно минимизировать количество и вариации анализа текста, который вы будете делать.

В каком формате пользователи получают свои данные? Если это просто десятичные широта/долгота, например, (50.32,123.55), тогда просто сделайте два числовых ввода, которые они могут заполнить, и, возможно, включите пример значения в поле. Если пользователи получают данные в формате градусы/минуты/секунды, то им нужно заполнить именно эти поля для каждой широты и долготы. Если вы допускаете как десятичное, так и градусное представление, это должно охватить всех ваших пользователей.

Имейте столько входов, сколько необходимо, чтобы разбить данные на достаточное количество лексем, что обеспечит последовательность при интерпретации их в вашей программе!

EDIT: Забавная идея, если вы сочтете ее приемлемой для вашего сайта, - это карта Google, где пользователь перетаскивает маркер в нужное ему место. Затем вы можете получить GPS-координаты последовательным образом от этого маркера и использовать их для дальнейшей работы!

1
ответ дан 18 December 2019 в 16:36
поделиться

Ваш лучший (но, по общему признанию, наименее гарантированный) метод - использовать поведение пользователя, чтобы попытаться отформатировать данные в стандартизированном и легко анализируемом формате. Даже просто наличие одного или двух простых основных форматов, чтобы попытаться побудить их к преобразованию, было бы отличным шагом и уменьшило бы количество требуемых исправлений ошибок / форматирования.

Помимо этого, я бы посоветовал создать регулярные выражения и функции, стоящие за этими регулярными выражениями, для стандартизации данных, которые вы собираетесь использовать.

Я выполнил несколько регулярных выражений для предоставленных вами тестовых данных, но у меня возникли проблемы с созданием пуленепробиваемого решения в этом отношении (возможно, вам понадобится несколько разных шаблонов, чтобы подобрать каждую комбинацию).

Я даже попытался проанализировать некоторые тестовые данные, предоставленные через API геокодирования Google (который, как правило, является довольно устойчивой системой, позволяющей использовать адресацию в виде обычного текста, а также использовать несколько форматов Lat / Long. ), но без радости.

Чем более стандартные данные поступают, тем легче создавать точную информацию. Возможно, интеграция карты (Google Maps или иначе) в фазу ввода позволит вам более точно проверить ввод.

0
ответ дан 18 December 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: