Есть ли способ получить название места на основе координат?



Учитывая координаты места, есть ли способ получить название места?



Я не имею в виду адрес, я имею в виду "название" места, например:



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


Так есть ли веб-сервис обратного геокодирования или что-то, что я могу назвать, a la:



string placeName = GetPlaceNameForCoordinates(76.07, -62.0)


...что вернет "Уол-Март "или" Колумбийский колледж-младший " или что там еще уместно?



Я нашел ссылки на другие языки, такие как java и ios (Objective C, я думаю), но ничего в частности, о том, как это сделать в C# из приложения Магазина Windows...



Обновление



У меня уже есть это для получения адреса (адаптировано из Freeman's "Metro Revealed: Building Windows 8 apps with XAML and C#" страница 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"));
}


...но я ничего не вижу для названия места в их документах; они, кажется, снабжают дом, дорогу, деревню, город, город, округ, почтовый индекс и страну, но не название места.

538   3  

3 ответов:

Обычно я сохраняю координаты широты / долготы, а затем использую 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; } }

}

Я нашел ссылки на другие языки, такие как java и ios (Objective C, я думаю)

Внимательно изучите эти ссылки - большинство из них, вероятно, используют обратное геокодирование веб-сервисы... и они также могут быть использованы вашим приложением для магазина Windows. Выберите службу, которая имеет соответствующие функции и ограничения для вашего приложения, и сделайте к ней HTTP-запросы. (Вы даже можете найти подходящую клиентскую библиотеку, хотя я думаю, что это относительно маловероятно прямо сейчас, из-за недавнего появления Windows 8...)

          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;
                            }
                        }
                    }
                }
            }

Comments

    Ничего не найдено.