преобразование широты / долготы GPS из разных форматов в один формат (в PHP) - PullRequest
5 голосов
/ 16 июня 2010

Я пытаюсь встроить поддержку местоположений в мое приложение, и я ожидаю, что пользователи будут вводить GPS-координаты различными способами. Мне нужно преобразовать все нижеприведенное в: широту - направление (н / с), градусы, минуты, секунды; долгота (E / W) - градусы, минуты, секунды.

Обратите внимание, что каждый пользовательский ввод будет в одной строке. Я хотел бы, чтобы мои пользователи вводили только одним способом, но ppl определенно будет входить как один из следующих ...:

например: 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] также может быть одним пробелом ...

Окончательный формат должен быть следующим:
широта.направление = юг
latitude.degrees = 21
latitude.minutes = 16
latitude.seconds = 674
longitude.direction = восток
longitude.degrees = 27
longitude.minutes = 30
longitude.seconds = 318

(а) как проще всего попросить обычных не технических пользователей ввести координаты GPS? S
(б) как мне преобразовать вышеприведенное в окончательный формат? Есть ли встроенные функции, которые обрабатывают эти изменения при вводе данных?

я видел формат GPS в PHP - но мне нужно обрабатывать более разнообразный ввод.

Ответы [ 4 ]

11 голосов
/ 18 июня 2010

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

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
1 голос
/ 16 июня 2010

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

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

Иметь столько входных данных, сколько необходимо для разбивки данных на достаточное количество токенов, что обеспечивает согласованность при интерпретации их в вашей программе!1006 * РЕДАКТИРОВАТЬ: прикольная идея, если вы сочтете это приемлемым для вашего сайта, состоит в том, чтобы иметь карту Google, на которой пользователь перетаскивает маркер в нужное место.Затем вы можете получить GPS-координаты в соответствии с этим маркером и использовать его для дальнейшей работы!

0 голосов
/ 16 июня 2010

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

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

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

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

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

0 голосов
/ 16 июня 2010
  1. разделить широту и долготу, используя explode () или preg_split ().
  2. Для широты и долготы определите, задано ли оно как число с плавающей запятой или в минутах.Преобразовать значение в градусы (как число с плавающей запятой)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...