有没有办法根据坐标获取地名?

Posted

技术标签:

【中文标题】有没有办法根据坐标获取地名?【英文标题】:Is there a way to get a place name based on coordinates? 【发布时间】:2012-12-03 18:43:14 【问题描述】:

给定一个位置的坐标,有没有办法得到地名?

我不是指地址,我指的是地点的“标题”,例如:

Coordinates: 76.07, -62.0 // or whatever they are
Address: 157 Riverside Avenue, Champaign, Illinois
Place name: REO Speedwagon's Rehearsal Spot

-或:

Coordinates: 76.07, -62.0 // or whatever they are
Address: 77 Sunset Strip, Hollywood, CA
Place name: Famous Amos Cookies

那么有没有反向地理编码网络服务或我可以调用的东西,一个啦:

string placeName = GetPlaceNameForCoordinates(76.07, -62.0)

...这将返回“Wal*Mart”或“Columbia Jr. College”或其他合适的名称?

我找到了对其他语言的引用,例如 java 和 ios(我猜是 Objective C),但没有专门针对如何从 Windows 商店应用程序中的 C# 执行此操作...

更新

我已经有了这个来获取地址(改编自 Freeman 的“Metro Revealed:使用 XAML 和 C# 构建 Windows 8 应用程序”第 75 页):

public static async Task<string> GetStreetAddressForCoordinates(double latitude, double longitude)

    HttpClient httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri("http://nominatim.openstreetmap.org");
    HttpResponseMessage httpResult = await httpClient.GetAsync(
        String.Format("reverse?format=json&lat=0&lon=1", latitude, longitude));

    JsonObject jsonObject = JsonObject.Parse(await httpResult.Content.ReadAsStringAsync());

    return string.format("0 1", jsonObject.GetNamedObject("address").GetNamedString("house"),
                                    jsonObject.GetNamedObject("address").GetNamedString("road"));
 

...但是我在他们的文档中看不到地名;它们似乎提供房屋、道路、村庄、城镇、城市、县、邮政编码和国家,但没有提供地名。

【问题讨论】:

这个问题问了一个类似的问题,希望能给你更多的想法***.com/questions/8043077/… 【参考方案1】:

我通常存储纬度/经度坐标,然后使用 GMaps 查找位置,然后“尽最大努力” - 使用地址查找地点名称 - 再次通过 Google Maps。

static string baseUri = 
  "http://maps.googleapis.com/maps/api/geocode/xml?latlng=0,1&sensor=false";
string location = string.Empty;

public static void RetrieveFormatedAddress(string lat, string lng)

    string requestUri = string.Format(baseUri, lat, lng);

    using (WebClient wc = new WebClient())
    
        string result = wc.DownloadString(requestUri);
        var xmlElm = XElement.Parse(result);
        var status = (from elm in xmlElm.Descendants() where 
            elm.Name == "status" select elm).FirstOrDefault();
        if (status.Value.ToLower() == "ok")
        
            var res = (from elm in xmlElm.Descendants() where 
                elm.Name == "formatted_address" select elm).FirstOrDefault();
            requestUri = res.Value;
        
    

编辑:

这是一个简单的反面版本:

public static Coordinate GetCoordinates(string region)

    using (var client = new WebClient())
    

        string uri = "http://maps.google.com/maps/geo?q='" + region + 
          "'&output=csv&key=sadfwet56346tyeryhretu6434tertertreyeryeryE1";

        string[] geocodeInfo = client.DownloadString(uri).Split(',');

        return new Coordinate(Convert.ToDouble(geocodeInfo[2]), 
                   Convert.ToDouble(geocodeInfo[3]));
    


public struct Coordinate

    private double lat;
    private double lng;

    public Coordinate(double latitude, double longitude)
    
        lat = latitude;
        lng = longitude;

    

    public double Latitude  get  return lat;  set  lat = value;  
    public double Longitude  get  return lng;  set  lng = value;  


【讨论】:

一个名为 RetrieveFormattedAddress() 的方法不应该返回一个字符串吗?【参考方案2】:

我发现了对其他语言的引用,例如 java 和 ios(我猜是 Objective C)

仔细查看这些参考资料 - 其中大部分都可能使用反向地理编码 Web 服务...您的 Windows 应用商店应用也可以使用这些服务。为您的应用选择具有适当功能和限制的服务,并向其发出 HTTP 请求。 (您甚至可能会发现有一个合适的客户端库可用,尽管我认为现在相对不太可能,因为 Windows 8 是最新的......)

【讨论】:

我也没有在地图任务中看到地名。如果 Bing 有它,我会更喜欢;下一个选择 openstreetmap,如上所示,我已经在使用它了。【参考方案3】:
          Geolocator geolocator = new Geolocator(); 
           Geoposition geoposition = await geolocator.GetGeopositionAsync();
            string lat = geoposition.Coordinate.Point.Position.Latitude.ToString();
            string lon = geoposition.Coordinate.Point.Position.Longitude.ToString();
            string baseUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?latlng=0,1&sensor=false", lat, lon);
            HttpClient client = new HttpClient();
            var response = await client.GetStringAsync(baseUri);
            var responseElement = XElement.Parse(response);
            IEnumerable<XElement>statusElement = from st in responseElement.Elements("status") select st;
            if (statusElement.FirstOrDefault() != null)
            
                string status = statusElement.FirstOrDefault().Value;
                if (status.ToLower() == "ok")
                
                    IEnumerable<XElement> resultElement = from rs in responseElement.Elements("result") select rs;
                    if (resultElement.FirstOrDefault() != null)
                    
                        IEnumerable<XElement> addressElement = from ad in resultElement.FirstOrDefault().Elements("address_component") select ad;
                        foreach (XElement element in addressElement)
                        
                            IEnumerable<XElement> typeElement = from te in element.Elements("type") select te;
                            string type = typeElement.FirstOrDefault().Value;
                            if(type=="locality")
                            
                                IEnumerable<XElement> cityElement = from ln in element.Elements("long_name") select ln;
                                string city = cityElement.FirstOrDefault().Value;
                                break;
                            
                        
                    
                
            

【讨论】:

我已经使用谷歌地图查找了当前位置的纬度、经度和城市信息。【参考方案4】:

在 c# 控制台应用程序中使用以下代码。传递具有坐标的 CSV 的路径,它将从响应中获取地址标签并将其放在 CSV 中

 using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace Google_Padouri


    class Program
    
        static void Main(string[] args)
        
            Google obj = new Google();
            obj.Execute();
        





class Google


    public void Execute()
    
        string result = string.Empty;
        try
        
            Console.WriteLine("Enter complete csv path");
            string path = Console.ReadLine();

            //string path = @"C:\tmp\google\test_file.csv";

            string[] rows = File.ReadAllLines(path);
            StringBuilder sb = new StringBuilder();
            int count = 0;

            foreach(string row in rows)
            
                string[] arr = row.Split(',');
                string lat = arr[0];
                string lng = arr[1];

                if (count > 0) 
                
                    result = GetResult(lat, lng);
                    if (result.Length > 1)
                    
                        result = GetAddress(result);
                        if (result.Length > 1)
                        
                            Console.WriteLine("Working on row number " + count);
                            sb.Append(lat + "," + lng + "," + result.Replace(",", "") + "\n");

                            //if(count==200)
                            //
                            //    break;
                            //
                        
                        else
                        
                            Console.WriteLine("Could not fetch results");
                        
                    
                    else
                    
                        Console.WriteLine("Google API response failed");
                    
                
                count = count+1;
            

            string dir = Path.GetDirectoryName(path);
            string file = Path.GetFileNameWithoutExtension(path);
            file = file + "_output.csv";
            string fullpath = dir + "\\" + file;
            using (StreamWriter wrtier = File.CreateText(fullpath))
            
                wrtier.Write(sb.ToString());
            
            Console.Write("File compiled successfully");
            Console.Read();

        
        catch (Exception ex)
        
            Console.Write(ex);
        
    

    public string GetResult(string lat,string lang)
    

        string method = "GET";
        string URL = "https://maps.googleapis.com/maps/api/geocode/json?";
        string Key = "key=YOUR_KEY";
        string Sensor = "sensor=false&";
        string latlng = "latlng=" + lat + "," + lang;
        string result = string.Empty;

        URL = URL + Key + Sensor + latlng;

        try
        
            using (WebClient wc = new WebClient())
            
                wc.Headers[HttpRequestHeader.ContentType] = "application/json";
                wc.Encoding = Encoding.UTF8;
                wc.Headers.Add("User-Agent: Other");

                switch (method.ToUpper())
                
                    case "GET":
                        result = wc.DownloadString(URL);
                        break;
                
            
        
        catch (Exception ex)
        
            Console.Write(ex);
            Console.Read();
        

        return result;
    

    public string GetAddress(string data)
    
        string result = string.Empty;
        try
        
            if (data.Length > 1)
            
                JToken token = JToken.Parse(data);
                JArray array = JArray.Parse(token["results"].ToString());



                    result = array.First["formatted_address"].ToString();


            

        
        catch (Exception ex)
        
            Console.WriteLine(ex);
            Console.Read();
        
        return result;
    


   


【讨论】:

以上是关于有没有办法根据坐标获取地名?的主要内容,如果未能解决你的问题,请参考以下文章

从坐标中获取当前地名(在 nsstring 中)

调用百度地图api怎么根据多个经纬度显示点位

根据经纬度检索地名

有没有办法构造一个函数来获取多个上层代理中存在的子代理的主坐标?

从谷歌地图上的标记中获取地名

QT中如何获取QTableView当前行的坐标