Question

Nous avons une pièce d'équipement qui émet ses coordonnées GPS sous forme de valeurs numériques dans un fichier ISO 6709 latitude / longitude format Lat = ± ddmm.mmmm & Lon = ± DDDMM.MMMM

Y a-t-il des paquets avec des fonctions (ou fonctions personnalisées) dans R qui convertiront à un format décimal degrés? (À savoir: ± dd.dddd & ± DDD.DDDDDD)

Un exemple serait que lat & LON (2433,056, -8148,443) seraient convertis en (24,55094, -81,80739).

Était-ce utile?

La solution

Vous pouvez lire dans les valeurs du fichier en utilisant quelque chose comme read.csv ou read.delim.

Ensuite, convertir les ddmm.mmmm et DDDMM.MMMM vous pouvez utiliser quelque chose comme ça (de modifier cours selon les besoins de la forme de vos entrées / sorties):

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)
}

Autres conseils

Cela peut ne pas être le plus élégant du code PHP, mais il fonctionne:

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;
}

Je rencontre un problème similaire obtenir les coordonnées de FedEx WS. J'ai utilisé cette fonction pour obtenir les valeurs d'une chaîne comme + 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top