Порядок отображения полигонов в одном слое

MapInfo, MapBasic
Ответить
andrutornado
Новоприбывший
Сообщения: 8
Зарегистрирован: 28 сен 2009, 13:47
Репутация: 1

Порядок отображения полигонов в одном слое

Сообщение andrutornado » 28 сен 2009, 14:35

Возможно ли программно определить(MapBasic), какой из пересекающихся полигонов в одном и том же слое будет отрисован MapInfo выше, а какой ниже?

Для чего это нужно. Пользователи нарисовали картинку из перехлестывающихся полигонов. Картинку менять нельзя, но нужно сделать так, чтобы полигоны не перехлестывались.

Я было подумал, что в этом мне поможет rowid и даже кто-то где-то(http://www.mail-archive.com/mapinfo-l@c ... 04787.html) утверждал, что это так, но в некоторых случаях определение порядка прорисовки по rowid не срабатывает.
Вот мой код для такой операции по rowid.

Код: Выделить всё

Include "MapBasic.DEF"
Declare Sub Main
Declare Function NumerateAreaRecordsToField(byVal TableName as String,byVal FieldName as String) as Integer
Declare Sub CleanAsVisible(ByVal LayerName as String, ByVal IdField as string)
Declare Function GetDataForCommands(ByVal LayerName as String) as String



Sub Main
 'Id - это имя поля целого типа, которое должно быть в таблице
 call CleanAsVisible("Layer_name","Id")
End Sub




Sub CleanAsVisible(ByVal LayerName as String, ByVal IdField as string)
 Dim n,i as Integer
 Dim StrCommand,StrCommand2 as String
 n=NumerateAreaRecordsToField(LayerName,IdField)
 StrCommand="select * from "+LayerName+" Where "
 'Note StrCommand+IdField+">0"
 Run command StrCommand+IdField+">0"
 'Note StrCommand+IdField+">0"
 Set Map Layer LayerName Editable On
 Set Target On
 Run command StrCommand+IdField+">0"
 Objects Overlay Into Target 
 for i=1 to n-1
  Run command StrCommand+IdField+"="+Str$(i)
  Set Target On
  Run command StrCommand+IdField+"="+Str$(i)
  Run command StrCommand+"(Obj Contains Part (Select obj from Selection))and("+IdField+">"+Str$(i)+")"
  if(SelectionInfo(SEL_INFO_NROWS)>0) then
   StrCommand2="Objects Erase Into Target "+GetDataForCommands(LayerName)
   Run Command StrCommand2
  end if
 next
End Sub

Function GetDataForCommands(ByVal LayerName as String)as String
  Dim j,numCols as SmallInt
  Dim rez,cName as String
  rez= "Data "
  numCols=TableInfo(LayerName ,TAB_INFO_NCOLS)
  for j=1 to numCols
   cName=ColumnInfo(LayerName,"Col"+Str$(j),COL_INFO_NAME)
   rez=rez+cName+"="+cName
   if(j<>numCols) then
    rez=rez+","
   end if
  next
  GetDataForCommands=rez
End Function

Function NumerateAreaRecordsToField(byVal TableName as string,byVal FieldName as string)as Integer
 Dim i as Integer
 Dim StrCommand as String
 i=0
 Select * from TableName
 StrCommand="update "+TableName+" set "+FieldName+"=0"
 Run Command StrCommand
 StrCommand="Select * from "+TableName+" where ((Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_ELLIPSE)+""")or(Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_REGION)+""")or(Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_RECT)+""")or(Str$(ObjectInfo(obj,"+Str$(OBJ_INFO_TYPE)+"))="""+Str$(OBJ_TYPE_ROUNDRECT)+"""))"
 'note StrCommand
 Run Command StrCommand
 fetch first from selection
 do while not EOT(selection)
  i=i+1
  StrCommand="update selection"+""+" set "+FieldName+"="+Str$(i)+" where rowid="+selection.rowid
  'note StrCommand
  Run Command StrCommand
  fetch next from selection
 loop
 NumerateAreaRecordsToField=i 
End Function

engineer
Новоприбывший
Сообщения: 9
Зарегистрирован: 29 дек 2021, 00:00
Репутация: 1
Откуда: Россия

Re: Порядок отображения полигонов в одном слое

Сообщение engineer » 09 июн 2022, 18:18

Приветствую! Попробовал Ваш код. Из описания сначала понял так, что код в одном слое (в одной таблице) должен раскладывать имеющиеся перекрывающиеся полигоны друг над другом опираясь на значения rowid.
Но у меня, этот код не разложил полигоны в одной таблице выше/ниже, а вырезал меньшие полигоны из больших в этой таблице, так что не осталось перекрытий между полигонами. Часть полигонов, из-за их многократного наслоения, удалилась.
Я, к сожалению, сам не разбираюсь в MapBasic. Возможно ли этот код сделать так, чтобы он именно раскладывал полигоны друг над другом, опираясь на значения rowid или area?

zingeroud
Интересующийся
Сообщения: 46
Зарегистрирован: 21 ноя 2013, 15:16
Репутация: 14

Re: Порядок отображения полигонов в одном слое

Сообщение zingeroud » 31 авг 2022, 22:44

Я обычно поступаю так, выделю 2 полигона, открываю списком, выбираю первым полигон который должен быть в самом низу, перехожу на карту, далее Ctrl+x, Ctrl+v, потом выбираю второй полигон который должен быть выше, перехожу на карту, далее Ctrl+x, Ctrl+v, сохраняюсь. После такой манипуляции на верху будет объект который вставлен последним.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Порядок отображения полигонов в одном слое

Сообщение Boris » 02 сен 2022, 21:30

Уже не вспомню где и когда, но официальная документация или официальный форум (очень давний, умер давно) утверждали, что порядок случаен. Что, собственно, много раз и подтверждалось практикой.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей