Программный интерфейс для доступа к данным мониторинга
Для решения задач интеграции с различными системами автоматизированного учета автотранспорта
в «Навигаторе+» реализован программный интерфейс, основанный на компонентной модели
объекта (COM), а именно — автоматный сервер, реализующий COM-интерфейс IDispatch.
С помощью этого интерфейса любая внешняя программа, поддерживающая OLE-технологию
автоматного контейнера, может получить доступ к информации о перемещениях и свойствах
транспортных средств, о посещении контрольных точек, о расходе топлива и т.п. В
настоящее время практически все известные средства разработки приложений для автоматизации
деятельности предприятий являются автоматными контейнерами — MS Excel, MS Word,
MS Access, 1C, и др. Сюда отностится любое средство автоматизации, включающее в
себя Visual Basic, поскольку последний, помимо всего прочего, является и автоматным
контейнером. В настоящем разделе описаны методы, реализованные в программном интерфейсе
«Навигатора+» и приведены примеры их использования.
Примеры использования методов реализованы на MS Visual Basic для MS Excel.
Конструирование
Создание объекта класса GisDatabase
Синтаксис (Visual Basic) |
CreateObject ("NMap.GisDatabaes")
|
Параметры
- NMap.GisDatabase
- Имя компонента OLE.
Возвращаемое значение
- Ссылка на созданный объект, реализующий интерфейс IDispatch
- База данных успешно октрыта
Описание
Для использования методов объекта GisDatabase необходимо сначала его создать. Для
этого служит стандартный метод CreateObject реализующего технологию автоматного
контейнера языка Visual Basic. В некоторых других автоматных контейнерах синтаксис
для вызова этого метода может быть другим, например, в 1С вместо CreateObject используется
вызов «СоздатьОбъект», в остальном синтаксис вызова остается таким же.
Для успешного создания объекта NMap.GisDatabase программа мониторинга (NMap.exe)
должна быть предварительно запущена хотя бы один раз, поскольку автоматный сервер,
встроенный в программу мониторинга, должен сообщить подсистеме Windows для поддержки
COM-приложений о реализованных в нем объектах. Информация о реализованных COM-объектах
сохраняется в системном реестре Windows, в разделе HKEY_CLASSES_ROOT. При наличии
ограничений на права доступа к этому разделу реестра для пользовательских приложений
(например, в случае Windows Vista c включенным режимом контроля учетных записей)
может потребоваться однократный запуск программы мониторинга от имени администратора.
ВАЖНО: В процессе использования автоматного интерфейса
сам «Навигатор+» не должен быть запущен.
Пример
|
Sub OpenDatabase()
Dim a As object
Set a = CreateObject ("NMap.GisDatabase")
End Sub
|
GisDatabase::Open
Синтаксис |
BOOL Open (LPCTSTR szDbPath);
|
Параметры
- LPCTSTR szDbPath
- Путь к геоинформационной базе данных. Как правило это путь к каталогу, в который был установлен «Навигатор+»
Возвращаемое значение
- TRUE
- База данных успешно октрыта
- FALSE
- Базу данных открыть не удалось. Проверьте, правильно ли указан путь, существует ли в нем подкаталог Gps, работает ли «Навигатор+».
Описание
Сразу после создания объкта класса GisDatabase необходимо вызвать эту функцию. Из
указанного в качестве параметра каталога метод Open загружает служебную ифнформацию,
содержащуюся в картографической базе данных, затем пытается найти подкаталог Gps
и файл firms.gps в нем и считывает из последнего информацию о зарегистрированных
транспортных средствах и имеющихся контрольных точках. После успешного открытия
базы данных можно вызывать другие методы класса GisDatabase.
ВАЖНО: В процессе использования автоматного интерфейса
сам «Навигатор+» не должен быть запущен.
Пример
|
Sub OpenDatabase()
Dim a As object
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
End Sub
|
Доступ к объектам мониторинга
GisDatabase::GetGroupsCount
Синтаксис |
long GetGroupsCount ();
|
Возвращаемое значение
- Метод возвращает количество зарегистрированных групп транспортных средств. В случае ошибки возвращается 0.
Описание
Транспортные средства, отслеживаемые системой мониторинга «Навигатор+», объединяются
в группы. Схема работы предполагает наличие хотя бы одной группы. Полученное значение
можно использовать для последовательного просмотра всех групп транспортных средств.
Пример
|
Sub TestGetGroups ()
Dim a As object
Dim nGoups As Integer
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Let nGroups = a.GetGroupsCount ()
For i=0 To nGroups-1
strGroupName = a.GetGroupName (i)
Next i
End Sub
|
GisDatabase::GetRoversCount
Синтаксис |
long GetRoversCount (long nGroupIndex);
|
Параметры
- long nGroupIndex
- Порядковый номер группы транспортных средств начиная с 0. Нумерация начинается с 0, максимально допустимый порядковый номер на единицу меньше количества групп.
Возвращаемое значение
- Метод возвращает количество транспортных средств, принадлежащих группе. В случае ошибки возвращается 0.
Описание
Метод следует использовать для последовательного доступа к транспортным средствам группы.
Пример
|
Sub TestGetRovers ()
Dim a As object
Dim nGoups As Integer
Dim nRovers As Integer
Dim nGroup As Integer
Dim nRover As Integer
Dim nRoverID As Integer
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Let nGroups = a.GetGroupsCount ()
For nGroup=0 To nGroups-1
nRovers = a.GetRoversCount (nGroup)
For nRover=0 To nRovers-1
nRoverID = a.GetRoverID (nGroup, nRover)
Next nRover
Next nGroup
End Sub
|
GisDatabase::GetRoverID
Синтаксис |
long GetRoverID (long nGroupIndex, long nRoverIndex);
|
Параметры
- long nGroupIndex
- Порядковый номер группы транспортных средств начиная с 0. Нумерация начинается с 0, максимально допустимый порядковый номер на единицу меньше количества групп.
- long nRoverIndex
- Порядковый номер транспортного средства в группе начиная с 0. Нумерация начинается
с 0, максимально допустимый порядковый номер на единицу меньше количества транспортных
средств в группе.
Возвращаемое значение
- Метод возвращает идентификтор GPS/GPRS модуля. В случае ошибки возвращается 0.
Описание
Идентификатор GPS/GPRS модуля, полученный с помощью этого метода, можно использовать для получения остальной информации о нем, включая пробег за преиод, расход топлива и т.п.
Пример
|
Sub TestGetRoverID ()
Dim a As object
Dim nGoups As Integer
Dim nRovers As Integer
Dim nGroup As Integer
Dim nRover As Integer
Dim nRoverID As Integer
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Let nGroups = a.GetGroupsCount ()
For nGroup=0 To nGroups-1
nRovers = a.GetRoversCount (nGroup)
For nRover=0 To nRovers-1
nRoverID = a.GetRoverID (nGroup, nRover)
Next nRover
Next nGroup
End Sub
|
GisDatabase::GetRoverName
Синтаксис |
BSTR GetRoverName (long nRoverID);
|
Параметры
- long nRoverID
- Идентификатор GPS/GPRS модуля.
Возвращаемое значение
- Метод возвращает имя, присвоенное транспортному средству с данным идентификатором.
Описание
Имя — произвольная текстовая строка. Можно использовать его в различных отчетах.
Пример
|
Sub TestGetRoverName ()
Dim a As object
Dim nGoups As Integer
Dim nRovers As Integer
Dim nGroup As Integer
Dim nRover As Integer
Dim nRoverID As Integer
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Let nGroups = a.GetGroupsCount ()
Range ("A1").Offset (0, 0) = "Группа"
Range ("A1").Offset (0, 1) = "Идентификатор GPS/GPRS модуля"
Range ("A1").Offset (0, 2) = "Транспортное средство"
nRow = 1
For nGroup=0 To nGroups-1
nRovers = a.GetRoversCount (nGroup)
Range ("A1").Offset (nRow, 0) = strGroupName
nRow = nRow + 1
For nRover=0 To nRovers-1
nRoverID = a.GetRoverID (nGroup, nRover)
strName = a.GetRoverName (nRoverID)
Range ("A1").Offset (nRow, 1) = nRoverID
Range ("A1").Offset (nRow, 2) = strName
nRow = nRow + 1
Next nRover
Next nGroup
End Sub
|
GisDatabase::GetRoverRun
Синтаксис |
double GetRoverRun (long nRoverID, DATE tFrom, DATE tUpTo);
|
Параметры
- long nRoverID
- Идентификатор GPS/GPRS модуля.
- DATE tFrom
- Начало периода измерения пробега.
- DATE tUpTo
- Конец периода измерения пробега.
Возвращаемое значение
- Пробег в километрах.
Описание
Пробег вычисляется на основании загруженных в локальную базу данных траекторий.
Если какие-то фрагменты траекторий для заданного периода еще не загружены, они не
будут учтены, и вычисленный пробег не будет соответствовать реальному. Для одного
и того же периода значение пробега должно совпадать с пробегом, вычисленным с помощью
встроенных в «Навигатор+» отчетов.
Пример
|
Sub TestGetRoverRun ()
Dim a As object
Dim nGoups As Integer
Dim nRovers As Integer
Dim nGroup As Integer
Dim nRover As Integer
Dim nRoverID As Integer
Dim tToday As Date
Dim tTonight As Date
Dim dRun As Double
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
Let nGroups = a.GetGroupsCount ()
Range ("A1").Offset (0, 0) = "Группа"
Range ("A1").Offset (0, 1) = "Транспортное средство"
Range ("A1").Offset (0, 2) = "Пробег"
nRow = 1
For nGroup=0 To nGroups-1
strGroupName = a.GetGroupName (nGroup)
Range ("A1").Offset (nRow, 0) = strGroupName
nRow = nRow + 1
nRovers = a.GetRoversCount (nGroup)
For nRover=0 To nRovers-1
nRoverID = a.GetRoverID (nGroup, nRover)
dRun = a.GetRoverRun (nRoverID, tToday, tTonight)
Range ("A1").Offset (nRow, 1) = a.GetRoverName (nRover)
Range ("A1").Offset (nRow, 2) = dRun
nRow = nRow + 1
Next nRover
Next nGroup
End Sub
|
Анализ посещений контрольных точек
GisDatabase::GetCtrlPtName
Синтаксис |
BSTR GetCtrlPtName (long nPointID);
|
Параметры
- long nPointID
- Идентификатор контрольной точки.
Возвращаемое значение
- Имя контрольной точки с данным идентификатором.
Описание
Метод позволяет получить имя контрольной точки для заданного идентификатора. Идентификатор контрольной точки можно увидеть впрограмме мониторинга, в окне ее свойств.
Пример
|
Sub TestVisits ()
Dim a As object
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Range ("A1").Offset (1, 1) = a.GetCtrlPtName (14)
End Sub
|
GisDatabase::DetectVisits
Синтаксис |
long DetectVisits (long nRoverID, long nCtrlPtID, DATE tFrom, DATE tUpTo, long nMinVisitTime);
|
Параметры
- long nRoverID
- Идентификатор GPS/GPRS модуля.
- long nCtrlPtID
- Идентификатор контрольной точки. Его можно увидеть в окне свойств контрольной точки.
- DATE tFrom
- Начало периода измерения пробега.
- DATE tUpTo
- Конец периода измерения пробега.
- long nMinVisitTime
- Минимальное время пребывания на точке в минутах, при котором детектируется посещение.
Возвращаемое значение
- Количество посещений контрольной точки указанным транспортным средством за указанный период.
Описание
Для детектирования посещений контрольной точки транспортным средством сначала вызывается функция DetectVisits, которая возвращает количество продетектированных посещений. Затем, с помощью методов GetVisitIn, GetVisitOut можно получить информацию о каждом из детектированных посещений. Параметр nMinVisitTime позволяет задает минимальное время пребывания, которое считается посещением. Например, 5 минут. В процессе детектирования посещений используются уже загруженные в локальную геоинформационную базу данных траектории транспортного средства. Если какие-то данные еще не загружены, информация о посещениях будет не полной.
Пример
|
Sub TestVisits ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
Let nVisits = a.DetectVisits (22873, 10, tToday, tTonight, 5)
Range ("A1").Offset (0, 0) = "Номер посещения"
Range ("A1").Offset (0, 1) = "Прибыл"
Range ("A1").Offset (0, 2) = "Убыл"
For nVisit=0 To nVisits-1
tIn = a.GetVisitIn (nVisit)
tOut = a.GetVisitOut (nVisit)
Range ("A1").Offset (nVisit+1, 0) = nVisit
Range ("A1").Offset (nVisit+1, 1) = tIn
Range ("A1").Offset (nVisit+1, 2) = tOut
Next nVisit
End Sub
|
GisDatabase::GetVisitIn, GetVisitOut, GetVisitName, HasVisitIn, HasVisitOut
Синтаксис |
BOOL HasVisitIn (long nVisit);
DATE GetVisitIn (long nVisit);
BOOL HasVisitOut (long nVisit);
DATE GetVisitOut (long nVisit);
BSTR GetVisitName (long nVisit);
|
Параметры
- long nVisit
- Порядковый номер посещения контрольной точки начиная с 0.
Возвращаемое значение
- HasVisitIn
- TRUE, если было определено время прибытия. FALSE, если транспортное средство уже находилось на контрольной точке до начала периода измерений.
- GetVisitIn
- Время прибытия на контрольную точку.
- HasVisitOut
- TRUE, если было определено время ухода. FALSE, если транспортное средство на конец периода измерений все еще находилось на контрольной точке.
- GetVisitOut
- Время ухода с контрольной точки.
- GetVisitName
- Название контрольной точки.
Описание
Для детектирования посещений контрольной точки транспортным средством сначала вызывается функция DetectVisits, которая возвращает количество продетектированных посещений. Затем, с помощью методов HasVisitIn, GetVisitIn, HasVisitOut, GetVisitOut, GetVisitName для каждого посещения можно получить информацию о времени прибытия и ухода и о названии контрольной точки. Если индекс посещения nVisit меньше 0 либо больше или равен количеству посещений функции возвращают 0. Если для данного посещения не существует времени прибытия (транспортное средство на начало периода детектирования посещений уже находилось на контрольной точке) функция GetVisitIn возвращает 0. Если для данного посещения не существует времени ухода (транспортное средство на конец периода детектирования посещений все еще находилось на контрольной точке) функция GetVisitOut возвращает 0.
Пример
|
Sub TestVisits ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
Let nVisits = a.DetectVisits (22873, 10, tToday, tTonight, 5)
Range ("A1").Offset (0, 0) = "Номер посещения"
Range ("A1").Offset (0, 1) = "Прибыл"
Range ("A1").Offset (0, 2) = "Убыл"
For nVisit=0 To nVisits-1
Range("A1").Offset(nRow, 0) = nVisit
Range("A1").Offset(nRow, 1) = a.GetVisitName(nVisit)
If a.HasVisitIn(nVisit) Then
Range("A1").Offset(nRow, 2) = a.GetVisitIn(nVisit)
End If
If a.HasVisitOut(nVisit) Then
Range("A1").Offset(nRow, 3) = a.GetVisitOut(nVisit)
End If
nRow = nRow + 1
Next nVisit
End Sub
|
GisDatabase::AddRoutePoint
Синтаксис |
BOOL AddRoutePoint (long nCtrlPointID);
|
Параметры
- long nCtrlPointID
- Идентификатор контрольной точки
Возвращаемое значение
- В случае успешного добавления контрольной точки к маршруту функция возвращает TRUE. Если контрольная точка с заданным идентификатором не найдена возвращается FALSE
Описание
Для анализа посещения транспортным средством нескольких контрольных точек можно использовать группу методов для работы с маршрутами. Сначала необходимо выбрать множество контрольных точек используя функцию AddRoutePoint, затем вызвать метод DetectRouteVisits, а затем можно использовать методы GetVisitIn, GetVisitOut, GetVisitName для получения информации о посещении выбранного множества контрольных точек.
Пример
|
Sub TestRoute ()
Dim a As Object
Dim tToday As Date
Dim tTomorrow As Date
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Call a.ClearRoute
a.AddRoutePoint (1)
a.AddRoutePoint (2)
a.AddRoutePoint (3)
tToday = CDate(FormatDateTime("08.12.2010", vbShortDate)) ' Now, vbShortDate))
tTomorrow = CDate(FormatDateTime("08.12.2010", vbShortDate) & " 23:59:59")
'
nCount = a.DetectRouteVisits(5, tToday, tTomorrow, 5)
nRow = 1
For nVisit = 0 To nCount - 1
Range("A1").Offset(nRow, 1) = a.GetVisitName(nVisit)
If a.HasVisitIn(nVisit) Then
Range("A1").Offset(nRow, 2) = a.GetVisitIn(nVisit)
End If
If a.HasVisitOut(nVisit) Then
Range("A1").Offset(nRow, 3) = a.GetVisitOut(nVisit)
End If
nRow = nRow + 1
Next nVisit
End Sub
|
GisDatabase::ClearRoute
Синтаксис |
void ClearRoute ();
|
Описание
Метод очищает список выбранных ранее контрольных точек.
Пример
|
Sub TestRoute ()
Dim a As Object
Dim tToday As Date
Dim tTomorrow As Date
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("c:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Call a.ClearRoute
a.AddRoutePoint (1)
a.AddRoutePoint (2)
a.AddRoutePoint (3)
tToday = CDate(FormatDateTime("08.12.2010", vbShortDate)) ' Now, vbShortDate))
tTomorrow = CDate(FormatDateTime("08.12.2010", vbShortDate) & " 23:59:59")
'
nCount = a.DetectRouteVisits(5, tToday, tTomorrow, 5)
nRow = 1
For nVisit = 0 To nCount - 1
Range("A1").Offset(nRow, 1) = a.GetVisitName(nVisit)
If a.HasVisitIn(nVisit) Then
Range("A1").Offset(nRow, 2) = a.GetVisitIn(nVisit)
End If
If a.HasVisitOut(nVisit) Then
Range("A1").Offset(nRow, 3) = a.GetVisitOut(nVisit)
End If
nRow = nRow + 1
Next nVisit
End Sub
|
GisDatabase::DetectRouteVisits
Синтаксис |
long DetectRouteVisits(long nRoverID, DATE tFrom, DATE tUpTo, long nMinVisitTime);
|
Параметры
- long nRoverID
- Идентификатор ровера
- DATE tFrom
- Дата и время начала интервала наблюдения
- DATE tUpTo
- Дата и время конца интервала наблюдения
- long nMinVisitTime
- Минимальная длительность пребывания на контрольной точке в минутах, которая считается посещением
Возвращаемое значение
- Количество посещений точек маршрута
Описание
Для анализа посещения транспортным средством нескольких контрольных точек можно использовать группу методов для работы с маршрутами. Сначала необходимо выбрать множество контрольных точек используя функцию AddRoutePoint, затем вызвать метод DetectRouteVisits, а затем можно использовать методы GetVisitIn, GetVisitOut, GetVisitName для получения информации о посещении выбранного множества контрольных точек.
Пример
|
Sub TestRoute ()
Dim a As Object
Dim tToday As Date
Dim tTomorrow As Date
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("c:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
Call a.ClearRoute
a.AddRoutePoint (1)
a.AddRoutePoint (2)
a.AddRoutePoint (3)
tToday = CDate(FormatDateTime("08.12.2010", vbShortDate)) ' Now, vbShortDate))
tTomorrow = CDate(FormatDateTime("08.12.2010", vbShortDate) & " 23:59:59")
'
nCount = a.DetectRouteVisits(5, tToday, tTomorrow, 5)
nRow = 1
For nVisit = 0 To nCount - 1
Range("A1").Offset(nRow, 1) = a.GetVisitName(nVisit)
If a.HasVisitIn(nVisit) Then
Range("A1").Offset(nRow, 2) = a.GetVisitIn(nVisit)
End If
If a.HasVisitOut(nVisit) Then
Range("A1").Offset(nRow, 3) = a.GetVisitOut(nVisit)
End If
nRow = nRow + 1
Next nVisit
End Sub
|
Анализ истории перемещений транспортных средств
GisDatabase::DetectSegments
Синтаксис |
long DetectSegments (long nRoverID, DATE tFrom, DATE tUpTo);
|
Параметры
- long nRoverID
- Идентификатор ровера
- DATE tFrom
- Дата и время начала интервала наблюдения
- DATE tUpTo
- Дата и время конца интервала наблюдения
Возвращаемое значение
- Количество сегментов (стоянок и интревалов движения) в интервале наблюдения
Описание
Для анализа истории перемещений транспортного средства на предмет наличия стоянок и интервалов движения, сначала вызывается функция DetectSegments, которая возвращает количество найденных сегментов в пределах заданного интервала наблюдения. Затем, с помощью методов GetSegmentType, GetSegmentIn, GetSegmentOut, GetSegmentLocation, GetSegmentRun для каждого сегмента можно получить информацию о его параметрах.
Пример
|
Sub TestSegments ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
nCount = a.DetectSegments(22873, tToday, tTonight)
Range ("A1").Offset (0, 0) = "Стоянка / Остановка"
Range ("A1").Offset (0, 1) = "Начало"
Range ("A1").Offset (0, 2) = "Конец"
Range ("A1").Offset (0, 3) = "Место стоянки / Пробег"
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Остановка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetSegmentType
Синтаксис |
long GetSegmentType (long nSegment);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0).
Возвращаемое значение
- Тип сегмента: 1 — движение; 2 — стоянка; 0 — тип не определен
Описание
Для анализа истории перемещений транспортного средства на предмет наличия стоянок и интервалов движения, сначала вызывается функция DetectSegments, которая возвращает количество найденных сегментов в пределах заданного интервала наблюдения. Затем, с помощью методов GetSegmentType, GetSegmentIn, GetSegmentOut, GetSegmentLocation, GetSegmentRun для каждого сегмента можно получить информацию о его параметрах.
Пример
|
Sub TestSegments ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
nCount = a.DetectSegments(22873, tToday, tTonight)
Range ("A1").Offset (0, 0) = "Стоянка / Остановка"
Range ("A1").Offset (0, 1) = "Начало"
Range ("A1").Offset (0, 2) = "Конец"
Range ("A1").Offset (0, 3) = "Место стоянки / Пробег"
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Остановка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetSegmentIn GisDatabase::GetSegmentOut
Синтаксис |
DATE GetSegmentIn (long nSegment);
DATE GetSegmentOut (long nSegment);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0).
Возвращаемое значение
- GetSegmentIn
- Время начала сегмента
- GetSegmentOut
- Время конца сегмента
Описание
Для анализа истории перемещений транспортного средства на предмет наличия стоянок и интервалов движения, сначала вызывается функция DetectSegments, которая возвращает количество найденных сегментов в пределах заданного интервала наблюдения. Затем, с помощью методов GetSegmentType, GetSegmentIn, GetSegmentOut, GetSegmentLocation, GetSegmentRun для каждого сегмента можно получить информацию о его параметрах.
Пример
|
Sub TestSegments ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
nCount = a.DetectSegments(22873, tToday, tTonight)
Range ("A1").Offset (0, 0) = "Стоянка / Остановка"
Range ("A1").Offset (0, 1) = "Начало"
Range ("A1").Offset (0, 2) = "Конец"
Range ("A1").Offset (0, 3) = "Место стоянки / Пробег"
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Остановка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetSegmentLocation
Синтаксис |
BSTR GetSegmentLocation (long nSegment);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0).
Возвращаемое значение
- Адрес места стоянки или название ближайшего к месту стоянки населенного пункта
Описание
Для анализа истории перемещений транспортного средства на предмет наличия стоянок и интервалов движения, сначала вызывается функция DetectSegments, которая возвращает количество найденных сегментов в пределах заданного интервала наблюдения. Затем, с помощью методов GetSegmentType, GetSegmentIn, GetSegmentOut, GetSegmentLocation, GetSegmentRun для каждого сегмента можно получить информацию о его параметрах. Метод GetSegmentLocation следует вызывать для интервалов типа 2 (стоянок).
Пример
|
Sub TestSegments ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
nCount = a.DetectSegments(22873, tToday, tTonight)
Range ("A1").Offset (0, 0) = "Стоянка / Остановка"
Range ("A1").Offset (0, 1) = "Начало"
Range ("A1").Offset (0, 2) = "Конец"
Range ("A1").Offset (0, 3) = "Место стоянки / Пробег"
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Остановка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetSegmentRun
Синтаксис |
double GetSegmentRun (long nSegment);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0).
Возвращаемое значение
- Пробег в километрах
Описание
Для анализа истории перемещений транспортного средства на предмет наличия стоянок и интервалов движения, сначала вызывается функция DetectSegments, которая возвращает количество найденных сегментов в пределах заданного интервала наблюдения. Затем, с помощью методов GetSegmentType, GetSegmentIn, GetSegmentOut, GetSegmentLocation, GetSegmentRun для каждого сегмента можно получить информацию о его параметрах. Метод GetSegmentRun следует вызывать для интервалов типа 1 (движение).
Пример
|
Sub TestSegments ()
Dim a As object
Dim nVisits As Integer
Dim nVisit As Integer
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject ("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
nCount = a.DetectSegments(22873, tToday, tTonight)
Range ("A1").Offset (0, 0) = "Стоянка / Остановка"
Range ("A1").Offset (0, 1) = "Начало"
Range ("A1").Offset (0, 2) = "Конец"
Range ("A1").Offset (0, 3) = "Место стоянки / Пробег"
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Остановка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetCloseCtrlPoint
Синтаксис |
long GetCloseCtrlPoint (long nSegment);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0).
Возвращаемое значение
- Идентификатор контрольной точки, если сегмент с номером nSegment является стоянкой, произошедшей в области одной из контрольных точек текущего маршрута. 0 в противном случае.
Описание
Если перед анализом перемещений автомобиля с помощью метода AddRoutePoint задать маршрут, то для каждого «стояночного» сегмента из истории перемещений с помощью меода GetCloseCtrlPoint можно определить, произошла ли эта стоянка в области контрольной точки, или нет. Это позволяет выделить из множества стоянок характерные, например, офис, магазин, склад и т.п.
Пример
|
Sub TestSegments ()
Dim a As Object
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
Call a.ClearRoute
a.AddRoutePoint (1)
a.AddRoutePoint (2)
a.AddRoutePoint (3)
nCount = a.DetectSegments(5, tToday, tTonight)
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Стоянка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
nPointID = a.GetCloseCtrlPoint(nSegment)
If nPointID <> 0 Then
Range("A1").Offset(nRow, 4) = a.GetCtrlPtName(nPointID)
End If
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetSegmentFuelIn, GisDatabase::GetSegmentFuelOut
Синтаксис |
long GetSegmentFuelIn (long nSegment);
long GetSegmentFuelOut (long nSegment);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0).
Возвращаемое значение
- Уровень топлива на начало (GetSegmentFuelIn) и конец (GetSegmentFuelOut) сегмента в литрах. Если данный сегмент траектории не содержит отсчетов топлива, возвращается -1.
Описание
С помощью этих методов можно получить уровень топлива в баке на начало и конец сегмента
траектории. Для измерения уровня топлива штатный автомобильный датчик подключается
к GPS/GPRS модулю. Поскольку интервал между сообщениями об уровне топлива как правило
больше интервала между сообщениями о координатах и скорости, для некоторых сегментов
траектории уровень топлива может отсутствовать. В этом случае можно использовать
значения уровня топлива из соседних интервалов.
Пример
|
Sub TestSegments ()
Dim a As Object
Dim tToday As Date
Dim tTonight As Date
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open ("C:\NMap") Then
MsgBox "Не удалось открыть геоинформационную базу данных!"
Exit Sub
End If
tToday = CDate(FormatDateTime(Now, vbShortDate))
tTonight = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")
nCount = a.DetectSegments(5, tToday, tTonight)
nRow = 1
For nSegment = 0 To nCount - 1
nSegmentType = a.GetSegmentType(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 0) = "Движение"
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 0) = "Стоянка"
End If
Range("A1").Offset(nRow, 1) = a.GetSegmentIn(nSegment)
Range("A1").Offset(nRow, 2) = a.GetSegmentOut(nSegment)
If nSegmentType = 1 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentRun(nSegment)
ElseIf nSegmentType = 2 Then
Range("A1").Offset(nRow, 3) = a.GetSegmentLocation(nSegment)
End If
nFuelIn = a.GetSegmentFuelIn (nSegment)
If nFuelIn > 0 Then
Range ("A1").Offset (nRow, 4) = nFuelIn
End If
nFuelOut = a.GetSegmentFuelOut (nSegment)
If nFuelOut > 0 Then
Range ("A1").Offset (nRow, 5) = nFuelOut
End If
nRow = nRow + 1
Next nSegment
End Sub
|
GisDatabase::GetSegmentLat, GisDatabase::GetSegmentLon
Синтаксис |
double GetSegmentLat (long nSegment, long nPoint);
double GetSegmentLon (long nSegment, long nPoint);
|
Параметры
- long nSegment
- Номер сегмента (начиная с 0)
- long nPoint
- 0 — Начало сегмента
1 — Конец сегмента
2 — Средняя точка сегмента (широта начальной точки + широта конечной точки) / 2
Возвращаемое значение
- Соответственно широта и долгота характерных точек сегмента движения или стоянки
GisDatabase::GetLastRoverLoc
Синтаксис |
GisEpoch GetLastRoverLoc(int nRoverID)
|
Параметры
- int nRoverID
- Идентификационный номер GPS трекера, установленного на транспортном средстве
Возвращаемое значение
- Последние известные позиция (долгота, широта) и скорость транспортного средства и время их получения.
Пример
|
Sub TestRoverLoc ()
Dim a As Object
Dim e As Object
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("C:\NMap") Then
MsgBox "Can't open database"
Exit Sub
End If
Set e = a.GetLastRoverLoc(120)
Range("A1").Offset(1, 1) = e.t
Range("A1").Offset(2, 1) = e.lat
Range("A1").Offset(3, 1) = e.lon
Range("A1").Offset(4, 1) = e.vel
End Sub
|
GisDatabase::GetEpochCount
Синтаксис |
int GetEpochCount(long nRoverID, DATE tDate);
|
Параметры
- long nRoverID
- Идентификатор GPS/GPRS модуля
- DATE tDate
- Дата
Возвращаемое значение
- Количество эпох GPS/GPRS модуля за указанную дату
GisDatabase::GetEpoch
Синтаксис |
GisEpoch GetEpoch(long nRoverID, DATE tDate, int nEpoch);
|
Параметры
- long nRoverID
- Идентификатор GPS/GPRS модуля
- DATE tDate
- Дата
- int nEpoch
- Номер интересующей эпохи
Возвращаемое значение
- Координаты (долгота, широта) и скорость транспортного средства в указанную эпоху и время этой эпохи.
Пример использования методов GetEpochCount и GetEpoch
Sub GetRoverEpochs()
Dim a As Object
Dim e As Object
Dim epoch As Object
Dim tDate As Date
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("c:\NMap") Then
MsgBox "Не удалось открыть базу данных ГИС"
Exit Sub
End If
nRow = 0
tDate = #5/1/2013#
For nDay = 1 To 30
nEpochCount = a.GetEpochCount(9999, tDate)
For nEpoch = 0 To nEpochCount - 1
Set epoch = a.GetEpoch(9999, tDate, nEpoch)
If epoch.flag = 1 Then
Range("A1").Offset(nRow, 0) = epoch.t
Range("A1").Offset(nRow, 1) = epoch.lat
Range("A1").Offset(nRow, 2) = epoch.lon
Range("A1").Offset(nRow, 3) = epoch.vel
nRow = nRow + 1
End If
Next nEpoch
tDate = tDate + 1
Next nDay
End Sub
|
Получение данных о контрольных точках
GisDatabase::GetCtrlPtGroupsCount
Синтаксис |
int GetCtrlPtGroupsCount();
|
Возвращаемое значение
- Количество групп контрольных точек.
GisDatabase::GetCtrlPtGroupId
Синтаксис |
long GetCtrlPtGroupId(int nCtrlPtGroupIndex);
|
Параметры
- int nCtrlPtGroupIndex
- Индекс группы контрольных точек (начиная с 0).
Возвращаемое значение
- Идентификатор группы контрольных точек c данным индексом.
GisDatabase::GetCtrlPtCount
Синтаксис |
int GetCtrlPtCount(long lGroupID);
|
Параметры
- long lGroupID
- Идентификатор группы контрольных точек.
Возвращаемое значение
- Количество контрольных точек в данной группе
GisDatabase::GetCtrlPtPos
Синтаксис |
GisEpoch GetCtrlPtPos(long lCtrlPtId);
|
Параметры
- long lCtrlPtId
- Идентификатор контрольной точки
Возвращаемое значение
- Координаты (долгота, широта) контрольной точки.
Пример использования указанных методов
Sub EnumCtrlPoints()
Dim a As Object
Dim e As Object
Dim epoch As Object
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("C:\NMap") Then
MsgBox "Не удалось открыть базу данных ГИС"
Exit Sub
End If
nGroups = a.GetCtrlPtGroupsCount()
nRow = 0
For i = 0 To nGroups - 1
lGroupID = a.GetCtrlPtGroupId(i)
nPoints = a.GetCtrlPtCount(lGroupID)
For j = 0 To nPoints - 1
lCtrlPointId = a.GetCtrlPtId(lGroupID, j)
Range("A1").Offset(nRow, 0) = lGroupID
Range("A1").Offset(nRow, 1) = a.GetCtrlPtName(lCtrlPointId)
Set epoch = a.GetCtrlPtPos(lCtrlPointId)
Range("A1").Offset(nRow, 2) = epoch.lat
Range("A1").Offset(nRow, 3) = epoch.lon
nRow = nRow + 1
Next j
Next i
End Sub
|
Редактирование контрольных точек
GisDatabase::CreateCtrlPtGroup
Синтаксис |
long CreateCtrlPtGroup(LPCTSTR strGroupName);
|
Параметры
- LPCTSTR strGroupName
- Имя создаваемой группы контрольных точек.
Возвращаемое значение
- Идентификатор созданной группы контрольных точек.
GisDatabase::CreateCtrlPt
Синтаксис |
long CreateCtrlPt(long lGroupID, LPCTSTR strCtrlPtName, double dLat, double dLon, double dRad, long lColor);
|
Параметры
- long lGroupID
- Идентификатор группы, в которой создается контрольная точка.
- LPCTSTR strCtrlPtName
- Имя создаваемой контрольной точки.
- double dLat
- Широта
- double dLon
- Долгота
- double dRad
- Радиус контрольной области
- long lColor
- Цвет.
Возвращаемое значение
- Идентификатор созданной контрольной точки.
Пример
|
Sub EditCtrlPoints()
Dim a As Object
Dim e As Object
Dim epoch As Object
Dim lColor As Long
Set a = CreateObject("NMap.GisDatabase")
If Not a.Open("C:\NMap") Then
MsgBox "Не удалось открыть базу данных ГИС"
Exit Sub
End If
lGroupID = a.CreateCtrlPtGroup("New group")
If lGroupID = 0 Then
MsgBox "Can't create group"
Exit Sub
End If
lColor = RGB(255, 0, 255)
lCtrlPtId = a.CreateCtrlPt(lGroupID, "New Control Point", 55.99571777, 37.67042542, 500#, lColor)
End Sub
|
GisDatabase::UpdateCtrlPt
Синтаксис |
BOOL UpdateCtrlPt (long lCtrlPtID, LPCTSTR strName, double dLat, double dLon, double dRad, long lColor);
|
Параметры
- long lCtrlPtID
- Идентификатор контрольной точки.
- LPCTSTR strName
- Имя контрольной точки.
- double dLat
- Широта.
- double dLon
- Долгота.
- double dRad
- Радиус контрольной области.
- long lColor
- Цвет.
Возвращаемое значение
- В случае успешного редактирования параметров контрольной точки возвращается TRUE, иначе FALSE.
GisDatabase::DeleteCtrlPt
Синтаксис |
BOOL DeleteCtrlPt (long lCtrlPtID);
|
Параметры
- lCtrlPtID
- Идентификатор контрольной точки
Возвращаемое значение
- В случае успешного удаления контрольной точки TRUE, в противном случае FALSE.