使用Nominatim进行ASP.NET中的反向地理编码

3
我在我的asp.net网站(Visual Studio 2010,C#)中使用nominatim进行反向地理编码。
我从另一个网页以XML或JSON格式获取答案,如下所示: 我无法使用XML阅读器或HTTP响应读取此地址。
需要帮助将此文本转换为纯文本并显示在我的网站上。
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));

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 包含了你所需的所有数据,以便将其转换为纯文本或任何其他格式。


实际上问题是指定的URL没有返回任何响应。我们可以重定向到该页面,但无法获取响应。有什么建议来解决这个问题吗? - netX
你是否超过了公共服务的配额? - MaM
我在发布之前进行了测试。您是否安装了代理服务器?如果是这样,那么您必须相应地设置Webclient。 - Vladimir Gondarev
Response.Redirect("http://nominatim.openstreetmap.org/reverse?format=json&lat=23.02951&lon=72.48689"); 会将我重定向到该页面,在那里我可以找到以json格式表示的地址。但是使用您的代码,我无法下载这些数据。 - netX
是的。问题已解决。需要手动设置代理。谢谢你。 - netX
显示剩余6条评论

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

(根据您的喜好进行修改)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接