C# 使用googlelocationapi

C# 使用googlelocationapi,c#,geolocation,C#,Geolocation,请原谅我的无知,但经过几个小时的寻找,我几乎没有什么运气 无论如何,我正在尝试编写一个小型桌面应用程序,允许用户输入地址,然后以GPS坐标返回其大致位置。据我所知,谷歌提供了一个地理编码API[1],允许以下形式的请求: 虽然我熟悉编写基本的C Sharp应用程序,但我真的不知道在与这个API接口时从哪里开始。非常感谢你们提供的任何帮助。地理编码API非常简单,要从API中获取lat/lon,您只需要3个参数:输出、传感器和地址 输出所需的输出格式,json或xml(IIRC) 传感器应为布尔

请原谅我的无知,但经过几个小时的寻找,我几乎没有什么运气

无论如何,我正在尝试编写一个小型桌面应用程序,允许用户输入地址,然后以GPS坐标返回其大致位置。据我所知,谷歌提供了一个地理编码API[1],允许以下形式的请求:


虽然我熟悉编写基本的C Sharp应用程序,但我真的不知道在与这个API接口时从哪里开始。非常感谢你们提供的任何帮助。

地理编码API非常简单,要从API中获取lat/lon,您只需要3个参数:输出、传感器和地址

输出所需的输出格式,json或xml(IIRC)

传感器应为布尔值,指示天气与否。该值来自传感器,如GPS芯片

地址应该是您希望进行地理编码的地址(不要忘记对其进行url编码)

这是一个示例,其中我对我的办公室地址进行地理编码,并获取JSON作为响应:

如果导航到该位置,您将看到如下内容:

{
  "status": "OK",
  "results": [ {
    "types": [ "street_address" ],
    "formatted_address": "1 Maritime Plaza, San Francisco, CA 94111, USA",
    "address_components": [ {
      "long_name": "1",
      "short_name": "1",
      "types": [ "street_number" ]
    }, {
      "long_name": "Maritime Plaza",
      "short_name": "Maritime Plaza",
      "types": [ "route" ]
    }, {
      "long_name": "San Francisco",
      "short_name": "San Francisco",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "San Francisco",
      "short_name": "San Francisco",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "San Francisco",
      "short_name": "San Francisco",
      "types": [ "administrative_area_level_2", "political" ]
    }, {
      "long_name": "California",
      "short_name": "CA",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "94111",
      "short_name": "94111",
      "types": [ "postal_code" ]
    } ],
    "geometry": {
      "location": {
        "lat": 37.7953907,
        "lng": -122.3991803
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.7922431,
          "lng": -122.4023279
        },
        "northeast": {
          "lat": 37.7985383,
          "lng": -122.3960327
        }
      }
    }
  } ]
}
如果您使用提供的lat/lon并将其放置在a上,您会在我的办公楼上看到一个指针。

如果您在C#中执行此操作,您将希望使用HttpWebRequest和HttpWebResponse类。您可以将参数化URL(google API调用)作为参数传递给Create()方法。我建议请求将数据作为XML数据返回。关闭连接(httpWResp.close())后,可以使用流读取器进行读取。请参阅有关GetResponseStream()方法的文档:

HttpWebRequest HttpWReq= (HttpWebRequest)WebRequest.Create(“http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address=1+海事+广场+旧金山+加利福尼亚 ");

HttpWebResponse HttpWResp=(HttpWebResponse)HttpWReq.GetResponse(); //插入使用响应对象的代码。
HttpWResp.Close()

下面是一个示例代码,用于获取您想要的内容

using System;
using System.Web;
using System.Net;
using System.Runtime.Serialization.Json;

namespace GoogleMapsSample
{
    public class GoogleMaps
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public static GeoResponse GetGeoCodedResults(string address)
        {
            string url = string.Format(
                    "http://maps.google.com/maps/api/geocode/json?address={0}&region=dk&sensor=false",
                    HttpUtility.UrlEncode(address)
                    );
            var request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GeoResponse));
            var res = (GeoResponse)serializer.ReadObject(request.GetResponse().GetResponseStream());
            return res;
        }


    }
然后您可以在控件/winforms中使用此代码,如下所示

            GeoResponse response = new GeoResponse();
            response = GoogleMaps.GetGeoCodedResults(TextBoxPostcode.Text);

并使用StringBuilder或其他任何有完整文档的.NET库在代码背后构建JS-

用于.NET的Google地图Web服务API包装器


我最近不得不为我正在进行的一个项目构建一个商店定位器。在此之前,我从未使用过任何谷歌或Bing API。使用本教程,我能够很好地掌握LocationAPI。我建议您阅读本教程,在这三个教程结束时,您应该对本教程有了很好的理解

通过使用,您只需执行以下操作:

GoogleGeocodingAPI.GoogleAPIKey = "YOUR API KEY";
var result = await GoogleGeocodingAPI.GetCoordinatesFromAddressAsync("100 Market St, Southbank");
var latitude = result.Item1;
var longitude = result.Item2;
只需使用nuget命令安装软件包Easyforce.GuigleAPI即可安装

查看此答案以了解更多详细信息:

我一定要试试这个。同时我想说声谢谢,我真的很感激。如果你添加可选的region参数,它会更努力地返回那里的位置。有人在MVC3 c#app上尝试过这个API吗?在我的身边,它加载页面的时间很长:-?但是当我运行一个控制台应用程序时,一切都很好。@czetsuya我昨晚在GitHub上的最新版本也遇到了同样的问题。只是看起来好像挂了起来,再也没有恢复过来……我们几天前刚把它修好。请确保您运行的是最新版本。此外,我将在未来几天内上传一个nuget软件包。@Maxim-该库非常易于使用,谢谢:)尽管如此,我仍然存在这个问题,nuget软件包是否已更新为解决此问题的版本?我还没有拿到企业许可证,但我们正计划在一切正常的情况下购买一个。感谢@Maxim-我很好奇的一件事是如何将单位制从公制改为英制?
//Directions
DirectionsRequest directionsRequest = new DirectionsRequest()
{
        Origin = "NYC, 5th and 39",
        Destination = "Philladephia, Chesnut and Wallnut",
};

        DirectionsResponse directions = MapsAPI.GetDirections(directionsRequest);

//Geocode
GeocodingRequest geocodeRequest = new GeocodingRequest()
{
        Address = "new york city",
};


GeocodingResponse geocode = MapsAPI.GetGeocode(geocodeRequest);

Console.WriteLine(geocode);

//Elevation
ElevationRequest elevationRequest = new ElevationRequest()
{
        Locations = new Location[] { new Location(54, 78) },
};


ElevationResponse elevation = MapsAPI.GetElevation(elevationRequest);

Console.WriteLine(elevation);
GoogleGeocodingAPI.GoogleAPIKey = "YOUR API KEY";
var result = await GoogleGeocodingAPI.GetCoordinatesFromAddressAsync("100 Market St, Southbank");
var latitude = result.Item1;
var longitude = result.Item2;