Базы данных
Приложение поддерживает следующие форматы дополнительных баз камер: IGO (предпочтительный), Navitel, Tomtom OV2, Garmin CSV, GPX, KML.
На OV2, CSV, GPX и KML останавливаться не будем, они позволяют передать мало параметров (нет даже направления) и интереса не представляют.
О навителе стоит сказать, что этот формат по структуре ничем не отличается от IGO, за исключением того, как указывается направление камер. В навителе и IGO направления различаются на 180 градусов. В IGO направление камеры - это направление куда едет автомобиль, скорость которого надо проконтролировать. В навителе - "в лицо" этому автомобилю. Для программы, с точки зрения разбора (парсинга) текстового файла, эти два формата одинаковы и дальнейшее описание возможностей формата IGO в той же степени применимо к формату навител.
Формат IGO представляет из себя текстовый файл, в котором каждой точке одна строка. В общем виде, строка выглядит так:
[идентификатор],[долгота],[широта],[тип-камеры],[ограничение],[тип-направления],[направление]
[идентификатор] - необязательный параметр. Может быть целым числом или GUID, взятым в фигурные скобки. Примеры:
4.066639,46.05067,2,0,2,65 // без идентиикатора 123,4.066639,46.05067,2,0,2,65 // целое число {0183c837-70db-4e92-a64f-0009289b1b8d},4.066639,46.05067,2,0,2,65 // GUID
[долгота] и [широта] - задаются в градусах, разделитель целой и дробной всегда точка '.'
[тип-камеры] - целое число, обозначающее тип камеры. Программа поддерживает следующие предопределенные типы:
public enum POITypeCode { // internal use Remover = -2, NotSpecified = -1, Undefined = 0, // IGO standard FixedSpeedCamera = 1, RedlightCamera = 2, RedlightAndSpeedCamera = 3, SectionCamera = 4, PossibleMobileSpeedCamera = 5, // for POIs in existing national databases // speed cameras VariableSpeedCamera = 100001, // mostly UK SectionStart = 100010, // Section___ = average speed SectionFinish = 100011, SectionLegacyVirtualEnd = 100013, SectionSpeed = 100014, // + instant speed SectionSpeedStart = 100015, // + instant speed SectionSpeedFinish = 100016, // + instant speed TunnelSpeedCamera = 100020, TunnelExitSpeedCamera = 100021, RadarDiscriminant = 100030, MultifunctionRadar = 100040, // RadarMultifonctions RadarAutonome = 100050, RadarDeChantier = 100051, Gatso = 100060, // UK StrelkaST = 100070, // SpeedcamOnline.ru StrelkaVideo = 100071, // non-speed cameras DistanceCamera = 100200, ObligatoryStopCamera = 100201, OvertakeCamera = 100202, // Sorpassometro Italy BusLaneControl = 100203, // Corsia preferenziale Italy + Russia bus lane ZTLCamera = 100204, // Zona traffico limitato Italy StopAndParkingCamera = 100205, RailwayCross = 100220, PoliceStation = 100230, TrafficCamera = 100240, WeighInMotion = 100250, FakeSpeedCamera = 100300, ActiveFakeSpeedCamera = 100301, // Fake emitting radio. Germany, Russia // mobiles RadarMobile = 100400, RadarMobileSurPont = 100401, HiddenMobileRadar = 100402, NotConstantPoliceLocation = 100403, // => [9] alcohol in www.puntodeinteres.es SectionSpeedMobile = 100404, // other dangers, not devices Pedestrians = 100500, // [Navitel code]+100400 SpeedLimitSign = 100501, SpeedBump = 100502, // => [8] in MapaRadar.com BadRoad = 100503, DangerousTurn = 100504, DangerousCrossroads = 100505, BlackSpot = 100510, // = zone accidentogene Zone20 = 100520, Zone30 = 100521, ResidentalArea = 100522, SchoolSpeedZone = 100523, TollRoad = 100525, OtherDanger = 100526, AgglomerationEntry = 100540, ProximityAlert = 100590, // temporary dangers Accident = 100600, ObjectOnRoad = 100601, Roadworks = 100602 };
[ограничение] - целое число, ограничение скорости, по-умолчанию в км/ч. Важно: если в программе выбрать не метрические единицы, то ограничения будут рассматриваться как в мили/час (mph). Может быть равно 0, в этом случае программа не контролирует и не сигнализирует превышение для этой точки.
[тип-направления] - целое число, может принимать значения 0,1,2. 0 - обозначает камеру без направления, программа будет предупреждать о такой при подъезде с любой стороны (параметр [направление] игнорируется). 1 - камера работает в одном направлении, заданном параметром [направление]. 2 - камера двунаправленная, работает в указанном направлении и противоположном.
[направление] - число большее или равное 0 и меньше 360. В стандарте IGO число должно быть целым, программа допускает число с дробной частью. Разделитель целой и дробной части всегда точка '.' Для IGO: направление 0 означает на север, 90 - восток, 180 - юг, 270 - запад. Если камера должна контролировать поток, едущий, например, на юго-запад, параметр [направление] должен быть равен 225. Для формата навител: 0 - юг, 90 - запад, 180 - север, 270 -восток. Если камера контролирует поток, едущий на юго-восток, параметр [направление] должен быть 315.
Преобразования типов камер при загрузке базы
Если при загрузке файла встречается точка с типом 2 (контроль светофора), но для нее указано ограничение скорости, то тип преобразуется в тип 3 (контроль светофора и скорости). Если встречается тип 3, но ограничение равно 0, то тип преобразуется в 2. Если встречается тип 1 (статическая камера скорости) с ограничением 0, то тип преобразуется в 100001 (камера нефиксированной скорости). Эти преобразования заданы жестко и настройками их изменить нельзя.
Загрузка баз
При загрузке содержимого баз в память, если установлен параметр "учитывать приоритет баз" (меню вверху справа), программа учитывает порядок, в котором базы расположены в списке, и убирает дублирующиеся точки. Точки из баз вверху списка замещают точки из баз внизу списка. Одна точка замещает другую, если: а) находятся менее чем в 50м друг от друга; б) имеют направление, отличающееся менее чем на 45 градусов; в) имеют одинаковый тип или обе относятся к категории камер скорости, т.е. имеют обе имеют один из типов 1, 3, 100001, 100040, 100070.
Не замещаются секционные камеры контроля средней скорости. Это сделано с целью исключить ошибки, которые могут привести к неправильной работе программы на участках контроля (например, забыли или неправильно заместили финишную камеру).
На скриншоте, приведенном ниже, 2 точки из базы hide-test.txt замещают 2 точки из базы speedcam.online (всего 27581, активно 27579). А база speedcam.online, в свою очередь, замещает 22 точки из базы "РФ-дополнительная".
Замещение точек можно использовать для маскирования ненужных камер скорости. Для этого в базе вверху надо создать точки, совпадающие с точками, которые надо заместить в базах снизу, указать им тип 100001 (не используется в РФ). Затем создать предупреждение для этого типа, выставить ему дистанцию оповещения в 0 и снять отметку "переменная дистанция предупреждения".
Дополнительные параметры для точек
Для формата IGO программа поддерживает расширенные свойства, описывающие точку. Расширенные свойства записываются в следующем общем виде (примеры):
{c197d814-3b2f-11e8-90a3-001876200000},129.6966751,61.9876879,1,60,1,38,#{"RearFacing":1}
{abfaf8bc-82cb-11e8-aa06-001876200000},36.6869019,55.8932418,1,50,1,300,#{"Geometry":"qictIqg}~EFlFc@pAkCt@s@x@u@bEe@~F", "RearFacing":1}
{ad3d077b-8c54-11e3-91fd-3440b5d70000},37.7379300,55.6819600,100203,0,1,174,#{"Schedule_0":"holidays;2015-01-01T00:00;24;active;0"}
{1a45973d-f3c7-11e8-b1f5-001876200000},44.4160000,43.0314000,100010,90,1,276,#{"SectionLength":4058, "Geometry":"wpseG}~anGaA~PIjJeCfu@im@zyE", "Avg":1, "Pair":"10b485f9-f3c7-11e8-b1f5-001876200000"}
{d4d1d999-ac7c-11e8-aa06-001876200000},48.3787000,55.7274000,1,90,1,264,#{"Route":"wfcsI}}gfH|BlgA@vU[`Uwh@|jRw@~KiBjPoBrLgCpKeD~JeL|Y", "Avg":1, "Pair":"8ace2356-ac7d-11e8-aa06-001876200000"}
{d53b4cef-cf57-11e7-90a3-001876200000},37.7973692,55.9139058,1,60,1,94,#{"Range":450, "Geometry":"ovgtIuaseFIiBB{a@p@u_@"}
Расширенные параметры представляют из себя JSON-константу, записанную в 1 строку и идущую с самом конце после запятой и символа решетки #.
ПРОДОЛЖЕНИЕ СЛЕДУЕТ...