Обо всем.NET для начинающих. Геолокация по IP-адресу

Данная статья является вольным перевод с испанского.
Оригинал статьи: .NET Tutorial 52. Geolocalización por dirección IP

Некоторые из вас спросят меня, как можно сгенерировать такую подпись, с информацией о посетителе:

Как и следует ожидать, «геолокация» посетителя осуществляется по его IP-адресу. В данном случае, подпись была создана для посетителя из Кагуа, Венесуэла.

В этом примере, для определения местоположения посетителя будем использовать API, доступный на этой странице: http://smart-ip.net/geoip

Данная страница может предоставить информацию о геолокации в виде XML или JSON данных.
Документация по API доступна здесь: http://smart-ip.net/geoip-api

Поскольку .NET предоставляет класс для обработки XML-структуры очень простым способом, мы будем использовать XML вариант, а не JSON.

Согласно документации, API возвращает XML-файл, доступный по следующему адресу:

smart-ip.net/geoip-xml/direccion_ip/auto?lang=en

Это можно видеть на скриншоте в Firefox:

Но это не выглядит как XML-файл. Все потому, что Firefox интерпретирует код и отображает его, как на картинке выше. Если же мы посмотрим исходный код страницы (щелкнув правой кнопкой мыши на странице и выбрав View Source), увидим следующее:

Здесь мы видим, что это и в самом деле XML-файл.

Чтение данных из XML-файлов в .NET предельно просто. Мы должны импортировать следующее пространство имен:

Imports System.Xml

Для чтения достаточно сделать что-то, вроде этого:

Dim reader As XmlTextReader = New XmlTextReader("http://smart-ip.net/geoip-xml/" & DireccionIP & "/auto?lang=en")
Dim type As XmlNodeType

reader.WhitespaceHandling = WhitespaceHandling.Significant

While reader.Read
type = reader.NodeType
If type = XmlNodeType.Element Then

Select Case reader.Name
Case "countryName"
reader.Read()
mcountryName = reader.Value
Case "countryCode"
reader.Read()
mcountryCode = reader.Value
...
...
End Select
End If
End While

Далее в коде, вы увидите, что все это делается с помощью класса IPInfo, которому в конструктор передается IP-адрес.

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

Работа с классом достаточно проста, например:

Try
Dim myIPinfo As New IPinfo("18.122.119.183")

Debug.Print(myIPInfo.CountryName)
Debug.Print(myIPInfo.CountryCode)
Debug.Print(myIPInfo.CountryRegion)
Debug.Print(myIPInfo.City)
Debug.Print(myIPInfo.Latitude)
Debug.Print(myIPInfo.Longitude)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error")
End Try

Как видите это очень просто в использовании. В результате можно сделать нечто, вроде этого:

Примечание: иконки флагов имеют имена, соответсвующие значению свойства myIPInfo.CountryCode + расширение файла картинки, и расположены в папке Flags\
Так, например, если myIPInfo.CountryCode равно «us», значит вам нужна такая иконка: Flags\us.gif
Легко, быстро, доступно :)

Бонус: отображение фактического местонахождения на карте

Воспользуемся тем, что smart-ip API возвращает нам широту и долготу, и покажем на карте местоположение этих координат.

Для этого воспользуемся веб-сервисом карт, который нам предлагает поисковая система Bing. Первое, что нужно сделать, это получить «ключ», чтобы воспользоваться услугой Bing Maps для нашего кода.

Для этого мы идем на https://www.bingmapsportal.com
Впосле входа на наш Live ID получим доступ к этому экрану:

Для создания нового «ключа» воспользуйтесь соответствующим пунктом в меню слева.

Как только мы получили ключ, выполним следующие действия:

Добавим в наш проект ссылку на службу:

Есть 4 варианта для работы с картами Bing, как это описано в http://msdn.microsoft.com/en-us/library/dd221354.aspx
В этом примере нам достаточно использовать только справочную службу «ImageryService», адрес которой:

http://dev.virtualearth.net/webservices/v1/imageryservice/im ageryservice.svc?WSDL

Выберите «Добавление ссылки на службу» и нажмите кнопку Go:

После загрузки, увидим, что стали доступны следующие методы:

В моем случае я изменил пространство имен BingMapsImageService как показано на рисунке.

Ну вот, теперь мы можем импортировать его в нашем коде.

Imports Tutorial52.BingMapsImageryService

Таким образом, в нашем коде мы теперь будем иметь доступ к служебной информации Bing Maps.

Парочка последних замечаний:

1) Пример на http://msdn.microsoft.com/en-us/library/dd221354.aspx основан на приложениях WPF. Заметим, что в этом руководстве до сих пор мы рассматривали приложения Windows Forms, а не WPF.

В коде примера следует заменить метод BitmatImage на MemoryStream.

2) В том же примере следует изменить:

Dim imageryService As New ImageryServiceClient()

на

Dim imageryService As New ImageryServiceClient("BasicHttpBinding_IImageryService")

3) Опять же в примере MSDN, преобразование широты и долготы в методе GetImagery происходит неправильно, хотя я думаю, это все-таки связано с моими региональными настройками на компьютере.

В моем случае, нужно перейти к десятичной запятой, а не точке, так как это значение:
40.452 после обработки GetImagery превращается в 40452, что является неверным значением для широты и долготы.

Итак, после этих поправок примера MSDN можно получить что-то, вроде такого:

Вы также можете изменять масштаб и тип карты:

Хорошая статьяПлохая статья 0
   |    Опубликовано: Февраль, 23 2012г.    |    Автор: Михаил Стадник

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