Занесение координат углов полигона в таблицу
снятие координат с готового шейп-файла в ArcView
Имеется:готовый шейп-файл ArcView в форме прямоуголиника с пустой атрибутивной таблицей.
Вопроос: Каким образом координаты всех четырех вершин прямоугольника занести в таблицу автоматически, т.е. не снимать координаты каждой точки в ручную, а потом не забивать их в таблицу.
Есть срипт, который проделывает все эти действия, но к сожалению с одной точкой. Каким образом его переделать, чтобы он работал с полигоном????
Вопроос: Каким образом координаты всех четырех вершин прямоугольника занести в таблицу автоматически, т.е. не снимать координаты каждой точки в ручную, а потом не забивать их в таблицу.
Есть срипт, который проделывает все эти действия, но к сожалению с одной точкой. Каким образом его переделать, чтобы он работал с полигоном????
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Скрипта не было, но теперь есть
Пользоваться просто, в виде должна быть создана тема с любым названием, в атрибутивной таблице должно быть поле с названием "Newfield1", при выполнении скрипта в этом поле прописываются координаты всех углов для всех полигонов в виде строки X1,Y1;X2,Y2...
Последняя точка полигона дублирует первую.
Пользоваться просто, в виде должна быть создана тема с любым названием, в атрибутивной таблице должно быть поле с названием "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).
Примечание: в обоих случаях первая и последняя точки полигонов будут совпадать!
Преимущества скрипта:
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.В этих скриптах идет обращение к активной теме с выделенными строками?
Есть несколько вопросов:
1.Какой должен быть тип поля(или это все равно, просто насколько я знаю не каждый тип поля подходит для записи координат)
2.В этих скриптах идет обращение к активной теме с выделенными строками?
-
- Участник
- Сообщения: 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".
Соответственно, чем больше узлов в элементах, и чем большее число знаков после запятой задано в скрипте(в первой строке), тем больше должна быть длина строкового поля.
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
- Откуда: Москва
- Контактная информация:
Вот, новая версия, еще короче.
Теперь у редактируемого шейпа должно быть не 1, а 4 поля (их не 8, потому что для квадрата, естественно можно обойтись 4-мя координатами). Тип поля number 16 5
Теперь у редактируемого шейпа должно быть не 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
- Откуда: Москва
- Контактная информация:
-
- Участник
- Сообщения: 65
- Зарегистрирован: 29 окт 2003, 17:12
- Репутация: 0
- Откуда: Москва
- Контактная информация:
- taimyr
- IT-моторист
- Сообщения: 460
- Зарегистрирован: 14 окт 2003, 12:36
- Репутация: 17
- Откуда: Москва
- Контактная информация:
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя