19 сент. 2014 г.

Работа с API геокодирования Google и GMap Часть 2. Обратное геокодирование.

      Термин геокодирование обычно обозначает преобразование обычного адреса в местоположение на карте. Процесс, заключающийся в преобразовании точки на карте в удобочитаемый адрес, известен как обратное геокодирование. API геокодирования Google, напрямую поддерживает функцию обратного геокодирования при помощи параметра latlng. Например, следующий запрос содержит значение широты/долготы для географической точки на территории Москвы:
http://maps.google.com/maps/api/geocode/xml?latlng=55.7570051,37.6164606&sensor=true_or_false

Данный запрос возвращает следующий результат:

OK

street_address
улица Охотный Ряд, 2, Москва, Россия, 109012

2
2
street_number


улица Охотный Ряд
ул. Охотный Ряд
route


Центральный административный округ
Центральный административный округ
sublocality_level_1
sublocality
political


Москва
Москва
locality
political


город Москва
г. Москва
administrative_area_level_2
political


город Москва
г. Москва
administrative_area_level_1
political


Россия
RU
country
political


109012
109012
postal_code



55.7570598
37.6165116

ROOFTOP


55.7557108
37.6151626


55.7584088
37.6178606




...
      Обратите внимание, что обратный геокодер вернул несколько результатов. Элементы «formatted_address» в результатах представляют не просто почтовые адреса, но и любые наименования географических точек и областей. Например, геокодируемая точка в пределах Москвы может быть обозначена как номер дома, улица, город (Москва), область или страна (Россия). Для геокодера все эти элементы являются "адресами". Любой из этих типов возвращается обратным геокодером в качестве допустимых результатов. Обратный геокодер сопоставляет точки, указанные на карте, с политическими и административными единицами (странами, провинциями, городами и районами), адресами и почтовыми индексами.
Ниже приведен полный список значений «formatted_address», возвращаемых приведенным выше запросом.

  • formatted_address : "улица Охотный Ряд, 2, Москва, Россия, 109012",
  • formatted_address : "Москва, Россия, 109012",
  • formatted_address : "Тверской район, Москва, Россия",
  • formatted_address : "Центральный административный округ, Москва, Россия",
  • formatted_address : "Москва, Rossiya",
  • formatted_address : "город Москва, город Москва, Россия",
  • formatted_address : "город Москва, Россия",
  • formatted_address : "Россия",
      Обычно возвращаемые адреса следуют в порядке от более конкретных к менее конкретным. Чем точнее адрес, тем значимее результат, как это видно из данного примера. Обратите внимание, что служба API геокодирования Google возвращает различные типы адресов, от наиболее конкретного адреса до менее конкретных административных и политических единиц, таких как районы, города, области, страны и т. д. Если требуется сопоставить более общий адрес, следует проверить содержимое поля «types» возвращенных элементов «Placemark».
      Результаты, получаемые при обратном геокодировании, являются приблизительными. Геокодер пытается найти ближайшее местоположение, которому можно сопоставить адрес с некоторой погрешностью. Если это невозможно, геокодер возвращает нулевой результат.
Запустите Microsoft Visual Studio и создайте новый проект Windows Form.
      В соответствии с инструкцией «Работа с картами в Windows Form с использованием GMap.NET» , добавьте визуальный компонент «GMap.NET». У вас получится приведенный ниже пример.
      Сделайте двойной клик по пустому пространству главной формы, вы перейдете в автоматически созданный метод загрузки главной формы «Form1_Load». Добавьте в него приведенный ниже код установки настроек для элемента управления «gMapControl1».
//Настройки для компонента GMap.
gMapControl1.Bearing = 0;

//CanDragMap - Если параметр установлен в True,
//пользователь может перетаскивать карту 
///с помощью правой кнопки мыши. 
gMapControl1.CanDragMap = true;

//Указываем, что перетаскивание карты осуществляется 
//с использованием левой клавишей мыши.
//По умолчанию - правая.
gMapControl1.DragButton = MouseButtons.Left;

gMapControl1.GrayScaleMode = true;

//MarkersEnabled - Если параметр установлен в True,
//любые маркеры, заданные вручную будет показаны.
//Если нет, они не появятся.
gMapControl1.MarkersEnabled = true;

//Указываем значение максимального приближения.
gMapControl1.MaxZoom = 18;

//Указываем значение минимального приближения.
gMapControl1.MinZoom = 2;

//Устанавливаем центр приближения/удаления
//курсор мыши.
gMapControl1.MouseWheelZoomType =
    GMap.NET.MouseWheelZoomType.MousePositionAndCenter;

//Отказываемся от негативного режима.
gMapControl1.NegativeMode = false;

//Разрешаем полигоны.
gMapControl1.PolygonsEnabled = true;

//Разрешаем маршруты
gMapControl1.RoutesEnabled = true;

//Скрываем внешнюю сетку карты
//с заголовками.
gMapControl1.ShowTileGridLines = false;

//Указываем, что при загрузке карты будет использоваться 
//2х кратное приближение.
gMapControl1.Zoom = 2;

//Указываем что будем использовать карты Yandex.
gMapControl1.MapProvider =
    GMap.NET.MapProviders.GMapProviders.YandexMap;
GMap.NET.GMaps.Instance.Mode =
    GMap.NET.AccessMode.ServerOnly;

//Если вы используете интернет через прокси сервер,
//указываем свои учетные данные.
GMap.NET.MapProviders.GMapProvider.WebProxy =
    System.Net.WebRequest.GetSystemWebProxy();
GMap.NET.MapProviders.GMapProvider.WebProxy.Credentials =
    System.Net.CredentialCache.DefaultCredentials;
      Так же добавьте в конец данного метода, приведенный ниже код, устанавливающий в элементе управления «gMapControl1», на событие «MouseClick», срабатывающее при клике любой клавишей мыши, событие «map_MouseClick».
//Устанавливаем свой метод на
//событие клика мышки.
gMapControl1.MouseClick += new MouseEventHandler(map_MouseClick);
      Добавьте после данного метода приведенный ниже код события «map_MouseClick». Данный метод выполняет проверку, была ли нажата правая клавиша мыши и в случае если данная проверка выполнена успешно, в переменные «lat» и «lng», заносятся координаты, где был выполнен клик правой клавишей мыши код. А так же реализует отправку запроса и чтения ответа службы API геокодирования Google и установки первого полученного значения из списка значений «formatted_address» в качестве подсказки маркера (т.к служба API геокодирования Google возвращает различные типы адресов, от наиболее конкретного адреса до менее конкретных).
//Список маркеров.
GMap.NET.WindowsForms.GMapOverlay overlayOne;

private void map_MouseClick(object sender, MouseEventArgs e)
{
    //Переменные для хранения 
    //координат устанавливаемого маркера.
    double lat = 0.0;
    double lng = 0.0;

    //Проверяем, что нажата правая клавиша мыши.
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {
        //Получаем координаты, где устанавливается новый маркер.
        lat = gMapControl1.FromLocalToLatLng(e.X, e.Y).Lat;
        lng = gMapControl1.FromLocalToLatLng(e.X, e.Y).Lng;

        //Запрос к API геокодирования Google.
        string url = string.Format(
            "http://maps.google.com/maps/api/geocode/xml?latlng={0},{1}&sensor=true_or_false&language=ru",
            lat.ToString().Replace(",", "."), lng.ToString().Replace(",", "."));

        //Выполняем запрос к универсальному коду ресурса (URI).
        System.Net.HttpWebRequest request =
            (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);

        //Получаем ответ от интернет-ресурса.
        System.Net.WebResponse response =
            request.GetResponse();

        //Экземпляр класса System.IO.Stream 
        //для чтения данных из интернет-ресурса.
        System.IO.Stream dataStream =
            response.GetResponseStream();

        //Инициализируем новый экземпляр класса 
        //System.IO.StreamReader для указанного потока.
        System.IO.StreamReader sreader =
            new System.IO.StreamReader(dataStream);

        //Считывает поток от текущего положения до конца.            
        string responsereader = sreader.ReadToEnd();

        //Закрываем поток ответа.
        response.Close();

        //Инициализируем новый документ Xml.
        System.Xml.XmlDocument xmldoc =
            new System.Xml.XmlDocument();

        xmldoc.LoadXml(responsereader);

        if (xmldoc.GetElementsByTagName("status")[0].ChildNodes[0].InnerText == "OK")
        {
            
            //Получение информации о найденном объекте.
            //Берем первый возвращаемый адрес.
            string formatted_address =
               xmldoc.SelectNodes("//formatted_address").Item(0).InnerText.ToString();
          
            //Получаем массив, элементы которого содержат подстроки 
            //данного экземпляра, разделенные
            //одним или более знаками из separator. 
            string[] words = formatted_address.Split(',');
            string dataMarker = string.Empty;

            //Получаем строку с переходами.
            foreach (string word in words)
            {
                dataMarker += word + ";" + Environment.NewLine;
            }

            //Создаем новый список маркеров, с указанием компонента 
            //в котором они будут использоваться и названием списка.
            GMap.NET.WindowsForms.GMapOverlay markersOverlay =
                new GMap.NET.WindowsForms.GMapOverlay(gMapControl1, "marker");

            //Инициализация нового ЗЕЛЕНОГО маркера, с указанием его координат.
            GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen markerG =
                new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen(
                new GMap.NET.PointLatLng(lat, lng));
            markerG.ToolTip =
                new GMap.NET.WindowsForms.ToolTips.GMapRoundedToolTip(markerG);

            //Указываем, что подсказку маркера, необходимо отображать всегда.
            markerG.ToolTipMode = GMap.NET.WindowsForms.MarkerTooltipMode.Always;

            //Текст подсказки маркера.                 
            markerG.ToolTipText = dataMarker;

            //Добавляем маркеры в список маркеров.
            markersOverlay.Markers.Add(markerG);

            //Очищаем список маркеров компонента.
            gMapControl1.Overlays.Clear();

            //Добавляем в компонент, список маркеров.
            gMapControl1.Overlays.Add(markersOverlay);

            //Устанавливаем позицию карты.
            gMapControl1.Position = new GMap.NET.PointLatLng(lat, lng);

            //Указываем, что при загрузке карты будет использоваться 
            //17ти кратное приближение.
            gMapControl1.Zoom = 17;

            //Обновляем карту.
            gMapControl1.Refresh();
        }
    }
}
     Запустите ваш проект, нажав на клавиатуре клавишу «F5» и сделайте клик правой клавишей мыши в любом месте загруженной карты. У вас установится маркер с информацией о данном месте. Ниже представлены примеры установки маркеров в разных местах карты.


Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!