Conversión de ciudad y país en puntos de coordenadas

¿Hay algún código php bastante rápido para convertir una ciudad + país en coordenadas de latitud y longitud? Tengo una lista de ubicaciones y necesito convertirlas a coordenadas. Intenté hacerlo en javascript, pero encontré algunos problemas al tratar de devolver los resultados a php para almacenarlos en mi archivo JSON. Entonces, ¿hay algún código PHP eficiente para hacer esto?

Gracias.

preguntado el 09 de marzo de 12 a las 16:03

¿Qué servicio está utilizando para la codificación geográfica? ¿Google? yahoo? ¿Bing? ¿Algo más? -

1 Respuestas

En mi aplicación, estoy usando la siguiente función para geocodificar ubicaciones usando el servicio de Google. La función toma un parámetro - location al código geográfico (p. ej., "Boston, EE. UU." o "SW1 1AA, Reino Unido") y devuelve una matriz asociativa con Lat/Lon. Si se produce un error o no se puede determinar la ubicación, devuelve FALSO.

Tenga en cuenta que, en muchos casos, la ciudad y el país no podrán determinar la ubicación de forma única. Por ejemplo, probablemente haya 100 ciudades llamadas Springfield solo en los EE. UU. Además, al pasar el país a un servicio de codificación geográfica, asegúrese de poner el nombre completo del país y no un código de 2 letras. Encontré esto de la manera difícil: estaba pasando 'CA' por "Canadá" y estaba obteniendo resultados extraños. Aparentemente, Google asumió que 'CA' significa "California".

function getGeoLocationGoogle($location)
{
    $url = "http://maps.googleapis.com/maps/api/geocode/xml?address=". urlencode($location) . "&sensor=false";
    $userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 FirePHP/0.4";

    //Setup curl object and execute
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($curl, CURLOPT_FAILONERROR, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($curl);

    $req = $location;

    //Process response from Google servers
    if (($error = curl_errno($curl)) > 0)
    {
        return FALSE;
    } 

    $geo_location = array();
    //Try to convert XML response into an object
    try
    {
        $xmlDoc = new DOMDocument();
        $xmlDoc->loadXML($result);
        $root = $xmlDoc->documentElement;

        //get errors
        $status = $root->getElementsByTagName("status")->item(0)->nodeValue;
        if($status != "OK")
        {
            $error_msg = "Could not determine geographical location of $location - response code $status";
        }
        $location = $root->getElementsByTagName("geometry")->item(0)->getElementsByTagName("location")->item(0);
        if(!$location)
        {
            return FALSE;
        }

        $xmlLatitude = $location->getElementsByTagName("lat")->item(0);
        $valueLatitude = $xmlLatitude->nodeValue;
        $geo_location['Latitude'] = $valueLatitude; 

        //get longitude
        $xmlLongitude = $location->getElementsByTagName("lng")->item(0);
        $valueLongitude = $xmlLongitude->nodeValue;
        $geo_location['Longitude'] = $valueLongitude;

        //return location as well - for good measure
        $geo_location['Location'] = $req;
    }
    catch (Exception $e)
    {
        return FALSE;
    }       

    return $geo_location;
}

respondido 09 mar '12, 17:03

Necesito calcular las coordenadas de un par de miles de ubicaciones, ¿es esto lo suficientemente rápido como para que la página no se agote? - ewein

Si necesita hacer esto en unos pocos miles de ubicaciones, lo más probable es que su diseño sea incorrecto. Nunca debería necesitar hacer tantas solicitudes de geocodificación sobre la marcha. ¿Qué estás intentando lograr? - aleks g

Estoy creando un mapa de conexiones entre ubicaciones. Así que tengo una base de datos donde tengo almacenadas mis ubicaciones y necesito convertir estas ubicaciones en coordenadas y almacenar las coordenadas en un archivo JSON. - ewein

@ewein Si está haciendo esto como un ejercicio único, entonces debería estar bien con el enfoque anterior. Simplemente tome los datos donde las coordenadas aún no están determinadas y codifíquelos geográficamente, guardándolos a medida que avanza. Incluso si el script se agota, simplemente vuelva a ejecutarlo y debería continuar donde lo dejó. Además, el archivo json puede ser una mala idea si realmente tiene miles de lugares. Considere usar una base de datos en su lugar. - aleks g

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.