web-dev-qa-db-ja.com

C#コードからGoogle Geocodingサービスを呼び出す方法

C#には1つのクラスライブラリがあります。そこからGoogleサービスに電話して、緯度と経度を取得する必要があります。

AJAXページで使用する方法を知っていますが、C#クラスファイルから直接Google Geocodingサービスを呼び出したいです。

これを行う方法はありますか、これに使用できる他のサービスはありますか?.

43
vaibhav shah

次のようなことができます:

string address = "123 something st, somewhere";
string requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false", Uri.EscapeDataString(address));

WebRequest request = WebRequest.Create(requestUri);
WebResponse response = request.GetResponse();
XDocument xdoc = XDocument.Load(response.GetResponseStream());

XElement result = xdoc.Element("GeocodeResponse").Element("result");
XElement locationElement = result.Element("geometry").Element("location");
XElement lat = locationElement.Element("lat");
XElement lng = locationElement.Element("lng");

また、応答ステータスを検証し、WebExceptionsをキャッチすることもできます。 Google Geocoding API をご覧ください。

100
Chris Johnson

私はコメントする評判がありませんが、クリス・ジョンソンのコードは魅力のように機能すると言いたいだけです。私と同じくらい愚かな人にとって、アセンブリは次のとおりです。

using System.Net;
using System.Xml.Linq;
32
DyreVaa

また、Asp.Net Web ApiまたはAsp.Net 5.0でよく使用されるHttpClientクラスを使用することもできます。

また、無料のasyn/awaitプログラミングモデルのhttp状態コードがあり、HttpClientでの例外処理は簡単です。

var address = "paris, france";
var requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false", Uri.EscapeDataString(address));

using (var client = new HttpClient())
{
    var request = await client.GetAsync(requestUri);
    var content = await request.Content.ReadAsStringAsync();
    var xmlDocument = XDocument.Parse(content);

}
7
Pascal

Webサービスを呼び出して、json/xml応答を処理できます。

http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true

これは、使用可能なjson応答を返します。

使用条件で読むことができるように、Googleマップを表示する場合にのみWebサービスの使用が許可されます。

ここでは、サービスに関するすべての情報を見つけることができます: https://developers.google.com/maps/documentation/geocoding/

JSONレスポンスの処理方法を確認するには、次のトピックをご覧ください: Google Maps v3 geocoding server-side

EDIT:この記事を見つけました: http://www.codeproject.com/Tips/505361/Google-Map-Distance- Matrix-and-Geocoding-API-V3-we

私はこれをテストしませんでしたが、多分それはあなたのために働くでしょう:)

EDIT2:codeprojectの例は機能しないようです:(言及されたURLは、入力されたアドレスポイントに関係なく、常に同じを返します。 。
ただし、とにかくこれがベストプラクティスであるため、JSONまたはXMLの結果を扱うようにしてください。

4
bema

この答えには少し手遅れかもしれませんが、Google Geocoding APIを使用する簡単な方法を探している人のために、このシンプルな Guigle APIと呼ばれるナゲット を作成し、このように使用できます:

GoogleGeocodingAPI.GoogleAPIKey = "YOUR API KEY";
AddressResponse result = await GoogleGeocodingAPI.SearchAddressAsync("100 Market St, Southbank");

OR

var result = await GoogleGeocodingAPI.GetCityFromCoordinatesAsync(11.1111, 22.2222);
var city = result.Item1;
var country = result.Item3;
  • 私が気に入っていることの1つは、API応答から完全なオブジェクトを取得できることです。したがって、すべてに簡単にアクセスでき、Linqやその他のコレクションヘルパーを使用して、そこからデータを簡単に取得できます。たとえば、住所の場合、次のタイプなどがあります。

    public class AddressResponse
    {
        public List<Address> Results { get; set; }
        public string Status { get; set; }
    }
    public class Address
    {
        public List<AddressComponent> AddressComponents { get; set; }
        public string FormattedAddress { get; set; }
        public Geometry Geometry { get; set; }
        public string PlaceId { get; set; }
        public List<string> Types { get; set; }
    }

次のようなことができます:

(...)
var state = addressComponentes.FirstOrDefault(r => r.Types.Contains(AddressType.administrative_area_level_1.ToString()))?.ShortName;
  • Google Places APIクエリにも使用できます。
  • すべてのメソッドにはオーバーロードオプションがあり、複数の呼び出しを行う場合に独自のHttpClientを渡して、自分で開く/閉じることができます。
  • 申し訳ありませんが、まだ完全には実装/テストされていませんが、これらの基本的な検索では完全に機能しています。

これらのメソッドは使いやすく、詳細な説明が要約されています。

NugetコマンドでインストールできますInstall-Package Easyforce.GuigleAPI

ソースコードだけが必要な場合は、プロジェクトを GitHub で利用できます。あなたの貢献のためにPRをしてください=)

4
Guilherme

古い質問です。しかし、今日同じ質問があり、解決策としてこれを思いつきました: C#GeoCoding/Address Validation API (Google Mapsを含むいくつかのプロバイダーをサポートします)。

IGeocoder geocoder = new GoogleGeocoder() { ApiKey = "this-is-my-optional-google-api-key" };

IEnumerable<Address> addresses = await geocoder.GeocodeAsync("1600 pennsylvania ave washington dc");

Console.WriteLine("Formatted: " + addresses.First().FormattedAddress);
// Formatted: 1600 Pennsylvania Ave SE, Washington, DC 20003, USA

Console.WriteLine("Coordinates: " + addresses.First().Coordinates.Latitude + ", " + addresses.First().Coordinates.Longitude);
// Coordinates: 38.8791981, -76.9818437

対応するNuGetパッケージは次のとおりです。

インストールパッケージ Geocoding.Google

3
JP Hellemons

これはそれほど多くはないかもしれませんが、chris johnsonのvar latとvar lngがこの形式<lat>の値を持っているvar latとvar lngをdouble形式で取得したい場合は、@ Chris Johnsonコードを1つ改善したいだけです。 ..number ... </ lat>

あなたが値を渡す場合は、数値を取得するために文字列ですあなたはこのようにする必要があります

  double latitude = Double.Pars(lat.Value)
 double longitude = Double.Pars(lng.Value)
1
LittleThunder

JP Hellemonsの回答を完了するには、 Geocoding.net を使用して、たとえば都市の名前のみを取得します。

IGeocoder geocoder = new GoogleGeocoder() { ApiKey = "API_Key" };
IEnumerable<Address> addresses = await geocoder.GeocodeAsync("address");

foreach(var component in ((GoogleAddress)addresses.First()).Components)
{
    foreach(var type in component.Types)
    {
        if(type == GoogleAddressType.Locality)
        {
            return component.LongName;
        }
    }
}
0
A. Morel