Страницы: 1
RSS
Определение GPS координат по адресу, Google API
 
Доброго времени суток, уважаемые форумчане!

В сети интернет нашел скрипт который определяет координаты по адресу ( http://grindgis.com/software/microsoft-excel/geocoding-excel-and-google )
Единственная проблема в том, что необходимо адрес прописывать на латинице! Прошу помощи адаптировать данную функцию, так что бы адрес можно было прописывать на русском!
Код
Function MyGeocode(address As String) As String 
  Dim strAddress As String 
  Dim strQuery As String 
  Dim strLatitude As String 
  Dim strLongitude As String 
  strAddress = URLEncode(address) 
  'Assemble the query string 
  strQuery = "http://maps.googleapis.com/maps/api/geocode/xml?" 
  strQuery = strQuery & "address=" & strAddress  
  strQuery = strQuery & "&sensor=false" 
  'define XML and HTTP components 
  Dim googleResult As New MSXML2.DOMDocument 
  Dim googleService As New MSXML2.XMLHTTP 
  Dim oNodes As MSXML2.IXMLDOMNodeList 
  Dim oNode As MSXML2.IXMLDOMNode 
  'create HTTP request to query URL - make sure to have 
  'that last "False" there for synchronous operation 
  googleService.Open "GET", strQuery, False 
  googleService.send 
  googleResult.LoadXML (googleService.responseText) 
  Set oNodes = googleResult.getElementsByTagName("geometry") 
  If oNodes.Length = 1 Then 
    For Each oNode In oNodes 
      strLatitude = oNode.ChildNodes(0).ChildNodes(0).Text 
      strLongitude = oNode.ChildNodes(0).ChildNodes(1).Text 
      MyGeocode = strLatitude & "," & strLongitude 
    Next oNode 
  Else 
    MyGeocode = "Not Found (try again, you may have done too many too fast)" 
  End If 
End Function
 
Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String 
  Dim StringLen As Long: StringLen = Len(StringVal) 
  If StringLen>0 Then 
    ReDim result(StringLen) As String 
    Dim i As Long, CharCode As Integer 
    Dim Char As String, Space As String 
    If SpaceAsPlus Then Space = "+" Else Space = "%20" 
    For i = 1 To StringLen 
      Char = Mid$(StringVal, i, 1)   
      CharCode = Asc(Char) 
      Select Case CharCode 
      Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126 
        result(i) = Char 
      Case 32 
        result(i) = Space 
      Case 0 To 15 
        result(i) = "%0" & Hex(CharCode) 
      Case Else 
        result(i) = "%" & Hex(CharCode) 
      End Select 
    Next i 
    URLEncode = Join(result, "") 
  End If 
End Function 
Спасибо!

P.S. На форуме есть примеры с использованием Яндекса, и в тоже время интересует именно Гугл :)
Изменено: Кирилл - 30.11.2016 17:34:30
 
Доброе время суток
Например, так
Код
https://maps.googleapis.com/maps/api/geocode/xml?latlng=59.86,30.49&language=ru

Успехов.
 
Андрей VG, спасибо за идею, и все же что-то не то....

Пробовал и так
Код
strQuery = "https://maps.googleapis.com/maps/api/geocode/xml?latlng=59.86,30.49&language=ru"
strQuery = strQuery & "address=" & strAddress  
strQuery = strQuery & "&sensor=false"

и так
Код
strQuery = "https://maps.googleapis.com/maps/api/geocode/xml?&language=ru"
strQuery = strQuery & "address=" & strAddress  
strQuery = strQuery & "&sensor=false"
и так
Код
strQuery = "https://maps.googleapis.com/maps/api/geocode/xml?"
strQuery = strQuery & "address=" & strAddress  
strQuery = strQuery & "&sensor=false"
strQuery = strQuery & "&language=ru"

не работает :(

Может быть это, кому то подскажет - http://maps.googleapis.com/maps/api/geocode/xml?address=Krym%20SIMFEROPOL'%20pr-t Pobedy%20245&sensor=false

Кому интересно как подобное реализовано через Яндекс, прикрепил файл.
Изменено: Кирилл - 30.11.2016 17:52:20
 
Должен помочь код ниже, но как его применить пока не могу додуматься....
Код
function RusToURL(txt as string) as string
dim i as long, l as string, t as string
  For i = 1 To Len(txt)
    l = Mid$(txt, i, 1)
    Select Case AscW(l)
        Case Is > 256: t = "%" & Hex(AscW(l) \ 64 + 192) & "%" & Hex(8 * 16 + AscW(l) Mod 64)
        Case 32: t = "+"
        Case Else: t = l
    End Select
  RusToURL = RusToURL & t
  Next
end function
 
Кирилл, извиняюсь за некоторую грубость, но может всё же не заклинать, а API читать вниматеььно? Меньше же времени на борьбу с ляпами уйдёт.
Код
[/http://maps.googleapis.com/maps/api/geocode/xml?address=Krym SIMFEROPOL%27 pr-t Pobedy 245&sensor=false&language=ru
 
Кирилл, зачем вам гугл?
Все есть в яндексе, за исключением  почтовых индексов.
Изменено: Doober - 30.11.2016 19:31:56
 
Кирилл, вставьте вашу функцию из поста 4
и в первом посте замените
Цитата
strAddress = URLEncode(address)
на
Цитата
strAddress = RusToURL(address)
Еще необходимо добавить заголовок для сброса кэша
Код
googleService.setRequestHeader "If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 UTC"
p.s. не любит гугл ваш "Bastion", выдает координаты Ставрополя в целом, ибо адреса такого нет. Сравните :)
Изменено: Jungl - 30.11.2016 22:25:08
 
И ещё раз приношу свои извинения, не до конца понял тему :(  Поможет версия от Игорь RussianStringToURLEncode_New
Успехов.
Изменено: Андрей VG - 30.11.2016 23:21:38
 
Jungl, Андрей VG, Doober, огромное Вам спасибо за оказанную помощь!

P.S.
Doober, яндекс и гугл дают приблизительные координаты по адресам которые не могут найти:
СЕВАСТОПОЛЬ,ул. Чернореченская, 144
АРМЯНСК,ул. Симферопольская, 14
СЕВАСТОПОЛЬ,ул. Челюскинцев, 65
И эти координаты разные для каждого поисковика, а мое дело уже просмотреть и оставить более подходящее, это единственное зачем мне нужен гугль))))

Еще раз Всем спасибо!
Изменено: Кирилл - 01.12.2016 12:59:11
Страницы: 1
Наверх