Знаете ли вы какую-нибудь полезность или веб-сайт, на котором я могу дать США, штат и радиальное расстояние в милях в качестве входных данных, и он вернет мне все города в этом радиусе?Как найти ближайшие города в данном радиусе?
Спасибо!
Знаете ли вы какую-нибудь полезность или веб-сайт, на котором я могу дать США, штат и радиальное расстояние в милях в качестве входных данных, и он вернет мне все города в этом радиусе?Как найти ближайшие города в данном радиусе?
Спасибо!
У меня нет веб-сайта, но мы реализовали это как в Oracle как функцию базы данных, так и в SAS в качестве макроса статистики. Это требует только базы данных со всеми городами и их латами и длинными.
Взгляните на этот веб-сервис, рекламируемый на xmethods.net. Это требует подписки на фактическое использование, но требует сделать то, что вам нужно.
Рекламируемый метод в описании Вопроса по:
GetPlacesWithin Возвращает список гео мест в пределах определенного расстояния от данного места. Параметры: Место - название места (65 символ макс), состояние - 2 письма код состояния (не требуется для почтовых индексов), расстояние - расстояние в милях, placeTypeToFind - тип места искать: ZipCode или город (включая любые деревни, города и т. д.).
http://xmethods.net/ve2/ViewListing.po?key=uuid:5428B3DD-C7C6-E1A8-87D6-461729AF02C0
Вы можете получить очень хорошую базу данных геопривязанных городов/топонимов из http://geonames.usgs.gov - найти подходящий дамп базы данных, импортировать его в БД, и выполнение такого запроса вашей потребность является довольно простой, особенно если ваша СУБД поддерживает какое-то пространственные запросы (например, как Oracle Spatial, MySQL Spatial Extensions, PostGIS или SQLServer 2008)
Смотрите также: how to do location based search
Oracle, PostGIS, mysql с расширениями GIS, sqlite с расширениями GIS, поддерживают этот вид запросов.
Если у вас нет набора данных посмотрим на:
Вот как я это делаю.
Вы можете получить список городских, городских, почтовых индексов, их широт и долгот. (я не могу вспомнить с верхней части моей головы, где мы получили наш)
редактировать: http://geonames.usgs.gov/domestic/download_data.htm как кто-то упоминалось выше, вероятно, работать.
Затем вы можете написать способ вычисления минимальной и максимальной широты и долготы на основе радиуса и запроса для всех городов между этими минимальными и максимальными значениями. Затем в цикле и вычислить расстояние и удалите все, что не в радиусе
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());
}
}
}
Там выдержка из моего кода, надеюсь, вы можете увидеть, что происходит. Я начинаю с одного ZipCodes (таблица в моей БД), затем я отменяю возможные совпадения, и, наконец, я отсеял тех, кто не находится в радиусе.
Возможно, это может помочь. Однако проект сконфигурирован в километрах. Вы можете изменить их в 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;
}
"LocationFinder \ SRC \ главная \ ресурсы \ JSON \ cities.json" файл содержит все города из Бельгии. Вы также можете удалить или создать записи, если хотите. Пока вы не меняете имена и/или структуру, никаких изменений кода не требуется.
Убедитесь, что прочитать README https://github.com/GlennVanSchil/LocationFinder
Может быть, вы могли бы изменить и дать более четкое определение «городов»? Вы имеете в виду только названия мест или вы имеете в виду центры народонаселения? –
Попробуйте это: http://www.cityradius.com/ Радиусы ограничены, но, тем не менее, это довольно круто. Я также просто видел это: http://www.zip-codes.com/free-zip-code-tools.asp#radius –