web-dev-qa-db-ja.com

緯度/経度の座標を考えると、どのようにして都市/国を見つけることができますか?

たとえば、これらの座標セットがある場合

"latitude": 48.858844300000001,
"longitude": 2.2943506,

どのようにして都市/国を見つけることができますか?

126
ming yeow

無料の Google Geocoding API は、HTTP REST AP​​Iを介してこのサービスを提供します。 APIは 使用とレート制限 ですが、無制限のアクセスに対して料金を支払うことができます。

このリンクを試して、出力の例を確認してください(これはjsonにあり、出力はXMLでも利用可能です)

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true

91
Kevin

別のオプション:

  • http://download.geonames.org/export/dump/ から都市データベースをダウンロードします
  • 各都市を緯度/経度として追加->都市マッピングをR-Treeなどの空間インデックスに追加(一部のDBには機能もあります)
  • 最近傍検索を使用して、特定のポイントに最も近い都市を検索します

利点:

  • 利用可能な外部サーバーに依存しません
  • 非常に高速(1秒あたり数千のルックアップを簡単に実行)

短所:

  • 自動的に最新ではない
  • 最寄りの都市が数十マイル離れている場合を区別する場合は、追加のコードが必要です
  • 極と国際日付変更線の近くに奇妙な結果を与える可能性があります(とにかくこれらの場所に都市はありませんが
158

geopyが必要です

pip install geopy

その後:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

詳細情報を取得するには:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}
32
Farsheed

私は同様の機能を探していましたが、以前の返信で共有されたデータ「 http://download.geonames.org/export/dump/ 」を見ました(共有していただきありがとうございます、素晴らしいソースです)、cities1000.txtデータに基づくサービスを実装しました。

で実行されているのを見ることができます http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9(リンク切れ) 場所の緯度と経度を変更するだけです。

OpenShift(RedHatプラットフォーム)にデプロイされます。長いアイドル期間後の最初の呼び出しには時間がかかる場合がありますが、通常はパフォーマンスは十分です。あなたが好きなようにこのサービスを自由に使用してください...

また、プロジェクトのソースは https://github.com/turgos/Location で見つけることができます。

20
turgos

オープンソースの代替手段は、Open Street MapのNominatimです。 URLに変数を設定するだけで、その場所の都市/国が返されます。公式ドキュメントについては、次のリンクを確認してください。 Nominatim

20
Rega

Javascriptでこれを行う方法のコード例を見つけるのに30分ほど費やしました。あなたが投稿した質問に対する迅速で明確な答えが見つかりませんでした。だから...私は自分で作った。 APIを詳しく調べたり、読み方がわからないコードを見つめたりすることなく、人々がこれを使用できることを願っています。ほかに何もなければ、私はこの投稿を自分のもののために参照することができます..素晴らしい質問と議論のフォーラムに感謝します!

これはGoogle APIを利用しています。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>

//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        //GET USER CURRENT LOCATION
        var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

        //CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
        var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
                var locItemCount = results.length;
                var locCountryNameCount = locItemCount - 1;
                var locCountryName = results[locCountryNameCount].formatted_address;

                if (locCountryName == "Australia") {
                    //SET COOKIE FOR GIVING
                    jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' }); 
                }
        });
    }
}
5
Kai Husen

Geocoder 、Google、Geonames、OpenStreetMapsを含む複数のプロバイダーをサポートする優れたPythonライブラリを ほんの数件の言及 に使用しました。 GeoPyライブラリを使用してみましたが、しばしばタイムアウトになります。 GeoNames用の独自のコードを開発することは、時間を最大限に活用することではなく、最終的に不安定なコードを取得する可能性があります。ジオコーダーは私の経験では非常に使いやすく、十分な ドキュメント を持っています。以下は、緯度と経度で都市を検索したり、都市名で緯度/経度を検索したりするためのサンプルコードです。

import geocoder

g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton

g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084
5
Hamman Samuel

それは本当にあなたが持っている技術の制限に依存します。

1つの方法は、関心のある国と都市のアウトラインを含む空間データベースを用意することです。アウトラインとは、国と都市が空間タイプポリゴンとして格納されることを意味します。座標のセットを空間タイプポイントに変換し、ポリゴンに対してクエリを実行して、ポイントがある国/都市名を取得できます。

空間タイプをサポートするデータベースの一部を次に示します。 SQL Server 2008MySQLpostGIS -postgreSQLの拡張および Oracle

独自のデータベースを用意する代わりにサービスを使用する場合は、Yahooの GeoPlanet を使用できます。サービスのアプローチについては、 this answer on gis.stackexchange.com をご覧ください。問題を解決するためのサービスの可用性をカバーしています。

3
steenhulthin

私はこの質問が本当に古いことを知っていますが、私は同じ問題に取り組んでおり、Ajay Thampiによって構築された非常に効率的で便利なパッケージreverse_geocoderを見つけました。コードは利用可能です ここ 。これは、大量のポイントに対して非常に効率的なK-Dツリーの並列実装に基づいています(100,000ポイントを取得するのに数秒かかりました)。

これは、 this データベースに基づいており、すでに@turgosで強調表示されています。

座標リストから国と都市をすばやく見つけることがタスクの場合、これは素晴らしいツールです。

2

Google Geocoding APIを使用できます

Bellowは、Address、City、State、Countryを返すphp関数です

public function get_location($latitude='', $longitude='')
{
    $geolocation = $latitude.','.$longitude;
    $request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false'; 
    $file_contents = file_get_contents($request);
    $json_decode = json_decode($file_contents);
    if(isset($json_decode->results[0])) {
        $response = array();
        foreach($json_decode->results[0]->address_components as $addressComponet) {
            if(in_array('political', $addressComponet->types)) {
                    $response[] = $addressComponet->long_name; 
            }
        }

        if(isset($response[0])){ $first  =  $response[0];  } else { $first  = 'null'; }
        if(isset($response[1])){ $second =  $response[1];  } else { $second = 'null'; } 
        if(isset($response[2])){ $third  =  $response[2];  } else { $third  = 'null'; }
        if(isset($response[3])){ $fourth =  $response[3];  } else { $fourth = 'null'; }
        if(isset($response[4])){ $fifth  =  $response[4];  } else { $fifth  = 'null'; }


        $loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
        if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $fourth;
            $loc['country'] = $fifth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null'  ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $third;
            $loc['country'] = $fourth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
            $loc['city'] = $first;
            $loc['state'] = $second;
            $loc['country'] = $third;
        }
        else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['state'] = $first;
            $loc['country'] = $second;
        }
        else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['country'] = $first;
        }
      }
      return $loc;
}
1
Nishad Up

GoogleのPlaces APIを使用している場合、Javascriptを使用してプレースオブジェクトから国と都市を取得する方法は次のとおりです。

function getCityAndCountry(location) {
  var components = {};
  for(var i = 0; i < location.address_components.length; i++) {
    components[location.address_components[i].types[0]] = location.address_components[i].long_name;
  }

  if(!components['country']) {
    console.warn('Couldn\'t extract country');
    return false;
  }

  if(components['locality']) {
    return [components['locality'], components['country']];
  } else if(components['administrative_area_level_1']) {
    return [components['administrative_area_level_1'], components['country']];
  } else {
    console.warn('Couldn\'t extract city');
    return false;
  }
}
0
vedo27

Loc2country は、指定された位置座標(緯度/経度)のISO alpha-3国コードを返すGolangベースのツールです。マイクロ秒で応答します。国の地図にジオハッシュを使用します。

ジオハッシュデータは、 georaptor を使用して生成されます。

このツールには、レベル6のジオハッシュ、つまりサイズが1.2 km x 600 mのボックスを使用します。

0
Ashwin Nair

以下の回答を確認してください。わたしにはできる

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){

        initialize(position.coords.latitude,position.coords.longitude);
    }); 
}

function initialize(lat,lng) {
    //directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    //directionsService = new google.maps.DirectionsService();
    var latlng = new google.maps.LatLng(lat, lng);

    //alert(latlng);
    getLocation(latlng);
}

function getLocation(latlng){

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                    alert("location is::"+loc);
                }
            }
        });

}

function getCountry(results)
{
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                return shortname;
            }
            else
            {
                return longname;
            }
        }
    }

}

function isNullOrWhitespace(text) {
    if (text == null) {
        return true;
    }
    return text.replace(/\s/gi, '').length < 1;
}
0
Summved Jain