GIS-LAB

Географические информационные системы и дистанционное зондирование

Удаление геометрических дубликатов объектов в ArcView 3.x

Типичная ошибка возникающая при оцифровке карт - возникновение дубликатов объектов. Скрипт может также использоваться как небольшое введение в Avenue

Обсудить в форуме Комментариев — 0

Скрипт поиска элементов темы, пространственно дублирующих друг-друга, запускается нажатием на кнопку в графическом интерфейса Вида, на событие Click этой кнопки необходимо назначить этот скрипт (о подключении скриптов).

Чтобы обработать результаты работы скрипта, создайте поле идентификаторов:

  • создайте поле типа Number(16,0), сделайте его активным и снимите выделение с таблицы
  • в калькуляторе поля наберите строку "rec+1" (Field/Calculate)

Итогом работы скрипта является поле "SAME_AS" ("такой-же как"), содержащее в себе идентификатор дублирующего элемента если значение этого поля не равно 0, то данный элемент таблицы имеет дубликат с идентификатором, равным значению поля.

'////////////////////////////////////////////
'Name: DetectDuplicateItems
'©WedMC
'////////////////////////////////////////////

'НАЧАЛО ПРОГРАММЫ
'работаем с первой активной темой вида

theTheme = av.GetActiveDoc.GetActiveThemes.Get(0)
theFtab = theTheme.GetFtab
'начало редактирования таблицы
theFtab.SetEditable(true)
'ищем поле
err_fld = theFtab.FindField("SAME_AS")
'если его нет - создаем и добавляем в таблицу
if (err_fld = nil) then
err_fld = Field.Make("SAME_AS",#FIELD_DECIMAL,16,0)
theFtab.AddFields({err_fld})
end
'определяем поле "Shape"
sField = theFtab.FindField("Shape")
'определяем число строк в таблице
recCou= theFtab.GetNumRecords.AsString
'инициализируем счетчик ошибок
errCou = 0
'для всех записей в таблице
for each rec in 0..(theFtab.GetNumRecords-1)
'рапорт о процессе работы
System.BasicEcho("record #"++rec.Asstring++"of"++recCou,TRUE)
'текущий шейп
sh = theFtab.ReturnValue(sField,rec)
'выборка в таблице по текущему шейпу
theFTab.SelectByShapes ({sh}, #VTAB_SELTYPE_NEW)
'для всех выбранных элементов
for each r in theFtab.GetSelection
'если это не он сам
if (r<>rec) then
'и если такой-же как и текущий
if (theFtab.ReturnValue(sField,r) = sh) then
'увеличиваем счетчик ошибок
errCou = errCou+1
'заносим значение id дубликата в поле "SAME_AS"
theFtab.SetValue(err_fld,r,rec+1)
end
end
end
end
'конец редактирования таблицы
theFtab.SetEditable(false)
'рапорт о конце работы
MsgBox.Info(errCou.AsString++"duplicated ithems found","")
'КОНЕЦ ПРОГРАММЫ

Обсудить в форуме Комментариев — 0

 

Последнее обновление: September 09 2021

Дата создания: 05.03.2003
Автор(ы): WedMC