2009-03-12 7 views
9

Conosci qualche utilità o un sito web in cui posso fornire la città, lo stato e la distanza radiale in miglia come input e mi restituirebbe tutte le città all'interno di quel raggio?Come trovare le città più vicine in un dato raggio?

Grazie!

+0

Forse si potrebbe modificare e dare una migliore definizione di "città"? Intendi solo nomi di luoghi o intendi centri abitati? –

+0

Prova questo: http://www.cityradius.com/ I raggi sono limitati ma è comunque bello. Ho anche visto questo: http://www.zip-codes.com/free-zip-code-tools.asp#radius –

risposta

0

Non ho un sito Web, ma lo abbiamo implementato sia in Oracle come funzione di database che in SAS come macro di statistiche. Richiede solo un database con tutte le città e il loro lat e long.

2

Dai un'occhiata a questo servizio web pubblicizzato su xmethods.net. Richiede effettivamente un abbonamento, ma afferma di fare ciò di cui hai bisogno.

Il metodo pubblicizzato nella descrizione di domanda:

GetPlacesWithin Restituisce un elenco di geo posti entro una determinata distanza da un determinato luogo. Parametri: luogo - toponimo (65 char max), lo stato - 2 lettera del codice di stato (non richiesto per codici di avviamento postale), la distanza - distanza in miglia, placeTypeToFind - tipo di posto cercare: ZipCode o Città (compresi eventuali villaggi, città, ecc.).

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

4

Oracle, PostGIS, mysql con estensioni GIS, sqlite con estensioni GIS supportano questo tipo di query.

Se non avete l'aspetto dataset:

http://www.geonames.org/

5

Ecco come lo faccio.

È possibile ottenere un elenco di città, st, codici postali e le loro latitudini e longitudini. (non riesco a ricordare la parte superiore della mia testa, dove noi abbiamo prenotato)

edit: http://geonames.usgs.gov/domestic/download_data.htm come qualcuno di cui sopra probabilmente funzionerà.

Quindi è possibile scrivere un metodo per calcolare la latitudine e la longitudine minima e massima in base a un raggio e interrogare tutte le città tra quelle min e max. Poi scorrere e calcolare la distanza e rimuovere quelle che non sono nel raggio di

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

C'è un estratto del mio codice, si spera si può vedere cosa sta succedendo. Comincio con uno ZipCodes (una tabella nel mio DB), poi tiro indietro le possibili corrispondenze e infine estirpo quelle che non sono nel raggio.

0

Forse questo può aiutare. Il progetto è configurato in chilometri però. È possibile modificare questi in 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; 
} 

Il "LocationFinder \ src \ principali risorse \ \ JSON \ cities.json" file contiene tutte le città del Belgio. È possibile eliminare o creare voci se lo si desidera. Finché non cambi i nomi e/o la struttura, non sono richieste modifiche al codice.

Assicurarsi di leggere il file README https://github.com/GlennVanSchil/LocationFinder