2009-03-12 29 views
9

¿Conoces alguna utilidad o un sitio web en el que pueda dar la ciudad de los EE. UU., El estado y la distancia radial en millas como entrada y me devolvería todas las ciudades dentro de ese radio?¿Cómo encontrar las ciudades más cercanas en un radio determinado?

Gracias!

+0

Tal vez usted podría editar y dar una mejor definición de "ciudades"? ¿Quiere decir simplemente nombres de lugares o quiere decir centros de población? –

+0

Pruebe esto: http://www.cityradius.com/ Los radios son limitados, pero de todos modos es genial. También acabo de ver esto: http://www.zip-codes.com/free-zip-code-tools.asp#radius –

Respuesta

0

No tengo un sitio web, pero lo hemos implementado tanto en Oracle como una función de base de datos como en SAS como macro de estadísticas. Solo requiere una base de datos con todas las ciudades y su latitud y longitud.

2

Eche un vistazo a este servicio web anunciado en xmethods.net. Requiere una suscripción para usar realmente, pero afirma hacer lo que necesita.

El método anunciado en la descripción de la pregunta:

GetPlacesWithin devuelve una lista de geo lugares dentro de una distancia especificada de un lugar determinado. Parámetros: lugar - nombre del lugar (65 Char max), estado - código de 2 letras del estado (no requerido para códigos postales), distancia - distancia en millas, placeTypeToFind - tipo de lugar a buscar: Código postal o ciudad (incluyendo pueblos, ciudades, etc.).

http://xmethods.net/ve2/ViewListing.po?key=uuid:5428B3DD-C7C6-E1A8-87D6-461729AF02C0

4

Oracle, PostGIS, mysql con extensiones GIS, sqlite con extensiones GIS admiten este tipo de consultas.

Si usted no tiene el aspecto de datos en:

http://www.geonames.org/

5

Aquí es cómo lo hago.

Puede obtener una lista de ciudades, st, códigos postales y sus latitudes y longitudes. (no puedo recordar la parte superior de la cabeza donde conseguimos nuestra)

edición: http://geonames.usgs.gov/domestic/download_data.htm como alguien ha mencionado anteriormente, probablemente trabajar.

A continuación, puede escribir un método para calcular la latitud y la longitud mínimas y máximas en función de un radio, y consultar todas las ciudades entre esas mínimas y máximas. A continuación, recorrer y calcular la distancia y elimine las que no están en el radio

double latitude1 = Double.parseDouble(zipCodes.getLatitude().toString()); 
double longitude1 = Double.parseDouble(zipCodes.getLongitude().toString()); 

//Upper reaches of possible boundaries 
double upperLatBound = latitude1 + Double.parseDouble(distance)/40.0; 
double lowerLatBound = latitude1 - Double.parseDouble(distance)/40.0; 

double upperLongBound = longitude1 + Double.parseDouble(distance)/40.0; 
double lowerLongBound = longitude1 - Double.parseDouble(distance)/40.0; 

//pull back possible matches 
SimpleCriteria zipCriteria = new SimpleCriteria(); 
zipCriteria.isBetween(ZipCodesPeer.LONGITUDE, lowerLongBound, upperLongBound); 
zipCriteria.isBetween(ZipCodesPeer.LATITUDE, lowerLatBound, upperLatBound); 
List zipList = ZipCodesPeer.doSelect(zipCriteria); 
ArrayList acceptList = new ArrayList(); 

if(zipList != null) 
{ 
    for(int i = 0; i < zipList.size(); i++) 
    { 
     ZipCodes tempZip = (ZipCodes)zipList.get(i); 
     double tempLat = new Double(tempZip.getLatitude().toString()).doubleValue(); 
     double tempLon = new Double(tempZip.getLongitude().toString()).doubleValue(); 
     double d = 3963.0 * Math.acos(Math.sin(latitude1 * Math.PI/180) * Math.sin(tempLat * Math.PI/180) + Math.cos(latitude1 * Math.PI/180) * Math.cos(tempLat * Math.PI/180) * Math.cos(tempLon*Math.PI/180 -longitude1 * Math.PI/180)); 

     if(d < Double.parseDouble(distance)) 
     { 
      acceptList.add(((ZipCodes)zipList.get(i)).getZipCd()); 
     } 
    } 
} 

Hay un extracto de mi código, es de esperar que pueda ver lo que está pasando. Empiezo con un ZipCodes (una tabla en mi base de datos), luego retiro posibles coincidencias y finalmente elimino a los que no están en el radio.

0

Quizás esto puede ayudar. El proyecto está configurado en kilómetros. Puede modificar estos en CityDAO.java

public List<City> findCityInRange(GeoPoint geoPoint, double distance) { 
    List<City> cities = new ArrayList<City>(); 
    QueryBuilder queryBuilder = geoDistanceQuery("geoPoint") 
      .point(geoPoint.getLat(), geoPoint.getLon()) 
      //.distance(distance, DistanceUnit.KILOMETERS) original 
      .distance(distance, DistanceUnit.MILES) 
      .optimizeBbox("memory") 
      .geoDistance(GeoDistance.ARC); 

    SearchRequestBuilder builder = esClient.getClient() 
      .prepareSearch(INDEX) 
      .setTypes("city") 
      .setSearchType(SearchType.QUERY_THEN_FETCH) 
      .setScroll(new TimeValue(60000)) 
      .setSize(100).setExplain(true) 
      .setPostFilter(queryBuilder) 
      .addSort(SortBuilders.geoDistanceSort("geoPoint") 
        .order(SortOrder.ASC) 
        .point(geoPoint.getLat(), geoPoint.getLon()) 
        //.unit(DistanceUnit.KILOMETERS)); Original 
        .unit(DistanceUnit.MILES)); 

    SearchResponse response = builder 
      .execute() 
      .actionGet(); 


    SearchHit[] hits = response.getHits().getHits(); 

    scroll: 
    while (true) { 

     for (SearchHit hit : hits) { 
      Map<String, Object> result = hit.getSource(); 
      cities.add(mapper.convertValue(result, City.class)); 
     } 

     response = esClient.getClient().prepareSearchScroll(response.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); 
     if (response.getHits().getHits().length == 0) { 
      break scroll; 
     } 
    } 

    return cities; 
} 

El "LocationFinder \ src \ principales recursos \ \ JSON \ cities.json" archivo contiene todas las ciudades de Bélgica. Puede eliminar o crear entradas si lo desea también. Siempre que no cambie los nombres y/o la estructura, no se requieren cambios de código.

Asegúrese de leer el README https://github.com/GlennVanSchil/LocationFinder

Cuestiones relacionadas