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!
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!
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.
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
È possibile ottenere una buona base di dati di geolocalizzati città/toponimi da http://geonames.usgs.gov - trovare una dump del database del caso, importarlo nel database, e di eseguire il tipo di interrogazione vostra esigenza è piuttosto semplice, in particolare se il vostro DBMS supporta un qualche tipo di interrogazioni spaziali (ad esempio come Oracle Spatial, MySQL Spatial Extensions, PostGIS o SQLServer 2008)
Consulta anche: how to do location based search
Oracle, PostGIS, mysql con estensioni GIS, sqlite con estensioni GIS supportano questo tipo di query.
Se non avete l'aspetto dataset:
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.
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
Forse si potrebbe modificare e dare una migliore definizione di "città"? Intendi solo nomi di luoghi o intendi centri abitati? –
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 –