Базы данных

Приложение поддерживает следующие форматы дополнительных баз камер: 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 строку и идущую с самом конце после запятой и символа решетки #.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ...