Преобразование GPS-координат в формате ISO 6709 в десятичные градусы в R - PullRequest
1 голос
/ 01 декабря 2011

У нас есть оборудование, которое выводит свои GPS-координаты в виде числовых значений в файл в формате ISO 6709 широта / долгота: широта = ± DDMM.MMMM & Lon = ± DDDMM.MMMM

Есть ли в R пакеты с функциями (или пользовательскими функциями), которые преобразуют это в формат десятичных градусов?(т.е.: ± DD.DDDDDD & ± DDD.DDDDDD)

Примером может быть то, что lat & lon (2433.056, -8148.443) будет преобразовано в (24.55094, -81.80739).

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Вы можете прочитать значения из файла, используя что-то вроде read.csv или read.delim.

Затем, чтобы преобразовать из DDMM.MMMM и DDDMM.MMMM, вы можете использовать что-то вроде этого (конечно, измените по мере необходимости для формы ввода / вывода):

convertISO6709 <- function( lat, lon ) {
    # will just do lat and lon together, as the process is the same for both
    # It's simpler to do the arithmetic on positive numbers, we'll add the signs
    #  back in at the end.
    latlon <- c(lat,lon)
    sgns   <- sign(latlon)
    latlon <- abs(latlon)

    # grab the MM.MMMM bit, which is always <100. '%%' is modular arithmetic.
    mm <- latlon %% 100

    # grab the DD bit. Divide by 100 because of the MM.MMMM bit.
    dd <- (latlon - mm)/100

    # convert to decimal degrees, don't forget to add the signs back!
    out_latlon <- (dd+mm/60) * sgns
    return(out_latlon)
}
0 голосов
/ 04 января 2017

У меня похожая проблема с получением координат от FedEx WS. Я использовал эту функцию, чтобы получить значения из строки, такой как + 19.467945-99.14357 /:

function convertCoordISO6709($coord)
{
  //$coord example
  //$coord = +19.467945-99.14357/

  $returnArray[0] = 1;//result non 0 means error
  $returnArray[1] = 0;//Lat
  $returnArray[2] = 0;//long

  $coord = trim($coord,"/"); //Strip / sign
  //look for + - sign
  $lat_sign = substr($coord,0,1);  //strip and save the first sign (latitude value)

  $sub_coord = substr($coord,1,strlen($coord));

  if(count(explode("+",$sub_coord)) == 2) //Second value is + for the longitude
  {
    $coords=explode("+",$sub_coord);
    $returnArray[0] = 0;
    $returnArray[1] =  $lat_sign.$coords[0];
    $returnArray[2] =  "+".$coords[1];    
  }
  else //Second value is - for the longitude
  {
    $coords=explode("-",$sub_coord);
    $returnArray[0] = 0;    
    $returnArray[1] =  $lat_sign.$coords[0];
    $returnArray[2] =  "-".$coords[1];      
  }


  return $returnArray;
}
0 голосов
/ 16 августа 2012

Возможно, это не самый элегантный код PHP, но он работает:

function convertISO6709($coord)
{
    $abs_coord = abs($coord);
    $sign = ($abs_coord == $coord) ? 1 : -1;
    $m = 2;
    $dlen = 2;
    $s = 0;
    $seconds = 0;
    switch (strlen($abs_coord)) {
        case 4 :
            break;
        case 5 :
            $dlen = 3;
            $m = 3;
            break;
        case 6 :
            $s = 4;
            break;
    }
    $degrees = substr($abs_coord, 0, $dlen);
    $minutes = substr($abs_coord, $m, 2);
    if ($s != 0) {
        $seconds = substr($abs_coord, $s, 2);
    }
    return ($degrees + ($minutes / 60)  + ($seconds / 3600)) * $sign;
}
...