1 (изменено: xsanekk, 2014-05-21 14:58:16)

Тема: VBA: Поиск геокоординат по данным в EXCEL

Добрый день. Уважаемые знатоки прошу подсказать как можно реализовать поиск координат в Excel через яндекс.карты

В Excel есть столбец с адресом, необходимо выполнить запрос к API яндекс, что бы в соседний столбец вывелись данные координат адреса.

Искал в интернете готовые решения не нашел, изучив немного параметры HTTP-запроса в яндекс картах сделал вот такой код на основе какого то кода найденого в интернете... прошу помочь составить запрос,
например в ячейке есть "Москва, Тверская, улица, 7" и vba делает запрос http://geocode-maps.yandex.ru/1.x/?geocode=Москва,+Тверская,+дом+7

Option Explicit

Function getYandexMapsGeocode(sAddr As String) As String

Dim xhrRequest As XMLHTTP60
Dim sQuery As String
Dim domResponse As DOMDocument60
Dim LatLng As IXMLDOMNode

getYandexMapsGeocode = ""

Set xhrRequest = New XMLHTTP60
sQuery = "http://geocode-maps.yandex.ru/1.x/?geocode="
sQuery = sQuery & Replace(sAddr, " ", "+")
xhrRequest.Open "GET", sQuery, False
xhrRequest.send

Set domResponse = New DOMDocument60
domResponse.LoadXML xhrRequest.responseText

Set LatLng = domResponse.SelectSingleNode("/ymaps/GeoObjectCollection/featureMember/GeoObject/Point/pos")

getYandexMapsGeocode = LatLng.Text

Dim d As Date
d = DateAdd("s", 1, Now)
Do While Now < d
DoEvents
Loop

End Function

2 (изменено: omegastripes, 2014-05-22 17:26:43)

Re: VBA: Поиск геокоординат по данным в EXCEL

Проверял на Excel 2003 SP3 - что-то непонятное с ранним связыванием и Xpath . Но вот так вполне себе даже работает:

Function getYandexMapsGeocode(sAddr As String) As String
    
    ' Tools - References - Microsoft XML, v3.0
    Dim oXhr As XMLHTTP
    Dim sQuery As String
    Dim oXml As DOMDocument
    Dim oLatLng As IXMLDOMNode
    
    getYandexMapsGeocode = ""
    Set oXhr = CreateObject("Microsoft.XMLHTTP")
    sQuery = "http://geocode-maps.yandex.ru/1.x/?geocode="
    sQuery = sQuery & Replace(sAddr, " ", "+")
    sQuery = sQuery & "&results=1"
    oXhr.Open "GET", sQuery, False
    oXhr.send
    Set oXml = oXhr.responseXML
    Set oLatLng = oXml.getElementsByTagName("pos")(0)
    getYandexMapsGeocode = oLatLng.Text
    
End Function
Щт Уккщк Куыгьу Туче

3 (изменено: xsanekk, 2014-05-22 09:14:18)

Re: VBA: Поиск геокоординат по данным в EXCEL

Спасибо большое! Все работает супер! А как можно перевернуть Долготу и широту и поставить между ними запятую то есть вид такой должен быть: "Широта, Долгота", а то получается наоборот, попробую сам разобраться...

4 (изменено: xsanekk, 2014-05-22 09:29:02)

Re: VBA: Поиск геокоординат по данным в EXCEL

Вышел из ситуации вот такой формулой:

=СЦЕПИТЬ(ПРАВСИМВ(getYandexMapsGeocode(A1);9);", ";ЛЕВСИМВ(getYandexMapsGeocode(A1);9))

5

Re: VBA: Поиск геокоординат по данным в EXCEL

xsanekk пишет:

Вышел из ситуации вот такой формулой:

=СЦЕПИТЬ(ПРАВСИМВ(getYandexMapsGeocode(A1);9);", ";ЛЕВСИМВ(getYandexMapsGeocode(A1);9))

Не совсем рациональное решение - происходит лишний вызов функции. Добавил Split для перестановки долготы и широты, и DoEvents, чтобы книга не подвисала:

Function getYandexMapsGeocode(sAddr As String) As String
    
    ' Tools - References - Microsoft XML, v3.0
    Dim oXhr As XMLHTTP
    Dim sQuery As String
    Dim oXml As DOMDocument
    Dim oLatLng As IXMLDOMNode
    Dim arrLatLng() As String
    
    getYandexMapsGeocode = ""
    Set oXhr = CreateObject("Microsoft.XMLHTTP")
    sQuery = "http://geocode-maps.yandex.ru/1.x/?geocode="
    sQuery = sQuery & Replace(sAddr, " ", "+")
    sQuery = sQuery & "&results=1"
    oXhr.Open "GET", sQuery, True
    oXhr.send
    Do Until oXhr.readyState = 4
        DoEvents
    Loop
    Set oXml = oXhr.responseXML
    Set oLatLng = oXml.getElementsByTagName("pos")(0)
    arrLatLng = Split(oLatLng.Text)
    getYandexMapsGeocode = arrLatLng(1) & ", " & arrLatLng(0)
    
End Function
Щт Уккщк Куыгьу Туче