4

場所の座標を考えると、地名を取得する方法はありますか?

私は住所を意味するのではなく、場所の「タイトル」を意味します。例:

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

それで、逆ジオコーディングWebサービスまたは私が呼び出すことができる何かがありますか?

string placeName = GetPlaceNameForCoordinates(76.07, -62.0)

...「Wal*Mart」または「ColumbiaJr.College」または適切なものが返されますか?

javaやios(Objective C、私は推測します)などの他の言語への参照を見つけましたが、WindowsストアアプリからC#でそれを行う方法については特に何もありません...

アップデート

アドレスを取得するためにこれをすでに持っています(Freemanの「MetroRevealed: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"));
 }

...しかし、ドキュメントには場所の名前は何も表示されません。彼らは家、道路、村、町、市、郡、郵便番号、国を提供しているようですが、地名は提供していません。

4

4 に答える 4

3

javaやiosなどの他の言語への参照を見つけました(Objective C、私は推測します)

それらの参照をよく調べてください-それらのほとんどは逆ジオコーディングWebサービスを使用する可能性があります...そしてそれらはWindowsストアアプリでも使用できます。アプリに適切な機能と制限があるサービスを選択し、HTTPリクエストを送信します。(適切なクライアントライブラリが利用可能であることに気付くかもしれませんが、Windows 8の最近の傾向により、現時点では比較的可能性は低いと思います...)

于 2012-12-03T18:45:45.000 に答える
3

私は通常、緯度/経度の座標を保存してから、GMapsを使用して場所を検索し、次に「ベストエフォートベースで」(住所を使用して場所の名前を検索します)、Googleマップを使用します。

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

}
于 2012-12-04T04:56:36.097 に答える
1
          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;
                            }
                        }
                    }
                }
            }
于 2015-05-11T06:03:00.543 に答える
1

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


   }

}
于 2019-09-02T19:25:45.957 に答える