你知道一些实用工具或网站,我可以以英里为单位给出美国城市,州和径向距离作为输入,它会让我回到那个半径范围内的所有城市吗?
谢谢!
答案 0 :(得分:5)
我是这样做的。
您可以获取城市,圣,邮政编码及其纬度和经度的列表。 (我不记得我们得到的是我的头顶)
编辑: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(我的数据库中的一个表)开始,然后我撤回可能的匹配,最后我清除那些不在半径范围内的人。
答案 1 :(得分:4)
答案 2 :(得分:2)
看一下xmethods.net上宣传的这个网络服务。它需要订阅实际使用,但声称要做你需要的。
所讨论的广告方法说明:
GetPlacesWithin返回地理列表 指定距离内的地方 来自某个地方。参数:地方 - 地名(最多65个字符),州 - 2个字母的州代码(不需要 邮政编码),距离 - 距离 miles,placeTypeToFind - 地方类型 寻找:ZipCode或City (包括任何村庄,城镇等)。
http://xmethods.net/ve2/ViewListing.po?key=uuid:5428B3DD-C7C6-E1A8-87D6-461729AF02C0
答案 3 :(得分:2)
您可以从http://geonames.usgs.gov获取一个非常好的地理定位城市/地名数据库 - 找到合适的数据库转储,将其导入您的数据库,并执行您需要的查询类型非常简单,特别是如果您的DBMS支持某种空间查询(例如Oracle Spatial,MySQL Spatial Extensions,PostGIS或SQLServer 2008)
答案 4 :(得分:0)
我没有网站,但是我们已经在Oracle中将其作为数据库功能实现,并在SAS中将其作为统计宏实现。它只需要一个包含所有城市及其纬度和长度的数据库。
答案 5 :(得分:0)
也许这会有所帮助。该项目配置为公里。您可以在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 \ main \ resources \ json \ cities.json”文件包含来自比利时的所有城市。您也可以删除或创建条目。只要您不更改名称和/或结构,就不需要更改代码。