C#には1つのクラスライブラリがあります。そこからGoogleサービスに電話して、緯度と経度を取得する必要があります。
AJAXページで使用する方法を知っていますが、C#クラスファイルから直接Google Geocodingサービスを呼び出したいです。
これを行う方法はありますか、これに使用できる他のサービスはありますか?.
次のようなことができます:
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 をご覧ください。
私はコメントする評判がありませんが、クリス・ジョンソンのコードは魅力のように機能すると言いたいだけです。私と同じくらい愚かな人にとって、アセンブリは次のとおりです。
using System.Net;
using System.Xml.Linq;
また、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);
}
Webサービスを呼び出して、json/xml応答を処理できます。
これは、使用可能な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の結果を扱うようにしてください。
この答えには少し手遅れかもしれませんが、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;
これらのメソッドは使いやすく、詳細な説明が要約されています。
NugetコマンドでインストールできますInstall-Package Easyforce.GuigleAPI
ソースコードだけが必要な場合は、プロジェクトを GitHub で利用できます。あなたの貢献のためにPRをしてください=)
古い質問です。しかし、今日同じ質問があり、解決策としてこれを思いつきました: 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
これはそれほど多くはないかもしれませんが、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)
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;
}
}
}