• Как добавить координаты населенных пунктов в таблицу и подтянуть (в следующую ячейку) описание из книги pdf?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Данные уже вытащили из PDF, - на мой взгляд самое мерзкое занятие.
    Вы поставили тег Excel, и я полагаю вам нужен запрос на VBA к геокодеру через функцию (в примере указан геокодер Nominatim,на nginx не разворачивается, только на Apache запросы можно делать не чаще в 1 сек).
    Function GetResponse(ByVal request As String, _
      Optional ByVal lowerCase As Boolean = True) As String
      '3456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
      Const TIMEOUT As Double = 6 ' sec
      Const uRL As String = "https://nominatim.osm.org/search?county=RU&format=geocodejson&q="
      
      If lowerCase Then request = LCase(request)
      Static winhttp As Object ' WinHttpRequest
      
      On Error Resume Next
        If winhttp Is Nothing Then
          Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
        Else
          If Not winhttp.Status = 200 Then ' Error
            Set winhttp = Nothing
            End 'or MsgBox "to many requests", vbCritical: Exit Function
          End If
        End If
        
        ' Replace characters to "%"+HEX in UTF-8 (and SPACE to PLUS), except DIGIT (%30-%39), 
        ' except ALPHA (%41-%5A and %61-%7A), hyphen (%2D), period (%2E), underscore (%5F), tilde (%7E)
        request = Replace(Replace(request, ",", ",%20"), "%20-,", "")
        ' The True <- specifies async behaviour
        winhttp.Open "GET", uRL & request, True: DoEvents
        ' Add Headers
        winhttp.SetRequestHeader "Pragma", "private"
        winhttp.SetRequestHeader "Cache-Control", "no-store"
        winhttp.Send: DoEvents
        
        If Not winhttp.WaitForResponse(TIMEOUT) Then
          Debug.Print "timeout", uRL & request: Exit Function
        ElseIf winhttp.Status = 429 Then
          Debug.Print "to many requests", uRL: Exit Function
        End If
        
        GetResponse = winhttp.responseText
        ' Check response length
        If Not Len(GetResponse) > 189 + Len(Replace(request, "%20", " ")) Then
          Debug.Print uRL & request
        End If
    End Function

    В ответе будут объекты в формате GEOJSON, которые также нужно будет обработать. Рекомендую выбирать тип точек по следующим значениям: "city", "town", "village", "hamlet", "isolated_dwelling", "locality".

    Если карта будет интерактивная, рекомендую использовать плагин Leaflet (не лагает как Гугл. Кстати, к геокодеру Гуглу можно обращаться руками через сайт).

    +
    Как использовать отладчик:
    1. Открыть MS Excel
    2. Открыть VBA в приложении (Alt+F11)
    3. Выбирать в меню Insert -> Module
    4. Скопировать функцию, и написать её вызов в отдельной процедуре
    5. Нажать F5 для выполнения процедуры
    Ответ написан
    1 комментарий