returnstart, returnoffset

0 голосов
спросил 01 Март, 05 от Гость (210,080 баллов) в категории Программные продукты Esri

Добрый день! Помогите, пожалуйста, разобраться с проблемой.

Если я создаю полилинию, а потом с помощью команд returnstart ,returnend пытаюсь определить начало и конец линии,  результаты получаю неадекватные. Даже если линия состоит всего из 2х точек - начальной и конечной, то результат запроса в некоторых случаях получается обратный ожидаемому. Такое впечатление, что он зависит от направления линии относительно системы координат.

На сайте esri.com я видела аналогичные вопросы, но т.к. английским владею не в полной мере, хочу уточнить еще здесь - это действительно ошибка ArcView?

Эта же проблема возникла у меня при использовании returnoffset (куда будет "вправо", а куда "влево" должно по видимости определяться направлением исходной линии), но по этому поводу я не нашла ничего.

Если кто-то сталкивался с подобными проблемами и может мне что-то подсказать, то буду очень благодарна.

 

6 Ответы

0 голосов
ответил 01 Март, 05 от crocodile (2,120 баллов)
Returns a new PolyLine which is the left or right linear offset of the aPolyLine. The offset is towards the left when aOffset < 0 and is towards the right when anOffset > 0.


Syntax
aPolyLine.ReturnOffset (anOffset)

Returns
PolyLine

Полилиния - банальный список списков точек, следовательно он имеет начало и конец (номера элементов списка) система координат ни при чем, но если у тебя сильно извилистая линия, то могут быть разные фокусы с ее пересчетом. Те, в какой последовательности точки ставились/задавались, туда и линия "смотреть" будет. (Ежели чего, то всегда есть flip ;) ) А вообще неплохо бы код в студию (не в .Net, а сюда)

Да и еще к сведению, класс PolyLine, в отличие от LIne, не имеет методов ReturnStart и ReturnEnd, для того чтобы получить начало и конец ПОЛИЛИНИИ надо, как вариант, преобразовать линию в список (возможны разные варианты) и получить первый и последний элементы в списке.
0 голосов
ответил 01 Март, 05 от Гость (210,080 баллов)

Синтаксис returnoffset и описание команды мне известны, фокусы начинаются при реальном использовании.

Про отличие line от polyline мне тоже известно, естественно я использую .asline перед returnstart. Вообще в данном случае я веду речь о полилиниях состоящих из 2х точек, но в рамках общей концепции задачи мне удобнее  использовать polyline.

Я бы подумала что куда-то не въехала, но на сайте Esri.com нашла обсуждение этой же проблемы и решение, кстати (использовать along(0) и  along(100)). Но вопрос остался - эти-то команды не работают что ли? И с returnoffset  обнаружилась аналогичная проблема.

Код послать не проблема,  только извлеку его из всей задачи.

 

 

0 голосов
ответил 01 Март, 05 от crocodile (2,120 баллов)
Чтобы сильно не мучться я бы сделал так

p_first = PolyLine.AsMultipoint.AsList.get(0)

p_last = PolyLine.AsMultipoint.AsList.get(PolyLine.AsMultipoint.AsList.Count -1)

Работать будет уж точно побыстрее чем с алонгами

Вообще странная проблема, я в свое время писал какие-то скрипты основанные как раз на фокусе с оффсетом (содержания по скважинам и картограммы г/ф полей по профилям) ни единой проблемки не возникло все корректно работало.

И еще, там у тебя с проекцией точно все в порядке? Все проецируется и депроецируется когда надо?
0 голосов
ответил 02 Март, 05 от Гость (210,080 баллов)

Вчера не успела скинуть код, отключили.

Вот маленький тестовый фрагментик, пока без оффсета, про старт, энд:

myview=av.getactivedoc
tems={}
tems=myview.getthemes
number.setdefformat("dddddddd.dd")

prot=av.getproject.getfilename.returndir.asstring+"\"+"pr_11.txt"
if (file.exists(prot.asfilename)) then
file.delete(prot.asfilename)
end
lf=linefile.make(prot.asfilename, #file_perm_write)
lf.writeelt("Протокол ... от "++date.now.asstring)

vo2=tems.get(0)
ftline=vo2.getftab
fshl=ftline.findfield("shape")
fidl=ftline.findfield("lin_id")
for each i in ftline
shl=ftline.returnvalue(fshl,i)
ff=ftline.returnvalue(fidl,i)
lf.writeelt("N lin="+ff.asstring)
lf.writeelt("start="+shl.asline.returnstart.asstring++"end="+shl.asline.returnend.asstring)
end

Запускаю это дело на линейной теме, которая создана по точечной. В точечной все точки были набиты строго по порядку, по часовой стрелке. В линейной, если линию заменить в легенде на линию со стрелками, все стрелки идут по часовой стрелке. И тем не менее получаю в результате вот такой протокол, привожу фрагмент:

Протокол ... от  Wed Mar 02 08:31:32 2005
N lin=00000001.00
start=Point: 04209153.91 05586159.76 end=Point: 04209209.99 05586187.12
N lin=00000002.00
start=Point: 04209209.99 05586187.12 end=Point: 04209388.22 05586152.50
N lin=00000003.00
start=Point: 04209388.22 05586152.50 end=Point: 04209513.49 05586142.55
N lin=00000004.00
start=Point: 04209546.51 05585905.05 end=Point: 04209513.49 05586142.55
N lin=00000005.00
start=Point: 04209475.80 05585932.60 end=Point: 04209546.51 05585905.05
N lin=00000006.00
start=Point: 04209400.41 05585934.85 end=Point: 04209475.80 05585932.60

Все линии идут нормально до 4ой - конечная точка ее равна коечной точке 3ей линии, и дальше пошли в другом направлении. Потом дальше еще 1 такой же поворот происходит. Ничего не понимаю. А?

За рекомендации спасибо, еще не обдумывала.


 

0 голосов
ответил 02 Март, 05 от crocodile (2,120 баллов)
myview=av.getactivedoc
    
    'tems={} излишне
    
    tems=myview.getthemes ' объявление и инициализация переменной в одном месте
    
    number.setdefformat("dddddddd.dd")
    
          prot=av.getproject.getfilename.returndir.asstring+"\"+"pr_11.txt"
   
          if (file.exists(prot.asfilename)) then
            file.delete(prot.asfilename)
          end
                 
    ' если tems в коде больше не используется то
    ' vo2=av.getactivedoc.getthemes(или даже getactivethemes).get(0)
    ' зачем лишние переменные? в хелпе к Авеню
    ' так сделано исключительно в учебных целях
    ' да и .getftab можно тудаже приписать
    vo2=tems.get(0)
       
    ftline=vo2.getftab
   
    fshl=ftline.findfield("shape")       
                                          
   ' fidl=ftline.findfield("lin_id")       
   
' всю работу с одним файлом лучше в
' коде помещать в одно место, легче разбирать что
' к чему
    lf=linefile.make(prot.asfilename, #file_perm_write)
    
    lf.writeelt("Протокол ... от "++date.now.asstring)   

' я бы порекомендовал вместо i писать
' rec так больше понятно читающему, хотя
' функционально - значения не имеет
        for each i in ftline                                                                           
          shl=ftline.returnvalue(fshl,i)
          'ff=ftline.returnvalue(fidl,i)
          'lf.writeelt("N lin="+ff.asstring)
          
          ' такой код действительно косячит :( удивительно
          ' что-то у них концы с концами не сходятся ;) буду знать
          ' lf.writeelt("start="+shl.asline.returnstart.asstring++"end="+shl.asline.returnend.asstring)

          
          ' вот так сработает, но get(1) разумнее заменить на get(shl.asmultipoint.aslist.count-1)
          lf.writeelt("start="+shl.asmultipoint.aslist.get(0).asstring++"end="+shl.asmultipoint.aslist.get(1).asstring)
          
          'это же самое он тебе графикой в виде нарисует чем лог писать, можно и линии на экране посмотреть
          'av.getactivedoc.getgraphics.add(graphicshape.make(polyline.Make({{shl.asmultipoint.aslist.get(0),shl.asmultipoint.aslist.get(1)}})))
        end
    lf.close
             
Протокол ... от Wed Mar 02 12:52:08 2005
start=Point: 14794700.13 68300183.80 end=Point: 22760511.25 77192252.02
start=Point: 22760511.25 77192252.02 end=Point: 35728110.73 81453034.71
start=Point: 35728110.73 81453034.71 end=Point: 53512247.17 80156274.76
start=Point: 53512247.17 80156274.76 end=Point: 67961858.02 69041189.49
start=Point: 67961858.02 69041189.49 end=Point: 72037389.29 53294818.69
start=Point: 72037389.29 53294818.69 end=Point: 62404315.39 40512470.62
start=Point: 62404315.39 40512470.62 end=Point: 39803642.00 38845207.83
start=Point: 39803642.00 38845207.83 end=Point: 29800065.25 43476493.36
start=Point: 29800065.25 43476493.36 end=Point: 20352242.77 50145544.53
start=Point: 20352242.77 50145544.53 end=Point: 15350454.40 59593367.01
start=Point: 15350454.40 59593367.01 end=Point: 14794700.13 68300183.80

Ну здесь все в комментариях, ежели чего то спрашивай
0 голосов
ответил 02 Март, 05 от Гость (210,080 баллов)

Благодарю за "разборку"!image 

Т.к. along в моем случае работает моментально, то менять я уже ничего не буду, но учту на будущее и этот способ. И чего он мне самой в голову не пришел?

Претензии к оффсету снимаю. Я тут выяснила, что дело не в нем, а в том, что исходная линия, до того сдвигаемая по move, совершенно потрясающим образом иногда меняет ориентацию!image Причем выглядит она (без стрелочек) совершенно адекватно. Я тут сама еще покопаюсь, если уж упрусь в стенку, то спрошу.image

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