2009-03-12 13 views
9

あなたは、アメリカ合衆国の都市、州、および半径距離をマイルで入力できるユーティリティやウェブサイトを知っていますか?その半径内のすべての都市を返しますか?指定された半径に最も近い都市を見つける方法は?

ありがとうございます!

+0

あなたが編集し、「都市」のより良い定義を与える可能性を必ずお読みください?あなたは単に名前をつけることを意味しますか、または人口中心を意味しますか? –

+0

これを試してみてください:http://www.cityradius.com/半径は限られていますが、それにもかかわらずかなりクールです。私もこれを見ました:http://www.zip-codes.com/free-zip-code-tools.asp#radius –

答えて

0

私はウェブサイトを持っていませんが、これをデータベース機能としてOracleに、統計マクロとしてSASに実装しました。すべての都市とそれらの緯度と経緯のデータベースのみが必要です。

2

xmethods.netで宣伝されているこのWebサービスをご覧ください。実際に使用するにはサブスクリプションが必要ですが、必要なことを行うと主張します。

問題の説明でアドバタイズ方法:

GetPlacesWithinは、与えられた場所から指定した距離 内の地理 場所のリストを返します。場所: - 場所のタイプ - 場所の名前(最大65文字)、状態 - 2文字の状態コード町、その他を含む)。

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

2

あなたはhttp://geonames.usgs.govからgeolocated都市/地名のかなり良いデータベースを得ることができます - 、適切なデータベース・ダンプを見つけ、あなたのDBにインポートして、あなたの必要性は非常に簡単です、クエリの種類を実行し、あなたのDBMSは、空間問合せのいくつかの種類をサポートしている場合は特に(例えばのようなOracle SpatialMySQL Spatial ExtensionsPostGISまたはSQLServer 2008

も参照してください:how to do location based search

4

Oracle、PostGIS、GIS拡張機能を備えたmysql、GIS拡張機能を備えたsqliteはすべてこの種のクエリをサポートしています。

あなたはでデータセットの外観を持っていない場合:ここでは

http://www.geonames.org/

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

私のコードの抜粋がありますを削除するには、うまくいけば、あなたは何が起こっているかを見ることができます。私は1つのZipCodes(私のDB内のテーブル)から始め、可能性のあるマッチを取り戻し、最後に半径に入っていない人を取り除きます。

0

おそらくこれが役立ちます。プロジェクトはキロメートルで構成されています。あなたは

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

CityDAO.java

でこれらを変更することができます "LocationFinder \ SRC \メイン\リソース\ JSON \ cities.json" ファイルには、ベルギーのすべての都市が含まれています。必要に応じて、エントリを削除または作成することもできます。名前や構造を変更しない限り、コードを変更する必要はありません。

README多分https://github.com/GlennVanSchil/LocationFinder

関連する問題