Страница 1 из 1
снятие координат с готового шейп-файла в ArcView
Добавлено: 20 окт 2003, 17:07
Наталья
Имеется:готовый шейп-файл ArcView в форме прямоуголиника с пустой атрибутивной таблицей.
Вопроос: Каким образом координаты всех четырех вершин прямоугольника занести в таблицу автоматически, т.е. не снимать координаты каждой точки в ручную, а потом не забивать их в таблицу.
Есть срипт, который проделывает все эти действия, но к сожалению с одной точкой. Каким образом его переделать, чтобы он работал с полигоном????
Добавлено: 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
Добавлено: 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 солбик?
Добавлено: 03 ноя 2003, 16:21
Ведьмак
Прошу прощения за неточности в инструкции. Винюсь.
1. Поле должно быть строковое. Длина - чем больше, тем лучше(см. п.3)
2. Обращение идет к редактируемой теме вида. Если в ней есть выделение, то расчет идет только для выделения. Если нет - для всех элементов темы.
3. Элемент описывается примерно так:
Point:X1,Y1;Point:X2,Y2; и т.д., например: "Point:100.000,120.000;Point:99.000,99.000".
Соответственно, чем больше узлов в элементах, и чем большее число знаков после запятой задано в скрипте(в первой строке), тем больше должна быть длина строкового поля.
Добавлено: 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
Добавлено: 08 ноя 2003, 17:09
taimyr
Господа, а почему нельзя этот скрипт сделать так, чтобы он создавал 4 поля в таблице - N, S, W, E и заносил в них максимальные (минимальные) координаты полигона, выбрав их из координат всех узлов? Скрипт coordinate utility создает же сам 2 поля для центра полигона (но считает только его).
Добавлено: 10 ноя 2003, 10:16
Ведьмак
Господа, скрипт можно сделать как угодно. И вариантов может быть немеряно! Нет предела совершенству. Другое дело, что изначально вообще надо было лишь поиметь информацию о вершинах. Как это удобнее для Натальи - не нам судить.
С уважением.
Ведьмак
Добавлено: 10 ноя 2003, 11:28
taimyr
Прошу прощения, сходу не разобрался. Последняя версия скрипта именно это и делает, только поля надо вручную создать...
Добавлено: 11 ноя 2003, 23:08
Максим Дубинин
Слова господина Ведьмака, выделенные жирным, нужно поставить куда-нибудь в начало форума, чтобы все видели
