9

入力として米国の都市、州、および半径距離をマイルで指定できるユーティリティまたは Web サイトを知っていますか?その半径内のすべての都市を返します。

ありがとう!

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

私のコードの抜粋があります。うまくいけば、何が起こっているのかがわかります。1 つの ZipCodes (DB 内のテーブル) から始めて、一致する可能性のあるものを引き戻し、最後に半径内にないものを除外します。

于 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 で宣伝されているこの Web サービスを見てください。実際に使用するにはサブスクリプションが必要ですが、必要なことを行うと主張しています.

問題の説明で宣伝されている方法:

GetPlacesWithin 特定の場所から指定された距離内にある地理的な場所のリストを返します。パラメータ: place - 場所の名前 (最大 65 文字)、state - 2 文字の州コード (郵便番号には不要)、distance - マイル単位の距離、placeTypeToFind - 検索する場所のタイプ: ZipCode または City (村、町を含む)など)。

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

于 2009-03-12T20:37:12.680 に答える
2

http://geonames.usgs.govから地理的に位置付けられた都市/場所名のかなり優れたデータベースを取得できます- 適切なデータベース ダンプを見つけて、それを DB にインポートし、必要な種類のクエリを実行するのは非常に簡単です。 DBMS は、ある種の空間クエリをサポートしています (たとえば、Oracle SpatialMySQL Spatial ExtensionsPostGISまたはSQLServer 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" ファイルには、ベルギーのすべての都市が含まれています。必要に応じて、エントリを削除または作成することもできます。名前や構造を変更しない限り、コードを変更する必要はありません。

README を必ずお読みください https://github.com/GlennVanSchil/LocationFinder

于 2016-06-01T19:50:24.793 に答える