【问题标题】:Working with the Google Location API使用 Google Location API
【发布时间】:2011-06-16 23:56:23
【问题描述】:

原谅我的无知,但经过几个小时的搜索,我运气不佳。

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

http://maps.googleapis.com/maps/api/geocode/output?parameters

虽然我熟悉编写基本的 C Sharp 应用程序,但在与此 API 交互时,我真的不知道从哪里开始。你们能提供的任何帮助将不胜感激。

【问题讨论】:

    标签: c# geolocation


    【解决方案1】:

    通过使用GuigleAPI nuget,您可以这样做:

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

    只需使用 nuget 命令 Install-Package Easyforce.GuigleAPI 安装它,一切顺利。

    查看此答案以获取更多详细信息: https://stackoverflow.com/a/44484010/1550202

    【讨论】:

      【解决方案2】:

      完整记录的 .NET 库 -

      .NET 的 Google 地图网络服务 API 包装器 https://github.com/maximn/google-maps/

      //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);
      

      【讨论】:

      • 有人在 MVC3 c# 应用程序上尝试过这个 API 吗?在我这边,它正在加载页面很长时间:-?但是当我运行控制台应用程序时,一切正常。
      • @czetsuya 我昨晚在 GitHub 上的最新版本遇到了同样的问题。只是似乎挂起并且永远不会恢复......
      • 我们几天前刚刚修复了它。请确保您运行的是最新版本。另外,我会在接下来的几天上传一个 nuget 包。
      • @Maxim - 该库非常易于使用,谢谢 :) 我仍然遇到此问题,NuGet 包是否已更新为修复此问题的版本?我还没有使用企业许可证,但我们计划在一切正常后购买一个。
      • 感谢@Maxim - 我很好奇的一件事是如何将单位系统从公制更改为英制?
      【解决方案3】:

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

      Building a Store Locator ASP.NET Application Using Google Maps API (Part 1)

      Building a Store Locator ASP.NET Application Using Google Maps API (Part 2)

      Building a Store Locator ASP.NET Application Using Google Maps API (Part 3)

      【讨论】:

        【解决方案4】:

        这里有一个示例代码,可以得到你想要的

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

        你的助手类会是

         namespace GoogleMapsSample
        {
            [DataContract]
            public class GeoResponse
            {
                [DataMember(Name = "status")]
                public string Status { get; set; }
                [DataMember(Name = "results")]
                public CResult[] Results { get; set; }
        
                [DataContract]
                public class CResult
                {
                    [DataMember(Name = "geometry")]
                    public CGeometry Geometry { get; set; }
        
                    [DataContract]
                    public class CGeometry
                    {
                        [DataMember(Name = "location")]
                        public CLocation Location { get; set; }
        
                        [DataContract]
                        public class CLocation
                        {
                            [DataMember(Name = "lat")]
                            public double Lat { get; set; }
                            [DataMember(Name = "lng")]
                            public double Lng { get; set; }
                        }
                    }
                }
        
                public GeoResponse()
                { }
            }
        
        
        }
        

        然后你可以像这样在你的控件/winforms中使用这个代码

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

        并使用 StringBuilder 或其他方法在后面的代码上构建 JS

        【讨论】:

          【解决方案5】:

          如果您在 C# 中执行此操作,您将需要使用 HttpWebRequest 和 HttpWebResponse 类。您可以将参数化 URL(google API 调用)作为参数传递给 Create() 方法。我建议请求将数据作为 XML 数据返回。关闭连接 (httpWResp.Close()) 后,您可以使用流阅读器进行阅读。请参阅有关 GetResponseStream() 方法的文档:http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.getresponsestream.aspx

          HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address=1+Maritime+Plaza+San+Francisco+CA ");

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

          【讨论】:

            【解决方案6】:

            Geocode API 相当简单,要从 api 获取纬度/经度,您只需要 3 个参数:输出、传感器和地址。

            输出你想要的输出格式,json or xml (IIRC)

            sensor 应该是一个布尔值,表示天气或不是来自传感器,例如 GPS 芯片。

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

            这是一个示例,我在其中对我的办公室地址进行地理编码,并获取 JSON 作为响应: http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=1+Maritime+Plaza+San+Francisco+CA

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

            {
              "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
                    }
                  }
                }
              } ]
            }
            

            如果您将提供的纬度/经度放在map 上,您会在我的办公楼上看到一个指针。

            【讨论】:

            • 我一定会尝试一下。在此期间我只想说声谢谢,我真的很感激。
            • 如果您添加可选的区域参数,它将更努力地返回那里的位置。
            猜你喜欢
            • 1970-01-01
            • 2014-11-05
            • 1970-01-01
            • 1970-01-01
            • 2018-01-15
            • 2014-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多