【问题标题】:Retrievin GPS/DMS Coordinates from Google从 Google 检索 GPS/DMS 坐标
【发布时间】:2021-01-04 18:32:48
【问题描述】:

我在 ASP .Net 程序中有一些代码,它向 Google 地图 API 发出请求并将坐标检索为 LAT/LNG

      string url = https://maps.google.com/maps/api/geocode/xml?address=ABC DEF,UK&sensor=false&key=AI123ZYX
        WebRequest request = WebRequest.Create(url);

        using (WebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                // removed for brevity
                // Returns LAT/LNG values
            }
        }

这按预期工作,但我无法训练如何转换或检索 DMS(度数、分钟、秒,例如 1° 23' 45" W 67° 89' 10" N)值。

我检查了 Google 的文档,但所有内容都指向您输入值或地址的手机或网络,它会显示它。

我正在尝试以编程方式执行相同的操作,因此我可以将 LAT/LNG 与 DMS(或可能称为 GPS)坐标一起存储。我如何检索这些坐标?

【问题讨论】:

    标签: c# asp.net .net httpwebresponse


    【解决方案1】:

    所以看起来对 Google Maps API 的查询会返回一个 JSON 对象 (SRC:https://stackoverflow.com/a/34597393/8502032)。 C# 本身不处理 JSON,因此您可以使用 Newtonsoft 的 Json.NET 库来帮助您将对象解析为更可行的内容。

    您可以通过多种方式从那里访问信息。一种是使用 Json.net 的反序列化功能。这将获取 JSON 字符串并将其插入到可用对象中。您可以创建一个自定义对象,该对象将抓取您关心的 JSON 部分,然后删除其余部分。

    这来自我链接的答案,我们将使用它作为我们尝试访问的数据集。

    "routes" : [
          {
             "bounds" : {
                "northeast" : {
                   "lat" : 34.1330949,
                   "lng" : -117.9143879
                },
                "southwest" : {
                   "lat" : 33.8068768,
                   "lng" : -118.3527671
                }
             },
             "copyrights" : "Map data ©2016 Google",
             "legs" : [
                {
                   "distance" : {
                      "text" : "35.9 mi",
                      "value" : 57824
                   },
                   "duration" : {
                      "text" : "51 mins",
                      "value" : 3062
                   },
                   "end_address" : "Universal Studios Blvd, Los Angeles, CA 90068, USA",
                   "end_location" : {
                      "lat" : 34.1330949,
                      "lng" : -118.3524442
                   },
                   "start_address" : "Disneyland (Harbor Blvd.), S Harbor Blvd, Anaheim, CA 92802, USA",
                   "start_location" : {
                      "lat" : 33.8098177,
                      "lng" : -117.9154353
                   },
    
      ... Additional results truncated in this example[] ...
    

    因此,为了访问我们想要的内容,我们将创建一系列与我们想要的信息相匹配的类。

    class Routes
    {
       Legs legs;
    }
    
    class Legs
    {
       EndLocation endLocation;
    }
    
    class EndLocation
    {
       string lat;
       string lon;
    }
    

    这是粗略的代码,我无法对其进行测试,但希望它能给你一个好的开始方向。

    using Newtonsoft.Json;
    
    void ReadJson()
    {
       // Let's say for now that our results are held in a file, for simplicity's sake
       string jsonString = File.ReadAllText(location.txt);
       
       // Now we'll call the deserializer, since we have the JSON string. 
       // It'll turn it into our object automatically with the template.
       Routes locationInfo = JsonConvert.DeserializeObject<Routes>(jsonString);
       serializer.Deserialize(jsonString, locationInfo);
    }
    

    之后,您应该能够访问 locationInfo 对象,就像您访问任何常规 C# 对象一样。 这应该工作,但至少我希望能给你一个很好的方向来解决你的问题。

    【讨论】:

    • 谢谢,我会试一试,但目前我以 XML 格式返回数据(所以假设它是相同的数据)。我仍然不明白的是,如果我得到 endLocation 我如何获得数据格式为 1° 23' 45" W 67° 89' 10" N?
    • 那我有点糊涂了。你能得到 LAT/LONG 的值吗?如果是这样,它是十进制格式(例如:12.555°)吗?如果是这种情况,那么您需要做的就是将小数转换为 DMS(度/分/秒)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多