В шейпе темы Polyline делаю SetValue и...

0 голосов
спросил 13 Апр, 04 от Гость (210,080 баллов) в категории Программные продукты Esri
Подскажите, плз.
Есть у меня тема, в которой одна линия. Соответственно в таблице аттрибутов одна запись типа Polyline, Id=0. Линия создана вручную. Хочу её перерисовать в своих координатах.
Делаю вот так:
l = PolyLine.Make({{p1,xlast@ylast}})
...
'изменения в main_line
MLsrc = SrcName.Make (projDir + "shapes\main_line.shp")
MainLineFTab = FTab.Make(MLsrc)
if (MainLineFTab.IsEditable.Not) then
MainLineFTab.SetEditable(TRUE)
MainLineFTab.StartEditingWithRecovery
MainLineFTab.SetValue(MainLineFTab.findField("Shape"), 0, l)
MainLineFTab.StopEditingWithRecovery(TRUE)
end
theView.Invalidate

После этого вроде бы должна на место старой линии встать новая, с координатами (p1,xlast@ylast) - точки имеют координаты в значениях проекции, т.е. ненулевые и не nil.
На самом деле просто стирается с вида старая линия, новая не рисуется. Если сделать экстент по этой теме, будет пустое место с масштабом 0. В таблице атрибутов, как и прежде, одна запись, ну это так и должно быть.
Кто-нибудь может сказать с определённостью, что не так? В другом проекте ТОЧНО такой же скрипт делает всё как надо... Может, тему как-то по-другому надо создать?

14 Ответы

0 голосов
ответил 13 Апр, 04 от bodom (660 баллов)
Что меня ещё очень сильно смущает, так это вот что:
Я эту же линию l использую в том же скрипте для построения профиля местности, по которой она идёт.
section = s.InterpolateZ(l)
Ну, естественно, для построения ещё куча всего используется, но отталкиваясь от этой section. Она имеет строго ту длину, на которую я отвожу мышку от стартовой точки p1 на виде... Да и профиль строится правильно.
Мне, блин, до успешного окончания работы остаётся только прорисовать саму линию на виде :)
0 голосов
ответил 14 Апр, 04 от bodom (660 баллов)
Спасибо, Ведьмак, большое - всё заработало в новом виде, теперь мой таск завершён image
и всё же я не могу вот этого понять:
Есть у меня вид спроецированный, трансверс меркатор.
Как я уже писал, я на нём выбираю две точки, вторая по умолчанию спроецирована, первую ReturnProjected(theView.GetProjection) засовывает вроде бы тоже в ту же проекцию того же вида. Строю от первой до второй линию.
На исходном виде она не отображается, ладно, копирую в другой вид с проекцией None, она отображается. Координаты начальной и конечной точки равны тем и другим в исходном виде. Численно.
В новом виде тем же скриптом, только без ReturnProjected, линия замечательно перерисовывается, ну тут уж ей просто некуда деваться...

Внимание, вопросы: как это понимать? какая под это подведена теория? Почему я не могу нарисовать линию по проецированному виду, если обе точки в него спроецированы?
И как мне теперь добавить в новый вид, который в никакой проекции, точки с координатами в десятичных градусах? Или, соответственно, получить координаты нужных мне точек с вида в десятичных градусах? (ну это очень факультативно, но в свете перечисленных вопросов интересно)
0 голосов
ответил 14 Апр, 04 от Vedmak (2,340 баллов)

Каждая проекция в арквью имеет свой bounds. Например, для наглядности возьмем проекцию Orthographic. Загрузим в вид файл мира из самплов. Если центральный меридиан и базовая широта проекции равны 0, то мы никак не можем найти на этом виде Аляску не меняя параметры проекции. Примерно то же получилось и у тебя, судя по всему. Хотя... Я вот щас подумал - если ты все-таки правильно считываешь точку с мышки - то хотя-бы кусок линии должен торчать... Не знаю, не знаю... Проверь скрипт все-таки.

0 голосов
ответил 14 Апр, 04 от bodom (660 баллов)
Иду ва-банк :)
Вот он скрипт:
theView = av.FindDoc("2D") ' av.FindDoc("view1")

srcTin = SrcName.Make(projDir + "shapes\newtin2")
s = Surface.Make (srcTin)

srcMainPoint = SrcName.Make(projDir + "shapes\main_point.shp")
MainPointFTab = FTab.Make(srcMainPoint)
p1 = MainPointFTab.ReturnValue(MainPointFTab.findField("Shape"),0)
'вот тут была оперрация проецирования, я её уже убил...
xfirst = p1.GetX
yfirst = p1.GetY


p2 = theView.GetDisplay.ReturnUserPoint
xlast = p2.GetX
ylast = p2.GetY


l = PolyLine.Make({{p1,xlast@ylast}})

' этот фрагмент нужен для определения параметров профиля
dx = xlast-xfirst
dy = ylast-yfirst
r = ((dx*dx)+(dy*dy)).Sqrt
if (dy = 0) then
if (dx > 0) then azimut = 90
else azimut = 270
end 'if
else
ugol = (dx/dy).ATan.AsDegrees
if ((dy >= 0) and (dx >= 0)) then azimut = ugol end 'if
if ((dy <= 0) and (dx >= 0)) then azimut = 180 + ugol end 'if
if ((dy <= 0) and (dx <= 0)) then azimut = 180 + ugol end 'if
if ((dy >= 0) and (dx <= 0)) then azimut = 360 + ugol end 'if
end 'if


section = s.InterpolateZ(l)

'изменения в main_line
MLsrc = SrcName.Make (projDir + "shapes\main_line.shp")
MainLineFTab = FTab.Make(MLsrc)
'l_old = MainLineFTab.ReturnValue(MainLineFTab.findField("Shape"), 0)
if (MainLineFTab.IsEditable.Not) then
MainLineFTab.SetEditable(TRUE)
MainLineFTab.StartEditingWithRecovery
MainLineFTab.SetValue(MainLineFTab.findField("Shape"), 0, l)
MainLineFTab.StopEditingWithRecovery(TRUE)
MainLineFTab.SetEditable(FALSE)
end
theView.Invalidate

Ну и где тут можно напутать? image
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...