udmtuno
@udmtuno
Удмуртский краевед

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

Есть эксель табличка с перечнем населенных пунктов Удмуртской республики, более 2000 строк. Мы хотим создать карту топонимов нашего региона, и автоматически нанести их на карту с описанием. Для этого в эту таблицу нужно проставить координаты из яндекса или гугла. А в следующую ячейку проставить описание названия населенного пункта из книги pdf. Книга распознана и все элементы копируются. 5e2c5bcdedfc6864024797.png5e2c5be8a0b0f842077951.png

По ссылке лежат исходники файлов.

Кто сможет подсказать, как мне провернуть эту схему?
Буду очень признателен за помощь.
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 1
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 для выполнения процедуры
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы