Занесение координат углов полигона в таблицу

Arcview GIS 3.x, Arcinfo Workstation, Mapobjects
Ответить
Наталья

снятие координат с готового шейп-файла в ArcView

Сообщение Наталья »

Имеется:готовый шейп-файл ArcView в форме прямоуголиника с пустой атрибутивной таблицей.
Вопроос: Каким образом координаты всех четырех вершин прямоугольника занести в таблицу автоматически, т.е. не снимать координаты каждой точки в ручную, а потом не забивать их в таблицу.
Есть срипт, который проделывает все эти действия, но к сожалению с одной точкой. Каким образом его переделать, чтобы он работал с полигоном????
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Сообщение Максим Дубинин »

Скрипта не было, но теперь есть :)
Пользоваться просто, в виде должна быть создана тема с любым названием, в атрибутивной таблице должно быть поле с названием "Newfield1", при выполнении скрипта в этом поле прописываются координаты всех углов для всех полигонов в виде строки X1,Y1;X2,Y2...
Последняя точка полигона дублирует первую.

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

aView = av.GetActiveDoc
aTheme = aView.GetEditableTheme
if (aTheme = Nil) then
  exit
end
aFTab = aTheme.GetFTab
shapeField = aFTab.FindField("Shape")
valueField = aFTab.FindField("NewField1")
for each rec in aFTab
  aPolygon = aFTab.ReturnValue(shapeField, rec)
  aList = aPolygon.AsList
  aPointList = aList.Get(0)
  aStr = ""
  aCount = aPointList.count
  for each num in 0..(aCount-1)
    aPointX = aPointList.get(num).getx
    aPointY = aPointList.get(num).gety
    aStr = aStr + aPointX.asString + "," + aPointY.asString + ";"
  end
  aStr = aStr.Left(aStr.count - 1)
  aFTab.SetValue(valueField, rec, aStr)
end
Последний раз редактировалось Максим Дубинин 05 сен 2006, 02:18, всего редактировалось 2 раза.
пристегивайтесь, турбулентность прямо по курсу
Ведьмак
Участник
Сообщения: 65
Зарегистрирован: 29 окт 2003, 17:12
Репутация: 0
Откуда: Москва
Контактная информация:

Сообщение Ведьмак »

Требования к запуску - те же.
Преимущества скрипта:
1. В первой строке задается точность считывания координат.
2. Если в теме нет выделенных объектов, то расчет выполняется для всех объектов темы. Иначе - только для выделенных.
3. Более удобное строковое представление точки (по стандарту ArcView).

Примечание: в обоих случаях первая и последняя точки полигонов будут совпадать!

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

Script.The.SetNumberFormat("d.ddddd")

aTheme = av.GetActiveDoc.GetEditableTheme 
  if (aTheme = Nil) then return(NIL) end 
  
  aFTab = aTheme.GetFTab 
  shapeField = aFTab.GetFields.Get(0)
  valueField = aFTab.FindField("NewField1") 

theSet = aFTab
if (aFTab.GetNumSelRecords<>0) then theSet = theSet.GetSelection end 'if                              

for each rec in theSet
  aPointList = aFTab.ReturnValue(shapeField,rec).AsList.get(0)
  aStr = "" 
  for each pnt in aPointList   aStr = aStr ++ pnt.asString + ";"  end 
  aFTab.SetValue(valueField, rec, aStr.Left(aStr.count - 1) ) 
end 'for
Ведьмак
Наталья

спасибо за ответ

Сообщение Наталья »

Большое спасибо за ответ. Я пытаюсь разобраться, но пока почему-то не работает.
Есть несколько вопросов:
1.Какой должен быть тип поля(или это все равно, просто насколько я знаю не каждый тип поля подходит для записи координат)
2.В этих скриптах идет обращение к активной теме с выделенными строками?
Наталья

Сообщение Наталья »

Еще вопросик:
как координаты 4-х точек запишутся в один столбик в таблице?
У полигона(квадрата) есть 4 угловые точки, у каждой точки 2 координаты (широта и долгота).Всего как минимум 8 столбиков.
А в скрипте только 1 солбик?
Ведьмак
Участник
Сообщения: 65
Зарегистрирован: 29 окт 2003, 17:12
Репутация: 0
Откуда: Москва
Контактная информация:

Сообщение Ведьмак »

Прошу прощения за неточности в инструкции. Винюсь.
1. Поле должно быть строковое. Длина - чем больше, тем лучше(см. п.3)
2. Обращение идет к редактируемой теме вида. Если в ней есть выделение, то расчет идет только для выделения. Если нет - для всех элементов темы.
3. Элемент описывается примерно так:
Point:X1,Y1;Point:X2,Y2; и т.д., например: "Point:100.000,120.000;Point:99.000,99.000".
Соответственно, чем больше узлов в элементах, и чем большее число знаков после запятой задано в скрипте(в первой строке), тем больше должна быть длина строкового поля.
Ведьмак
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Сообщение Максим Дубинин »

Вот, новая версия, еще короче.
Теперь у редактируемого шейпа должно быть не 1, а 4 поля (их не 8, потому что для квадрата, естественно можно обойтись 4-мя координатами). Тип поля number 16 5

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

Script.The.SetNumberFormat("d.ddddd") 

aTheme = av.GetActiveDoc.GetEditableTheme 
  if (aTheme = Nil) then return(NIL) end 
  
  aFTab = aTheme.GetFTab 
  shapeField = aFTab.GetFields.Get(0) 
  topField = aFTab.FindField("Top") 
  bottomField = aFTab.FindField("Bottom") 
  rightField = aFTab.FindField("Right")
  leftField = aFTab.FindField("Left")

theSet = aFTab 
if (aFTab.GetNumSelRecords<>0) then theSet = theSet.GetSelection end 'if                              

for each rec in theSet 
  aPoly = aFTab.ReturnValue(shapeField,rec)
  vTop = aPoly.ReturnExtent.GetTop 
  vBottom = aPoly.ReturnExtent.GetBottom
  vRight = aPoly.ReturnExtent.GetRight
  vLeft = aPoly.ReturnExtent.GetLeft
  
  aFTab.SetValue (topField, rec, vTop)
  aFTab.SetValue (bottomField, rec, vBottom)
  aFTab.SetValue (rightField, rec, vRight)
  aFTab.SetValue (leftField, rec, vLeft)
end 'for
пристегивайтесь, турбулентность прямо по курсу
Аватара пользователя
taimyr
IT-моторист
Сообщения: 460
Зарегистрирован: 14 окт 2003, 12:36
Репутация: 17
Откуда: Москва
Контактная информация:

Сообщение taimyr »

Господа, а почему нельзя этот скрипт сделать так, чтобы он создавал 4 поля в таблице - N, S, W, E и заносил в них максимальные (минимальные) координаты полигона, выбрав их из координат всех узлов? Скрипт coordinate utility создает же сам 2 поля для центра полигона (но считает только его).
Ведьмак
Участник
Сообщения: 65
Зарегистрирован: 29 окт 2003, 17:12
Репутация: 0
Откуда: Москва
Контактная информация:

Сообщение Ведьмак »

Господа, скрипт можно сделать как угодно. И вариантов может быть немеряно! Нет предела совершенству. Другое дело, что изначально вообще надо было лишь поиметь информацию о вершинах. Как это удобнее для Натальи - не нам судить.
С уважением.
Ведьмак
Аватара пользователя
taimyr
IT-моторист
Сообщения: 460
Зарегистрирован: 14 окт 2003, 12:36
Репутация: 17
Откуда: Москва
Контактная информация:

Сообщение taimyr »

Прошу прощения, сходу не разобрался. Последняя версия скрипта именно это и делает, только поля надо вручную создать...
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Сообщение Максим Дубинин »

Слова господина Ведьмака, выделенные жирным, нужно поставить куда-нибудь в начало форума, чтобы все видели :wink:
пристегивайтесь, турбулентность прямо по курсу
Ответить

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

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

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