Все вопросы, связаны с непониманием теории дырявых полигонов в польском формате. Постараюсь объяснить:
НЕМНОГО ТЕОРИИ КАСАТЕЛЬНО МНОГОЭЛЕМЕНТНЫХ ПОЛИГОНОВКак в исходнике представлен полигон? Полигон представлен неким параметром (описывающий форму элемента) DataX=, в котором находятся координатные пары периметральной линии, которую редактор отображает в виде полигона, замыкая её саму на себя и заливая соответствующей заливкой или текстурой. Например:
Код:
[POLYGON]
Type=0x47
Data0=(53.200814,26.145545),(53.200814,26.144102),(53.201586,26.144102),(53.201586,26.145545)
[END]
То есть объект состоит из секции: [POLYGON], параметра определяющего тип объекта: Type= и параметра определяющего форму элемента: DataX=.
Как в исходнике представлены сгруппированные полигоны? А вот так:
Код:
[POLYGON]
Type=0x47
Data0=(53.200814,26.145545),(53.200814,26.144102),(53.201586,26.144102),(53.201586,26.145545)
Data0=(53.201005,26.145156),(53.200972,26.144366),(53.201412,26.144338),(53.201412,26.145170)
[END]
Мы имеем опять таки 1 объект (1 секция [POLYGON]), общий параметр: Type= и 2-а параметра описывающие форму элементов: DataХ=. Причем первый параметр DataХ= описывает основной элемент полигона, а второй параметр DataХ= описывает вложенный элемент полигона, говоря другими словами - "пригруппированный" полигон.
Как в исходнике представлен "дырявый" полигон Абсолютно также как и сгруппированный полигон:
Код:
[POLYGON]
Type=0x47
Data0=(53.200814,26.145545),(53.200814,26.144102),(53.201586,26.144102),(53.201586,26.145545)
Data0=(53.201005,26.145156),(53.200972,26.144366),(53.201412,26.144338),(53.201412,26.145170)
[END]
Разница сгруппированных полигонов от "дырявого" состоит лишь в том, что все "пригруппированные" элементы геометрически отстоят друг от друга на некотором расстоянии. А в "дырявом" последующие элементы попадают внутрь первого. Записи в исходнике "дырявого" полигона и сгруппированного полигона - абсолютно одинаковы. Определение дырки выполняется внутренней логикой программы. Из этого следует:
- Сгруппированный полигон - это многоэлементный полигон с несколькими геометрически отстоящими друг от друга элементами.
- "Дырявый" полигон - это многоэлементный полигон в котором некоторые элементы геометрически попадают внутрь первого. Элементы попавшие внутрь первого - принято считать "дырками".
ОТОБРАЖЕНИЕ МНОГОЭЛЕМЕНТНЫХ ПОЛИГОНОВ В РЕДАКТОРЕ- В редакторе второй или последующие элементы полигона, при условии что они геометрически отстоят друг от друга, считаются СГРУППИРОВАННЫМИ полигонами и заливаются той же заливкой или текстурой, что и основной полигон (элемент).
- В редакторе второй или последующие элементы полигона, при условии что они попадают внутрь основного элемента полигона считаются ВЛОЖЕННЫМИ или "ДЫРКАМИ" и для визуального восприятия заливаются белой заливкой.
- В редакторе второй или последующие элементы полигона, при условии что они геометрически пересекают основной элемент полигона считаются САМОПЕРЕСЕКАЮЩИМИСЯ, поскольку пересечение происходит внутри одного объекта. Такие полигоны считаются ошибкой и могут иметь заливку либо "дырки", либо основного элемента, в зависимости от площади пересечения.
ИНСТРУМЕНТ "СЛИЯТЬ ВНУТРЕННИЕ ПОЛИГОНЫ"Дело в том, что не все навигационные программы одинаково способны обработать сгруппированные объекты (об этом - мы упоминали в мануале к MicroGISEditor). Для того, что бы избавиться от многоэлементных полигонов, перед выпуском карты для таких программ, в MicroGISEditor существует инструмент "Слиять внутренние полигоны". Если применить данный инструмент:
-
СГРУППИРОВАННЫЕ полигоны - разгруппируются, на несколько объектов. Каждый объект унаследует все свойства (атрибуты) первого.
-
ВЛОЖЕННЫЕ элементы сольются с основным, сохраняя при этом вид и форму предыдущего. Виуально - тело полигон получит линию образованную стыковкой его рёбер. В навигационной программе, эта линия убирается, путем нехитрых комбинаций при формировании стиля визуального оформления. Но это уже совсем другая песня.
Теперь, что касается вопросов:
1. С топологией всё в порядке. Программа работает так как ей и предписано:
В процессе экспорта многоэлементного полигона в SHP Shapefile основной элемент всегда приобретает правое "вращение", все остальные элементы - левое. Так и было задумано. Программа не выполняет проверку дополнительных элементов на признак: СГРУППИРОВАННЫЙ/ВЛОЖЕННЫЙ.
2. Максимальная длина поля в DBF-формате может достигать 255 символов. Поэтому говорить об ошибке в программе - это не правильно. Компилятор MPC прекрасно справляется с 255 символами. Я понимаю, что проблема обусловлена совместимостью с ArcGIS, который обрабатывает 254 символа. Мы обсудим этот вопрос у себя еще раз.
3. Проанализировав присланный пример, отвечаю:
При слиянии полилиний белый НОД автоматически убирается только при отсутствии в нём запретов дорожного движения. В вашем случае - в НОДе имеется запрет (Restrict).
4. ArcGIS при импорте одинаково понимает и вариант (а) и вариант (б). В последствии он преобразовывает вариант (б) в (а) - и это правильно. Как в ArcGIS это достигается и как хранится я не знаю. Да и какая разница. Для ArcGIS - выполнять "Слияние внутренних полигонов" не нужно. Он вполне адекватно понимает и обрабатывает "дырки". MPC тоже абсолютно нормально обрабатывает "дырки". Поэтому выполнять "Слияние внутренних полигонов" для компилятора MPC - не нужно. CityGuide тоже научился адекватно обрабатывать вариант (а). Для него тоже выполнять "Слияние внутренних полигонов" - не нужно. Ну а в исходнике, "ради забавы", выполнять "Слияние внутренних полигонов" я не рекомендую, обратного инструмента в программе -нет. Еще раз повторюсь: "Слияние внутренних полигонов" нужно выполнять только при подготовке карт под конкретный проект (на копии карты) если того требуют рекомендации поставщика компилятора.
Что касается проверок:
- Проверка на "Многоэлементные полигоны" одинаково находит и "дырявые" полигоны и сгруппированные полигоны. Потому что это разновидности одного и того же. Так было и так будет. Если конечная программа или компилятор понимает один вид, то и второй она поймет автоматически. В любом случае проверка работает - правильно. Разнести данную проверку на 2-е теоретически можно, но практического смысла - не вижу.
- Проверка на "Самопересечение полигонов" правильно обрабатывает полигоны вида (б). Полигон вида (б) - не считается самопересекающимся если координаты стыковочных узлов совпадают.