Конвертер OSM -> MP

Скачал очередные карты и появились вопросы:

Почему города, даже небольшие, в частности, райцентры, пригороды Москвы и т.п. обозначаются типом 0200h - “Мегаполис (5-10 млн.)”?

Почему массово дублируются города. Даже крупные, например, есть 2 Симферополя - один на площади, а другой - на железнодорожном вокзале?

Еще обнаружил конструкцию:

; WayID = 29102760
; building=yes
[POLYGON]
Type=0x13
Label=30
HouseNumber=30
StreetDesc=Ярцевская улица
CityName=Москва
RegionName=Москва город
CountryName=Россия (OSM)
EntryPoint=(55.7405521,37.4165066),Техносила
Data0=(55.74061,37.4163756), (55.7400509,37.4154994), (55.7400456,37.4154912), (55.7398015,37.4160129), (55.7399261,37.4161967), (55.7400933,37.4158392), (55.7402306,37.4160419), (55.7400587,37.4164093), (55.7402827,37.41674), (55.7402409,37.4168294), (55.7403249,37.4169534), (55.7403543,37.4168905), (55.7403734,37.4169107), (55.7404576,37.4167204), (55.7405521,37.4165066), (55.74061,37.4163756)
[END]

здесь интересна строчка с EntryPoint.
Во-первых, в ряде случаев после запятой вообще отсутствует что-либо.
Но самое интересное, что в ТЕКСТОВОМ файле текстовая константа не заключена в кавычки и при этом НЕ ЯВЛЯЕТСЯ единственной константой в строке, будучи отделенной только символами, которые могут встретиться в самой строке. В данном случае - запятой.
Кстати, по общим правилам после запятой ДОПУСТИМЫМ но НЕОБЯЗАТЕЛЬНЫМ символом является пробел. И в этом случае размещение текстовой константы после запятой просто недопустимо, т.к. запятая НЕ может являться разделителем для строки (максимум - для слова, не содержащего других разделителей, например, пробелов).

Потому что все city преобразовываются в 0x02.
И собственно этот тип вообще ни на что не влияет, это один из атавизмов.

http://www.openstreetmap.org/browse/node/252176252
http://www.openstreetmap.org/browse/node/337698647
Сколько есть, столько и конвертнулось

EntryPoint - это подъезды для навитела.
Что с ними не так и в чём вопрос, я не понял :slight_smile:

Но ведь это неправильно.
Есть стандартная таблица типов:


(ind:$0100; nam:'Мегаполис (свыше 10 млн.)'),
(ind:$0200; nam:'Мегаполис (5-10 млн.)'),
(ind:$0300; nam:'Крупный город (2-5 млн.)'),
(ind:$0400; nam:'Крупный город (1-2 млн.)'),
(ind:$0500; nam:'Крупный город (0.5-1 млн.)'),
(ind:$0600; nam:'Город (200-500 тыс.)'),
(ind:$0700; nam:'Город (100-200 тыс.)'),
(ind:$0800; nam:'Город (50-100 тыс.)'),
(ind:$0900; nam:'Город (20-50 тыс.)'),
(ind:$0a00; nam:'Город (10-20 тыс.)'),
(ind:$0b00; nam:'Населённый пункт (5-10 тыс.)'),
(ind:$0c00; nam:'Населённый пункт (2-5 тыс.)'),
(ind:$0d00; nam:'Населённый пункт (1-2 тыс.)'),
(ind:$0e00; nam:'Поселок (500-1000)'),
(ind:$0f00; nam:'Поселок (200-500)'),
(ind:$1000; nam:'Поселок (100-200)'),
(ind:$1100; nam:'Поселок (менее 100)'),

Почему не пользоваться ею? Тем более, что население в данных OSM фигурирует.

Как это не влияет?
Влияет на способ отображения на карте. Ведь на любой карте есть значки, соответствующие городам с вполне определенным населением.
А у нас получается банальная дезинформация, т.к. город фигурирует как имеющий совершенно другое население.
Нельзя ли эту дезинформацию все-таки поменять на достоверную информацию?

Понимаю, что вопрос не к конвертору (хотя и в нем можно было бы предусмотреть исправление хотя бы некоторых ошибок, коль скоро POI уже плодятся сверх того, что есть в OSM), тогда к кому обращаться, чтобы исправить данные ошибки непосредственно в данных OSM?

Существуют определенные правила хранения и обработки информации необходимые для того, чтобы избежать ее потери при хранении/передаче.
В частности, есть правила хранения текстовых констант (ТК).
При хранении ТК в бинарном файле применяется один из 4-х способов:

  1. указывается адрес начала и длина,
  2. указывается только адрес начала, подразумевается, что, зная адрес начала следующей, можно вычислить длину,
  3. указывается адрес начала. Константа заканчивается разделителем, обычно нулевыми байтом,
  4. константы идут через разделитель, при этом таблицу адресов должна составлять сама обрабатывающая программа, сканируя область данных на наличие разделителей.
    При хранении ТК в текстовом файле задача несколько усложняется, т.к. в качестве разделителя обычно невозможно использовать символ, который не может встретиться в самой константе.
    Выходов несколько:
  5. выбрать несколько символов в качестве разделителей и заменять их внутри констант определенными последовательностями, не допускающими неоднозначности. Применяется, например, в html/xml.
  6. выбрать символ-разделитель и удваивать его перед помещением внутрь константы. Применяется во многих языках программирования, например в Паскале(').
  7. выбрать два или более символов разделителей и использовать тот из них, который не встречается в текстовой константе. Применяется, например, в Фортране(’ и ").
  8. выбрать разделитель среди символов, которые не могут встречаться в образцах текста, помещаемых в константу. Например, в неспециализированном тексте на русском языке не могут встречаться символы |=+{}.
  9. есть и другие…

В использованном же варианте в качестве левого разделителя используется запятая, а в качестве правого - символ CR. И если применение CR не вызывает возражений для ТК, в которой не может быть деления на строки, то применение запятой - вызывает, и эти возражения я уже изложил выше:

  • запятая может встретиться в ТК,
  • после запятой ДОПУСТИМО как наличие, так и отсутствие пробела (по ГОСТ), что дает неопределенность, с какой позиции начинать ТК.

Если ориентироваться на стиль MP файла, ТК следует размещать сразу после разделителя “=”, причем в этой строке не должно быть ничего кроме ключевого слова, разделителя и текстовой константы.
В качестве примера можно порекомендовать вместо

EntryPoint=(55.7405521,37.4165066),Техносила

использовать, скажем,

EntryPointCoord=(55.7405521,37.4165066)
EntryPointName=Техносила

Интересно, откуда сведения о “стандартности” этой таблицы?
И на какой вдруг карте разные отображения стали? Или это “мысленный эксперимент”?

Взять и самому исправить.

Ну а я-то тут при чём? Это к навителовцам вопросы, почему они так хранить решили

Насколько можно понять, формат параметра EntryPoint изменить просто так нельзя, на него ориентируется Навител (см., например, здесь). Считайте, что это некий заданный стандарт.

И потом, с запятой вы, по-моему, немного усложняете. Все проще: EntryPoint=(координаты), метка. То есть, метка - это всё, что от запятой до конца строки, и запросто может содержать в том числе и запятую, а также быть пустой. С пробелом еще легче - его просто пропускаем, поскольку имя с него начинаться в любом случае не будет.

Вот этот момент мне тоже непонятен. Таблица стандартная гарминовская, что с ней не так? Точки отображаются (в навигаторе) тоже слегка по-разному, плюс можно использовать typ-файлы. Почему бы, действительно, не раскидать города по типам в зависимости от населения?

С таблицей-то всё в порядке - кроме того, что она всем абсолютно фиолетова :slight_smile:
В навигаторах реально типов всего 3 - отличаются размером надписи и точки.

Ну ладно, коль заказчик EntryPoint - Навител, и именно он определил стандарт de facto, в котором ему необходимо записывать эти данные - дело его.
Но зачем преднамеренно терять информацию о населении того или иного населенного пункта?
От этого что, MP станет короче?
Есть какая-то польза от этой преднамеренной потери информации?
Кто сказал, что MP исключительно для пары-тройки СУЩЕСТВУЮЩИХ коммерческих навигационных программ? Его нельзя применять для ДРУГИХ (например, разрабатываемых) навигационных или картографических программ? Тот же GPSMapEdit вполне понимает все 17 градаций (и, кстати, терминология взята именно оттуда, хотя она несколько и не совпадает со стандартной: “малые (до 50 тысяч жителей), средние (50—100 тысяч), большие (100—250 тысяч), крупные (250—500 тысяч), крупнейшие (500 тысяч — 1 миллион) и города-миллионеры (свыше 1 миллиона жителей)”).
Кстати, правильное указание населения (достаточно приближенно) может помочь и в другом вопросе, который я поднимал - автоматическое удаление городов-дублей.
Другими словами, есть много резонов не терять информацию о населении. И я не знаю ни одного резона, чтобы эту информацию преднамеренно удалять.
Так можно все-таки ее сохранять?

andriano, есть охота - займись. :slight_smile:
Я уже сказал, что смысла в этом не вижу.

Ну у себя в программе я, обнаружив данное странное обстоятельство, именно так и сделал. Благо, алгоритмически это достаточно тривиально. Правда, выбивается из общего алгоритма обработки, поэтому пришлось писать заплатку.
Но последнее время меня как-то стали раздражать ошибки проектирования. А здесь минимум две такие ошибки:

  1. Смысл символа “запятая”. Очевидно, в данном случае в одной и той же строке символ “запятая” будет трактоваться по-разному.
  2. Типы данных. До сих пор в MP файле были только относительно простые типы данных: символ, строка символов, целое число, массив целых чисел, вектор из двух чисел с плавающей точкой, массив векторов. Теперь вдруг ни с того ни с сего появляется структура: вектор плюс строка. Строго говоря, структуры были в MP и до этого - они обрамлялись тегами в квадратных скобках и не допускали вложенности. А тут вдруг вложенная структура нестандартного формата. Нехорошо.

Смысл один - не терять данные.
Заняться я этим не могу в принципе - я работаю с готовым MP, в котором данные УЖЕ потеряны. Понимаешь, уничтожить данные - проще простого, а восстановить их потом - бывает что и невозможно.

andriano, ну работай тогда напрямую с osm - там ничего не потеряно.
MP делаются для вполне конкретных целей, для которых куча всяких данных не требуется - естественно, они теряются

В том-то и дело, что потеря данных при выборке - явление вполне естественное и объяснимое. В первую очередь необходимостью сокращения объема за счет ненужных. Но здесь же другой вариант - при том же (байт в байт) объеме происходит преднамеренное искажение данных. Т.е. вместо правильных данных в файл помещаются неправильные, при этом никакой выгоды: ни по объему данных, ни по каким другим критериям не получается. Вообще.
Что касается “напрямую с OSM”, то у меня есть вполне конкретная задача. В частности, меня вполне устраивает формат MP (не устраивает ничем не обусловленное искажение информации) и переключаться на какой-либо другой формат - отодвигать сроки реализации основной задачи. С тем же успехом можно предложить и самому рисовать карты с нуля.

Еще раз спрашиваю: искажение информации имеет хоть какую-нибудь положительную причину, или просто раньше это искажение ни для кого не было значимым?

Ещё раз повторяю: никакого искажения тут нет.

А что есть, если я загружаю GPSMapEdit и он мне показывает, что в Мытищах более 5 млн. жителей?
Это правда?
Если “нет”, то кто виноват?
Я пытаюсь найти наиболее простое и логичное решение этой проблемы.

Виноват мапедит, разумеется - это он считает что “крупный город” обязательно содержит более 5 млн жителей.

Я за более детальное обозначение НП :slight_smile:

Можно тогда поинтересоваться Вашей трактовкой следующих кодов POI:

0100h - ?
0200h - крупный город
0300h - ?
0400h - ?
0500h - ?
0600h - ?
0700h - ?
0800h - ?
0900h - ?
0a00h - ?
0b00h - ?
0c00h - ?
0d00h - ?
0e00h - ?
0f00h - ?
1000h - ?
1100h - ?

Кстати, по принятой в картографии классификации крупный город - это от 250 до 500 тыс. жителей. А в Мытищах проживает 164 тыс. человек, что соответствует большому городу.

andriano, достаточно взять любой навигатор и посмотреть.
Например, в мапсорсе:
01-05 - крупный город,
06-0A - средний н/п
0В-0D - мелкий н/п
0E-11 - в современных навигаторах не поддерживаются.

andriano, недавно была дискуссия по этому вопросу: http://forum.openstreetmap.org/viewtopic.php?pid=64725
Статус НП в российском OSM весьма слабо привязан к населению…