【问题标题】:reverse geocoding using nominatim in asp.net在 asp.net 中使用 nominatim 进行反向地理编码
【发布时间】:2013-12-27 05:37:00
【问题描述】:

我在我的 asp.net 网站(Visual Studio 2010,C#)中使用 nominatim 进行反向地理编码。

我在另一个网页上得到了 XML 或 json 格式的答案,如下所示:

我无法使用 XML 阅读器或 HTTP 响应读取此地址。

需要帮助将此文本转换为纯文本并显示在我的网站上。

【问题讨论】:

    标签: c# asp.net openstreetmap reverse-geocoding nominatim


    【解决方案1】:

    为了解决 Forbidden 错误,我添加了带有 WebClient 对象的标头,如下所示-

    WebClient webClient = new WebClient(); 
    
    **webClient.Headers.Add("User-Agent: Other");**
    
     var jsonData = webClient.DownloadData("http://nominatim.openstreetmap.org/reverse?format=json&lat=23.02951&lon=72.48689");
    
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(RootObject));
    var rootObject = ser.ReadObject(new MemoryStream(jsonData));
    

    【讨论】:

      【解决方案2】:

      好吧,您必须反序列化从 Web 服务获得的 json 数据。 您必须定义两个新类,即:

       [DataContract]
              public class Address
              {
                  [DataMember]
                  public string road { get; set; }
                  [DataMember]
                  public string suburb { get; set; }
                  [DataMember]
                  public string city { get; set; }
                  [DataMember]
                  public string state_district { get; set; }
                  [DataMember]
                  public string state { get; set; }
                  [DataMember]
                  public string postcode { get; set; }
                  [DataMember]
                  public string country { get; set; }
                  [DataMember]
                  public string country_code { get; set; }
              }
      
              [DataContract]
              public class RootObject
              {
                  [DataMember]
                  public string place_id { get; set; }
                  [DataMember]
                  public string licence { get; set; }
                  [DataMember]
                  public string osm_type { get; set; }
                  [DataMember]
                  public string osm_id { get; set; }
                  [DataMember]
                  public string lat { get; set; }
                  [DataMember]
                  public string lon { get; set; }
                  [DataMember]
                  public string display_name { get; set; }
                  [DataMember]
                  public Address address { get; set; }
              }
      

      之后,您将能够使用以下代码获取数据:

      WebClient webClient = new WebClient();
                  var jsonData = webClient.DownloadData("http://nominatim.openstreetmap.org/reverse?format=json&lat=23.02951&lon=72.48689");
      
                  DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(RootObject));
                  var rootObject = ser.ReadObject(new MemoryStream(jsonData));
      

      rootObject 包含您需要的所有数据,以便将其转换为纯文本或任何其他格式。

      【讨论】:

      • 无法解析远程名称:'nominatim.openstreetmap.org'
      • 实际上的问题是,指定的 URL 没有返回任何响应。我们可以重定向到该页面,但无法得到响应。有什么建议可以解决吗???
      • 你是否超过了公共服务的配额?
      • 在将其发布到此处之前,我确实对其进行了测试。你有安装代理服务器吗?如果是这样,那么您必须分别设置Webclient。
      • 我可以重定向到该 URL,但无法下载数据。在这种情况下也需要设置 Webclient 吗?以及要遵循哪些步骤?
      【解决方案3】:

      为了补充Vladimir Gondarev 给出的示例,Nominatim 目前不接受没有Referer 和User-Agent 的请求。 这样,只需添加以下两行:

      webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
      webClient.Headers.Add("Referer", "http://www.microsoft.com");
      

      (根据自己的喜好修改)。

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 2019-01-01
        • 1970-01-01
        • 2021-01-26
        • 2018-05-30
        相关资源
        最近更新 更多