Прочитайте GPS для доступа с помощью VBA и сравните - PullRequest
0 голосов
/ 22 июня 2011

Я пробовал поискать в Google, но мне повезло - я хочу использовать VBA для считывания координат с последовательного ключа GPS (или телефона Android с Bluetooth, имитирующего первый), записать запись о посещении и найти ближайшая совпадающая запись на столе наших клиентов. Кто-нибудь видел скрипт с открытым исходным кодом, который позволит это?

Заранее спасибо. PG

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

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

Поиск долготы и широты адресов ваших клиентов:
Я недавно опубликовал вопрос о SO, спрашивающий, как получить GPS-координаты для адреса. Вы можете увидеть этот вопрос здесь. Здесь на самом деле есть две функции: одна для использования Google Maps API, а другая - для использования rpc.geocoder.us. Сделайте ваш выбор. Просто знайте, что у каждого из них есть ограничения. У Google есть лицензионные ограничения, а также максимальное количество запросов в день. Geocoder.us имеет ограничение в один запрос каждые 15 секунд, и я не помню, каково их максимальное количество запросов в день, если у них даже есть ограничение.

Очевидно, вам необходимо заранее получить долготу и широту для ваших адресов и сохранить эту информацию вместе с адресом. Возможно, вы могли бы попытаться придумать почтовый индекс для региона и найти адреса по нему, но это может быть ужасно неточно в растянувшихся городских районах, особенно если у вас много клиентов, сосредоточенных в одном почтовом индексе. Вам нужно будет посоветоваться с Тони и запросить данные GPS-координат с помощью оператора «промежуточный», чтобы получить адреса в непосредственной близости.

Получение данных GPS с устройства GPS
Как уже указывал Тони, вам нужно использовать что-то вроде элемента управления ActiveX, DLL или API-вызова для последовательной связи с вашим устройством GPS. В прошлом я использовал элемент управления ActiveX от MS для получения данных GPS, и он работал удовлетворительно.

Я не знаю, где мой код для получения входящих данных с устройства GPS. Это не совсем тривиально, если вы никогда не программировали последовательную связь раньше. Обычно у вас есть событие OnComm, которое запускает входящие данные. Если я правильно помню, вы выполняете цикл до тех пор, пока не будет найден код или бит EOF (конец файла), который указывает на конец потока данных. Если вы используете MS Communications Communications, вы можете увидеть пример кода здесь: http://support.microsoft.com/kb/194922

Я думаю, что мне пришлось использовать 4800 в моих настройках вместо 9600, но ваши требования могут отличаться в зависимости от того, какой тип устройства вы используете.

Извлечение нужных данных из входящих данных GPS
Шаг второй - извлечь нужные данные из входящих данных GPS. Вы можете даже обнаружить, что вам нужно изменить его, чтобы он соответствовал сохраненным данным GPS (см. Ниже).

В моих примерах предложений NMEA (выше) значения Долгота и Широта представлены в следующем формате:

ddmm.mmmm  

Для некоторых программ или API вам, возможно, придется преобразовать его в градусы. Градусы или, иначе говоря, в dd.dddd. Формула для его преобразования:

dd.dddd = ddd + mm.mmmm/60

Так, например, если мы хотим преобразовать данные моего примера выше в точную долготу и широту в градусах, вот как это будет выглядеть:

3731.9404  ----> 37 + 31.9404/60 = 37.53234 degrees
10601.6986 ----> 106 + 1.6986/60 = 106.02831 degrees

Вот некоторые функции, которые я написал в 2007 году для извлечения определенных частей данных из предложения NMEA:

Public Function ExtractLatitude(strNMEAString As String, Optional strNMEAStringType As String = "GPRMC") As String
    'This function extracts the latitude from an NMEA string and converts it to Decimal Degrees (as a string).
    'To use this function you must specify what string type you are passing in, either GPRMC or GPGGA
    Dim aryNMEAString() As String
    aryNMEAString() = Split(strNMEAString, ",")
    Dim dblMinutes As Single, dblLatitude As Single

    Select Case strNMEAStringType

        Case "GPRMC"
            'Latitude is the Number 3 place in the array (4th place in the string)
            If aryNMEAString(2) = "A" Then 'A represents a valid string
                dblMinutes = (CDbl(Mid(aryNMEAString(3), 3, 7)) / 60)
                dblLatitude = CDbl(Left(aryNMEAString(3), 2)) + dblMinutes
                ExtractLatitude = CStr(dblLatitude)
            End If

        Case "GPGGA"
            'Latitude is the Number 2 place in the array (3rd place in the string)
            If CDbl(aryNMEAString(2)) <> 0 Then 'If string is invalid it will be 0
                dblMinutes = (CDbl(Mid(aryNMEAString(2), 3, 7)) / 60)
                dblLatitude = CDbl(Left(aryNMEAString(2), 2)) + dblMinutes
                ExtractLatitude = CStr(dblLatitude)
            End If
     End Select
End Function



Public Function ExtractLongitude(strNMEAString As String, Optional strNMEAStringType As String = "GPRMC") As String
    'This function extracts the longitude from an NMEA string and converts it to Decimal Degrees (as a string).
    'To use this function you must specify what string type you are passing in, either GPRMC or GPGGA
    Dim aryNMEAString() As String
    aryNMEAString() = Split(strNMEAString, ",")
    Dim dblMinutes As Single, dblLongitude As Single

    Select Case strNMEAStringType

        Case "GPRMC"
            'Latitude is the Number 3 place in the array (4th place in the string)
            If aryNMEAString(2) = "A" Then
                dblMinutes = (CDbl(Mid(aryNMEAString(5), 4, 7)) / 60)
                dblLongitude = CDbl(Left(aryNMEAString(5), 3)) + dblMinutes
                ExtractLongitude = CStr(dblLongitude)
            End If

        Case "GPGGA"
            'Latitude is the Number 2 place in the array (3rd place in the string)
            If CDbl(aryNMEAString(4)) <> 0 Then
                dblMinutes = (CDbl(Mid(aryNMEAString(4), 4, 7)) / 60)
                dblLongitude = CDbl(Left(aryNMEAString(4), 3)) + dblMinutes
                ExtractLongitude = CStr(dblLongitude)
            End If
    End Select
End Function



Public Function ExtractSpeed(strGPRMC As String) As Integer
    'Expects a GPRMC NMEA Sentence
    Dim aryGPRMC() As String, dblSpeed As Double
    aryGPRMC() = Split(strGPRMC, ",")
    If aryGPRMC(7) <> "" Then dblSpeed = CDbl(aryGPRMC(7))
    'Convert knots to MPH
    ExtractSpeed = CInt(dblSpeed * 1.15077945)
End Function



Public Function ExtractHeading(strGPRMC As String) As Double
    'Expects a GPRMC NMEA Sentence
    Dim aryGPRMC() As String
    aryGPRMC() = Split(strGPRMC, ",")
    If aryGPRMC(8) <> "" Then ExtractHeading = CDbl(aryGPRMC(8))
End Function



Public Function ExtractSatelliteCount(strGPGGA As String) As Integer
    'Expects a GPGGA NMEA Sentence
    Dim aryGPGGA() As String
    aryGPGGA() = Split(strGPGGA, ",")
    ExtractSatelliteCount = CInt(aryGPGGA(7))
End Function
0 голосов
/ 22 июня 2011

Данные о последовательном порте см. На странице Связь через последовательный порт на моем веб-сайте. Затем вы можете записывать записи в таблицу с помощью запроса SQL Insert или набора записей DAO с AddNew. Однако для нахождения ближайшей подходящей записи, вероятно, потребуется использование геометрии, чтобы выяснить, как читать таблицу в поисках ближайшего местоположения, которое мне пришлось бы освежить в моей памяти в отношении точных необходимых уравнений.

Я также думаю, что для ускорения поиска вы можете индексировать широту и долготу и начать поиск с ближайших широт / долгот. То есть ограничить начальную запись, установленную на плюс / минус, например, 0,1 лата / долготы, что, угадав, будет около 10 км / кв.

...