SASGIS - SAS.Планета
View Issue Details
0002048SAS.Планета[All Projects] Хотелкаpublic26-07-2013 07:3431-08-2015 09:20
vasketsov 
vdemidov 
normalmajorN/A
resolvedfixed 
WindowsVistaUltimate
121010 
150915150915 
0002048: Дырки в полигонах
Необходимо в базовых геопримитивах (полигон и т.п.) реализовать поддержку дырок. Также поддержку дырок необходимо реализовать и далее по цепочке использования полигонов, в том числе а) отображение и б) подсказки при наведении.

Под дыркой понимается участок внутренней границы полигона. Сам полигон задаётся совокупностью внешних границ (возможно, пересекающихся). Одна дырка принадлежит всегда к одной и только к одной внешней границе. Внутри участка полигона, образованного внешней границей, может быть произвольное количество дырок.

Дополнительные формальные условия - непересекаемость дырок одного полигона и невыход дырок за границу своей внешней области - при хранении в памяти и (де)сериализации несущественны, но при редактировании, рисовании, реализации итераторов,... надо будет сделать некое разумное минимально функциональное решение, например, не сохранять и не рисовать дырку, если она нарушает эти условия.
При создании полигона с дырками можно обойтись той же техникой, что и сейчас для разделения участков внешних границ, если использовать другой разделитель. Одну из координат разделителя можно оставить как есть, другую наделить смысловой частью.
VIP, полигоны
related to 0002765resolved zed Access Violation при экспорте SML меток 
child of 0001471resolved vdemidov Сделать импорт KML с дырками 
child of 0001877resolved zed Логические функции при работе с полигонами 
Issue History
26-07-2013 07:34vasketsovNew Issue
26-07-2013 07:35vasketsovRelationship addedchild of 0001471
26-07-2013 07:39vasketsovAdditional Information Updatedbug_revision_view_page.php?rev_id=5585#r5585
26-07-2013 07:40vasketsovRelationship addedrelated to 0001877
26-07-2013 08:25vdemidovNote Added: 0012208
31-07-2013 08:32vdemidovStatusnew => confirmed
31-07-2013 08:32vdemidovProduct Version => 121010
31-07-2013 08:32vdemidovTarget Version => 27xxxx
25-04-2015 11:58zedNote Added: 0015742
25-04-2015 11:58zedRelationship replacedchild of 0001877
25-04-2015 15:38vasketsovNote Added: 0015747
25-04-2015 15:41zedNote Added: 0015748
25-04-2015 15:58vasketsovNote Added: 0015749
05-05-2015 07:21vdemidovAssigned To => vdemidov
05-05-2015 07:21vdemidovStatusconfirmed => assigned
05-05-2015 17:12zedNote Added: 0015858
05-05-2015 17:32vdemidovNote Added: 0015859
15-05-2015 19:58vdemidovTag Attached: VIP
17-07-2015 18:03zedRelationship addedrelated to 0002765
29-07-2015 14:56vdemidovTag Attached: полигоны
09-08-2015 09:32vdemidovNote Added: 0016358
09-08-2015 14:02zedNote Added: 0016359
09-08-2015 14:09vdemidovNote Added: 0016360
09-08-2015 14:11vdemidovNote Added: 0016361
09-08-2015 14:14vdemidovNote Added: 0016362
09-08-2015 14:32zedNote Added: 0016363
09-08-2015 14:46zedNote Added: 0016364
09-08-2015 14:57zedNote Added: 0016365
18-08-2015 10:12vdemidovTarget Version27xxxx => 150915
23-08-2015 13:30vdemidovNote Added: 0016401
23-08-2015 13:39zedNote Added: 0016402
24-08-2015 06:52vdemidovNote Added: 0016403
31-08-2015 09:20vdemidovStatusassigned => resolved
31-08-2015 09:20vdemidovFixed in Version => 150915
31-08-2015 09:20vdemidovResolutionopen => fixed

Notes
(0012208)
vdemidov   
26-07-2013 08:25   
Хорошая идея с использованием второй координаты разделителя при сериализации.
(0015742)
zed   
25-04-2015 11:58   
Сейчас, как я понимаю, разделителем мульти-геометрий выступает значение NaN и вместо того, чтобы записывать его и в X и в Y, в Y предлагается записать какой-то признак того, что это дырка?
(0015747)
vasketsov   
25-04-2015 15:38   
Ну, мысль была именно такая.
Но на всякий случай надо как-то проверить, не формируются ли в коде точки, где одна из координат NaN. А также не могут ли они прилететь снаружи, или быть введены пользователем. Чтобы дырки плодились только в генераторе дырок.
(0015748)
zed   
25-04-2015 15:41   
Там ещё есть 4 резервных байта, можно юзать их. Писать туда magic какой-нить.

  TGeometryPointSML = packed record
    X: Extended;
    Y: Extended;
    Reserved: LongWord; // proper record aligment for backward compatibility
  end;
(0015749)
vasketsov   
25-04-2015 15:58   
>можно юзать их
Слишком опасно, этот кусок в нормальном числе может быть не проинициализирован, или снаружи прилететь может, на форуме вон руками многие читают и пишут массив lonlat.
(0015858)
zed   
05-05-2015 17:12   
vdemidov
Как планируешь изменять интерфейсы полигонов?
(0015859)
vdemidov   
05-05-2015 17:32   
Скорее всего сделаю иерархию примерно как в kml, тоесть будет LineRing содержащий примитивный одиночный полигон. А SinglePolygon будет содержать внешний контур и несколько внутренних с типом LineRing.
(0016358)
vdemidov   
09-08-2015 09:32   
Итого уже есть поддержка дырок в базе меток на SQLite, в мержилке полигонов и экспорте в KML. В базу SML и всякие HLG, SLS сохраняться должно правильно, но пока считывается неправильно. Да и вообще все нужно тщательно проверять.
(0016359)
zed   
09-08-2015 14:02   
>в мержилке полигонов
*частично - создавать умеет, а читать ещё нет (см. TMergePolygonsProcessor.SinglePolygonToClipperPaths)

И самое главное, что полигон с дыркой у меня вообще никак не отображается, хотя информацию о метке показывает вроде правдоподобную.
(0016360)
vdemidov   
09-08-2015 14:09   
Странно. У меня из SQLite базы вроде бы отображалось. Но там еще в построителе полигонов глюки были.
(0016361)
vdemidov   
09-08-2015 14:11   
> *частично - создавать умеет, а читать ещё нет
Ну это тебе виднее. Добавь, если не сложно, поддержку.
(0016362)
vdemidov   
09-08-2015 14:14   
Еще, редактирование полигонов с дырками превращает их в мультиполигоны.
(0016363)
zed   
09-08-2015 14:32   
>Добавь, если не сложно, поддержку.
Добавлю конечно. Просто, пока не работает отображение, сложно что-либо тестировать. А добавлять что-то без тестирования, как-то стрёмно.

Я для теста создал 2 квадрата, большой и маленький, один над другим. И применил к ним XOR операцию (из большого вырезал маленький). Результат операции окрасился верно, с дыркой, полигон сохранился в БД SQLite, но на экране не отображается. Экспорт в kml отработал нормально и GE дырку нарисовал.
(0016364)
zed   
09-08-2015 14:46   
При дабл-клике по полигону из Управления метками, карта уносится в какую-то неведомую даль. Что-то явно не так с координатами и поэтому оно его и нарисовать скорее всего не может. Хотя в kml все координаты верные и при импорте из него получается мультиполигон именно там, где он и должен быть.
(0016365)
zed   
09-08-2015 14:57   
Упс. Не заметил пару твоих последних коммитов. Сейчас в даль не уносится и полигон с дыркой отображает.
(0016401)
vdemidov   
23-08-2015 13:30   
Вроде бы поддержка дырок есть везде, где я собирался ее добавить. Работает редактирование, есть импорт из KML, загрузка из HLG и SLS. Нужно тестировать. Для начала желательно на простых контурах, а то мало ли вон какая бяка в мультилиниях вылезла внезапно.
(0016402)
zed   
23-08-2015 13:39   
А не хочешь сделать, чтобы при редактировании дырки, перемещение точки ограничивалось внешним контуром и нельзя было бы вытянуть дырку за пределы контура?
(0016403)
vdemidov   
24-08-2015 06:52   
Честно говоря, пока нет.