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

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

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

Сообщение Наталья » 20 окт 2003, 17:07

Имеется:готовый шейп-файл ArcView в форме прямоуголиника с пустой атрибутивной таблицей.
Вопроос: Каким образом координаты всех четырех вершин прямоугольника занести в таблицу автоматически, т.е. не снимать координаты каждой точки в ручную, а потом не забивать их в таблицу.
Есть срипт, который проделывает все эти действия, но к сожалению с одной точкой. Каким образом его переделать, чтобы он работал с полигоном????

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

Сообщение Максим Дубинин » 27 окт 2003, 13:09

Скрипта не было, но теперь есть :)
Пользоваться просто, в виде должна быть создана тема с любым названием, в атрибутивной таблице должно быть поле с названием "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
Откуда: Москва
Контактная информация:

Сообщение Ведьмак » 29 окт 2003, 17:40

Требования к запуску - те же.
Преимущества скрипта:
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
Ведьмак

Наталья

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

Сообщение Наталья » 03 ноя 2003, 14:46

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

Наталья

Сообщение Наталья » 03 ноя 2003, 15:07

Еще вопросик:
как координаты 4-х точек запишутся в один столбик в таблице?
У полигона(квадрата) есть 4 угловые точки, у каждой точки 2 координаты (широта и долгота).Всего как минимум 8 столбиков.
А в скрипте только 1 солбик?

Ведьмак
Участник
Сообщения: 65
Зарегистрирован: 29 окт 2003, 17:12
Репутация: 0
Откуда: Москва
Контактная информация:

Сообщение Ведьмак » 03 ноя 2003, 16:21

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

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

Сообщение Максим Дубинин » 08 ноя 2003, 16:55

Вот, новая версия, еще короче.
Теперь у редактируемого шейпа должно быть не 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 » 08 ноя 2003, 17:09

Господа, а почему нельзя этот скрипт сделать так, чтобы он создавал 4 поля в таблице - N, S, W, E и заносил в них максимальные (минимальные) координаты полигона, выбрав их из координат всех узлов? Скрипт coordinate utility создает же сам 2 поля для центра полигона (но считает только его).

Ведьмак
Участник
Сообщения: 65
Зарегистрирован: 29 окт 2003, 17:12
Репутация: 0
Откуда: Москва
Контактная информация:

Сообщение Ведьмак » 10 ноя 2003, 10:16

Господа, скрипт можно сделать как угодно. И вариантов может быть немеряно! Нет предела совершенству. Другое дело, что изначально вообще надо было лишь поиметь информацию о вершинах. Как это удобнее для Натальи - не нам судить.
С уважением.
Ведьмак

Аватара пользователя
taimyr
IT-моторист
Сообщения: 460
Зарегистрирован: 14 окт 2003, 12:36
Репутация: 17
Откуда: Москва
Контактная информация:

Сообщение taimyr » 10 ноя 2003, 11:28

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

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

Сообщение Максим Дубинин » 11 ноя 2003, 23:08

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

Ответить

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

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

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