Термин геокодирование обычно обозначает преобразование обычного адреса в местоположение на карте. Процесс, заключающийся в преобразовании точки на карте в удобочитаемый адрес, известен как обратное геокодирование. API геокодирования Google, напрямую поддерживает функцию обратного геокодирования при помощи параметра latlng. Например, следующий запрос содержит значение широты/долготы для географической точки на территории Москвы:
http://maps.google.com/maps/api/geocode/xml?latlng=55.7570051,37.6164606&sensor=true_or_false
Данный запрос возвращает следующий результат:
Ниже приведен полный список значений «formatted_address», возвращаемых приведенным выше запросом.
В соответствии с инструкцией «Работа с картами в Windows Form с использованием GMap.NET» , добавьте визуальный компонент «GMap.NET». У вас получится приведенный ниже пример.
Сделайте двойной клик по пустому пространству главной формы, вы перейдете в автоматически созданный метод загрузки главной формы «Form1_Load». Добавьте в него приведенный ниже код установки настроек для элемента управления «gMapControl1».
http://maps.google.com/maps/api/geocode/xml?latlng=55.7570051,37.6164606&sensor=true_or_false
Данный запрос возвращает следующий результат:
Обратите внимание, что обратный геокодер вернул несколько результатов. Элементы «formatted_address» в результатах представляют не просто почтовые адреса, но и любые наименования географических точек и областей. Например, геокодируемая точка в пределах Москвы может быть обозначена как номер дома, улица, город (Москва), область или страна (Россия). Для геокодера все эти элементы являются "адресами". Любой из этих типов возвращается обратным геокодером в качестве допустимых результатов. Обратный геокодер сопоставляет точки, указанные на карте, с политическими и административными единицами (странами, провинциями, городами и районами), адресами и почтовыми индексами.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 : "улица Охотный Ряд, 2, Москва, Россия, 109012",
- formatted_address : "Москва, Россия, 109012",
- formatted_address : "Тверской район, Москва, Россия",
- formatted_address : "Центральный административный округ, Москва, Россия",
- formatted_address : "Москва, Rossiya",
- formatted_address : "город Москва, город Москва, Россия",
- formatted_address : "город Москва, Россия",
- formatted_address : "Россия",
Результаты, получаемые при обратном геокодировании, являются приблизительными. Геокодер пытается найти ближайшее местоположение, которому можно сопоставить адрес с некоторой погрешностью. Если это невозможно, геокодер возвращает нулевой результат.
Запустите 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» и сделайте клик правой клавишей мыши в любом месте загруженной карты. У вас установится маркер с информацией о данном месте. Ниже представлены примеры установки маркеров в разных местах карты.
Ссылка для скачивания примера: Яндекс.Диск
Комментариев нет:
Отправить комментарий
Большая просьба, не писать в комментариях всякую ерунду не по теме!