2009-09-12 73 views
16

¿Cuál es la mejor forma de obtener una ubicación geográfica en Java (de ser posible si es posible)?La mejor forma de obtener una ubicación geográfica en Java

Actualización: No desde un dispositivo GPS. Básicamente, cómo lo hace Firefox 3.5/HTML 5

+0

¿Qué quiere decir exactamente? ¿Desea recuperar las coordenadas de un dispositivo GPS o buscar la ubicación en función de una dirección IP o buscar las coordenadas de ciertos destinos en una base de datos u otra cosa? – Wolfgang

+0

¿Es esto para una aplicación de escritorio que necesita hacerlo fuera de línea? ¿O están bien los servicios web para usar? –

+0

los servicios web están bien – yxk

Respuesta

6

La mayor base de datos de WiFi-to-location es probablemente SkyHook Wireless, utilizada por Apple y Google para su ubicación geográfica. Hay SDK disponibles - vea http://skyhookwireless.com/developers/.

+0

Parece ser para C++, ¿hay una versión de Java? – yxk

+0

Si desea usar eso, probablemente pueda usar JNI para llamar al código C++ nativo, sin embargo, eso probablemente reducirá las capacidades multiplataforma de su aplicación Java. –

+3

Actualmente JNA debe usarse en lugar de JNI –

2

Si necesita una base de datos local, puede verificar lo que IPInfoDB tiene para ofrecer.

Si puede utilizar un servicio web, hay un número disponible, pero no estoy seguro de lo que permiten sus términos de servicio. A Google search for "ip geolocation lookup web service" aparece algo, pero muchos de ellos son productos comerciales y debería leer sus ToS con cuidado para asegurarse de que los use dentro de las directrices.

+0

"Más del 99.5% a nivel de país y alrededor del 80% a nivel de ciudad en un radio de 25 millas. La base de datos utilizada para esta API se compila de la base de datos gratuita Maxmind CSV (Ciudad Geolite) y reorganizado con muchos guiones ". Hm, parece acertar con la ciudad, Google maps lo hace con bastante precisión, solo por una milla más o menos. – yxk

+0

Por supuesto, necesitaría actualizar periódicamente sus archivos CSV o SQL con IPInfoDB. Pero todo se trata de compensaciones. Actualizaciones manuales de las bases de datos de IP versus ser capaz de resolverlas con consultas. –

1

Si usted quiere saber cómo Firefox 3.5 (o Google Chrome) obtiene el geolocalización, entonces eche un vistazo aquí: How Google/Firefox Geolocation API works

Básicamente, lo que Firefox 3.5 (así como Chrome) hace es obtener la lista de redes Wi-Fi cercanas y envíe esa lista usando JSON a un servicio web de Google, que luego devolverá las coordenadas aproximadas.

Por cierto, no hay Java involucrado en este proceso. Para obtener la geolocalización desde Firefox/Chrome, solo debes llamar a algunos métodos de JavaScript. (Realmente espero que sepa que Java es diferente de JavaScript)

+0

El enlace agregado en esta respuesta está muerto ahora – SpringLearner

+0

@SpringLearner: ¡Gracias! Realmente debería volver a poner mi blog en línea. Mientras tanto, actualicé el enlace a Wayback Machine. –

+0

Hey @ DenilsonSáMaia Quiero exactamente la misma solución usando el método de Java que toma ip como argumento. ¿Puedes proporcionar algún puntero? Si pudiera proporcionar la implementación de javascript, eso también será de ayuda. –

1

Si lo entiendo lo suficiente, desea obtener la ubicación geográfica de los visitantes de su sitio o aplicación web. Las alternativas que conozco son:

Google Gears tiene algunas funciones para hacer de ubicación geográfica (http://code.google.com/apis/gears/api_geolocation.html), pero es necesario para instalar Gears

Uso de las funciones de JavaScript que llaman a un servicio en línea como IP Ubicación Herramientas (iplocationtools www punto dot com) El sitio tiene ejemplos e incluso tiene un video tutorial.

+0

Hola @Mig Este enlace parece muerto. Cualquier otro puntero con exactamente la misma solución? –

4

La mejor biblioteca de código abierto para la geolocalización en Java es ahora http://geo-google.sourceforge.net/index.html, basado en la API de Google Maps (sólo tiene una clave de API de Google Maps para usarlo)

+0

Lamentablemente, no hay compatibilidad con GeoLocation aquí. Solo Geo-codificación. – Reno

15

Una forma fácil es con GeoLite (http://dev.maxmind.com/geoip/legacy/geolite/). Debido a que utiliza una base de datos local, no se necesitan llamadas al servicio web y es mucho más rápido para la geocodificación de un gran número de IP.

Aquí es cómo:

Añadir este artefacto Maven:

<dependency> 
    <groupId>com.maxmind.geoip</groupId> 
    <artifactId>geoip-api</artifactId> 
    <version>1.2.11</version> 
</dependency> 

Descargar el archivo de datos de geolocalización de http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

Desempaquetar el archivo en cualquier carpeta.A continuación, hacer:

LookupService cl = new LookupService("/var/geolite/GeoLiteCity.dat", 
        LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE); 

Location location = cl.getLocation("some ip address"); 

El resultado será en el objeto Localización en las propiedades de latitud, longitud, ciudad, región y código del país.

Consulte sus estimaciones de precisión para asegurarse de que satisfaga las necesidades de su proyecto: http://www.maxmind.com/en/geolite_city_accuracy.

0

Dice que está bien con los servicios web, por lo que podría usar mi API http://ipinfo.io. Aquí hay una salida de ejemplo JSON para una dirección IP:

$ curl ipinfo.io 
{ 
    "ip": "24.6.61.239", 
    "hostname": "c-24-6-61-239.hsd1.ca.comcast.net", 
    "city": "Mountain View", 
    "region": "California", 
    "country": "US", 
    "loc": "37.3845,-122.0881", 
    "org": "AS7922 Comcast Cable Communications, LLC", 
    "postal": "94040" 
} 

Ver https://ipinfo.io/developers para más detalles.

0

Aquí hay un ejemplo basado en la API https://ipdata.co que es gratis hasta 1500 solicitudes/día.

Reemplazar 8.8.8.8 con la ip desea para buscar

// Maven : Add these dependecies to your pom.xml (java6+) 
// <dependency> 
//  <groupId>org.glassfish.jersey.core</groupId> 
//  <artifactId>jersey-client</artifactId> 
//  <version>2.8</version> 
// </dependency> 
// <dependency> 
//  <groupId>org.glassfish.jersey.media</groupId> 
//  <artifactId>jersey-media-json-jackson</artifactId> 
//  <version>2.8</version> 
// </dependency> 

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.MediaType; 

Client client = ClientBuilder.newClient(); 
Response response = client.target("https://api.ipdata.co/8.8.8.8") 
    .request(MediaType.TEXT_PLAIN_TYPE) 
    .header("Accept", "application/json") 
    .get(); 

System.out.println("status: " + response.getStatus()); 
System.out.println("headers: " + response.getHeaders()); 
System.out.println("body:" + response.readEntity(String.class)); 
Cuestiones relacionadas