3

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

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

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

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

4

3 回答 3

5

为了解决 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));
于 2015-05-18T08:04:32.683 回答
4

好吧,您必须反序列化从 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包含您需要的所有数据,以便将其转换为纯文本或任何其他格式。

于 2013-12-27T06:12:40.500 回答
2

为了补充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");

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

于 2017-09-28T15:51:12.080 回答