9

您是否知道一些实用程序或网站,我可以在其中提供美国城市、州和径向距离(以英里为单位)作为输入,它会返回该半径内的所有城市?

谢谢!

4

6 回答 6

5

这是我的做法。

您可以获得城市、st、邮政编码及其纬度和经度的列表。(我不记得我们从哪里得到的)

编辑: 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(我的数据库中的一个表)开始,然后我拉回可能的匹配项,最后我清除了那些不在半径范围内的人。

于 2009-03-12T20:52:02.787 回答
4

Oracle、PostGIS、带有 GIS 扩展的 mysql、带有 GIS 扩展的 sqlite 都支持这种查询。

如果您没有数据集,请查看:

http://www.geonames.org/

于 2009-03-12T20:40:44.577 回答
2

看看在 xmethods.net 上宣传的这个网络服务。它需要订阅才能实际使用,但声称可以满足您的需求。

有问题的广告方法描述:

GetPlacesWithin 返回距给定地点指定距离内的地理位置列表。参数:place - 地点名称(最多 65 个字符),state - 2 个字母的州代码(邮政编码不需要),distance - 距离(以英里为单位),placeTypeToFind - 要查找的地点类型:ZipCode 或 City(包括任何村庄、城镇) , ETC)。

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

于 2009-03-12T20:37:12.680 回答
2

您可以从http://geonames.usgs.gov获得一个非常好的地理定位城市/地名数据库 - 找到一个合适的数据库转储,将其导入您的数据库,然后执行您需要的查询非常简单,特别是如果您的DBMS 支持某种空间查询(例如Oracle SpatialMySQL Spatial ExtensionsPostGISSQLServer 2008

另请参阅:如何进行基于位置的搜索

于 2009-03-12T20:37:43.100 回答
0

我没有网站,但我们在 Oracle 中将其作为数据库函数实现,在 SAS 中作为统计宏实现。它只需要一个包含所有城市及其经纬度的数据库。

于 2009-03-12T20:31:00.853 回答
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”文件包含比利时的所有城市。如果需要,您也可以删除或创建条目。只要您不更改名称和/或结构,就不需要更改代码。

请务必阅读自述文件https://github.com/GlennVanSchil/LocationFinder

于 2016-06-01T19:50:24.793 回答