2011-01-24 23 views
6

Tengo una aplicación de conocimiento geográfico "social" que estoy desarrollando, y la pregunta del millón es cómo incluir un conjunto de elementos que están "dentro de X millas" de "mi ubicación" ya que hay Millones de aplicaciones que hacen eso, me sorprendió descubrir que solo la API de Google Maps tiene un servicio web gratuito para eso, y lo que es peor, solo es compatible si se usa dentro de un Mapa de Google. Entonces, ¿tengo que desarrollar mi propia calculadora de distancia? ¿hay algún servicio gratuito/pago que me permita, al menos, transformar una dirección en una coordenada XY?¿Cómo encontrar la distancia entre dos direcciones? (Java server side)

Estoy seguro de que es una solución estándar de la industria (ya sea libre o comercial), pero estoy todavía para encontrarlo

Respuesta

4

En realidad, Google tiene web services que puede usar en el lado del servidor para lograr esto.

Primero querrá usar el Geocoding API para traducir direcciones en pares de coordenadas de latitud/longitud. A continuación, puede usarlos como mejor le parezca (es decir, contra su propia base de datos si los está almacenando)

Si los artículos cercanos que desea encontrar son lugares reales en el mundo que Google probablemente ya conozca, puede probar Google nuevo Places API que le puede dar resultados dentro de un cierto radio.

Debe tener en cuenta que la traducción de coordenadas de latitud/longitud a distancias requiere algo de matemática, pero creo que es mejor hacerlo localmente (en el servidor donde se ejecuta su aplicación) en lugar de ser transferido a un servidor externo desde es solo matemática. Google produjo this.

4

si está utilizando SQL (que no has dicho) ... Creo he copiado esto desde el proyecto NerdDinner:

ALTER FUNCTION [dbo].[DistanceBetween] (@Lat1 as real, 
       @Long1 as real, @Lat2 as real, @Long2 as real) 
RETURNS real 
AS 
BEGIN 

DECLARE @dLat1InRad as float(53); 
SET @dLat1InRad = @Lat1 * (PI()/180.0); 
DECLARE @dLong1InRad as float(53); 
SET @dLong1InRad = @Long1 * (PI()/180.0); 
DECLARE @dLat2InRad as float(53); 
SET @dLat2InRad = @Lat2 * (PI()/180.0); 
DECLARE @dLong2InRad as float(53); 
SET @dLong2InRad = @Long2 * (PI()/180.0); 

DECLARE @dLongitude as float(53); 
SET @dLongitude = @dLong2InRad - @dLong1InRad; 
DECLARE @dLatitude as float(53); 
SET @dLatitude = @dLat2InRad - @dLat1InRad; 
/* Intermediate result a. */ 
DECLARE @a as float(53); 
SET @a = SQUARE (SIN (@dLatitude/2.0)) + COS (@dLat1InRad) 
       * COS (@dLat2InRad) 
       * SQUARE(SIN (@dLongitude/2.0)); 
/* Intermediate result c (great circle distance in Radians). */ 
DECLARE @c as real; 
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a)); 
DECLARE @kEarthRadius as real; 
/* SET kEarthRadius = 3956.0 miles */ 
SET @kEarthRadius = 6376.5;  /* kms */ 

DECLARE @dDistance as real; 
SET @dDistance = @kEarthRadius * @c; 
return (@dDistance); 
END 


ALTER FUNCTION [dbo].[NearestPeople] 
    (
    @lat real, 
    @long real, 
    @maxdist real 
    ) 
RETURNS TABLE 
AS 
    RETURN 
    SELECT  Person.ID 
    FROM  Person 
    WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) < @maxdist 

luego utilizo estas funciones SQL desde el servidor de esta manera en C#:

public IQueryable<Person> FindNearbyPeople(float latitude, float longitude, float maxdistance) 
{ 
    var people = from person in FindAllPeople() 
       join i in db.NearestPeople(latitude, longitude, maxdistance) 
       on person.ID equals i.ID 
       select person; 

    return people; 
} 

que me dice que (en este caso, las personas) está cerca de yo dentro de una distancia máxima.

esta es la versión gratuita. Creo que SQL Server 2008 puede realizar esto con un paquete geográfico

4

Si tienes suerte y que está utilizando MySQL o PostgreSQL, que ambos son bases de datos habilitadas espaciales puede ejecutar consultas espaciales contra them.For MySQL hay spatial extensions y para PostgreSQL no es postgis.
Si decides ir manual, mira este question para obtener información. Además, no entiendo cómo google lugares api puede ayudarte ya que estás buscando tus datos dentro de un radio y no lugares de google. Saludos

3
  1. ¿Quieres que el "Como vuela el cuervo" distancia (línea recta), o conducir distancia/tiempo?

  2. La API de Mapquest parece ser más fácil ya que solo puede usar una cadena de consulta.

Otra opción es geocoder.us (o si .ca de Canadá)

Cuestiones relacionadas