Проблема с Определением направления в ArcGis 8.3

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Проблема с Определением направления в ArcGis 8.3

Сообщение GY-GY » 19 июн 2007, 08:45

Случайно обнаружил, что направление между двумя точками определяются не верно. Обнаружилось это когда 2 точки имели одинаковую долготу и вместо ожидаемого 180 ArcMAP выдал 178,2.

Система карты - Пулково 42.

Включил градусную сетку - точки действительно нанесены на одном меридиане, а вот сама градусная сетка несколько повернута относительно фрейма. Получается, что направление определяется относительно фрейма? Как мне получить правильный результат, или какие настройки крутить?

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 25 июн 2007, 16:02

нарыл калькулятор:
http://www.ian-ko.com/downloads/EasyCal ... late50.zip
полезная штука -намного обещает облегчить жизнь :!:

там есть аж три выражения на интересующую меня тему
polyline_Get_Azimuth.cal
polyline_Get_Azimuth2.cal
polyline_Get_Azimuth_8х.cal

но все они выдали тот же неверный результат .
скорее всего он правильный но не совсем тот который нужен.
Подозреваю, что это связано как-то с проекцией.
Видно на каком-то этапе что-то сделано не верно или вообще не сделано. Подскажите на что обратит внимание?

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

Сообщение Максим Дубинин » 26 июн 2007, 02:05

обратить внимание на СК:
а) самих данных
б) фрейма в который они загружены

азимут может расчитываться по-разному в зависимости от того, истинный это азимут, начальный или просто угол в некой СК:
http://gis-lab.info/qa/diff-calc.html

Беру две точки на одной долготе:
0,0
0,50
Использую ec50\calculate\polyline_Get_Azimuth2.cal, получаю результат = 180. Причем оставляю по умолчанию:

Код: Выделить всё

'bSrefFromMap = False ==> the length will be calculated in the projection of the data
СК данных у меня - WGS84.

А что получается у вас?
пристегивайтесь, турбулентность прямо по курсу

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 26 июн 2007, 08:03

У меня так:

фрейм:
Pulkovo_1942_GK_Zone_7
Gauss_Kruger
False_Easting: 7500000.000000
False_Northing: 0.000000
Central_Meridian: 40.000000
Scale_Factor: 1.000000
Latitude_Of_Origin: 0.000000

слой:
Система координат:
Gauss_Kruger
False_Easting: 7500000.000000
False_Northing: 0.000000
Central_Meridian: 40.000000
Scale_Factor: 1.000000
Latitude_Of_Origin: 0.000000
GCS_Pulkovo_1942
Датум:D_Pulkovo_1942
Начальный меридиан:0

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

затем, строю в слое полилинии, привязывая начало и конец к введенным точкам.

пытаюсь получить истинный азимут из начальной точки в конечную, а похоже получается некий угол.

Для двух точек имеющих одинаковую долготу 41,6222
азимут получается 178.7899

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

Сообщение Максим Дубинин » 26 июн 2007, 23:44

Gauss_Kruger
Ну вот вам и ответ.
Попробуйте тоже вычисление произвести в любой ГСК или Mercator, для той же линии, получите 180.
пристегивайтесь, турбулентность прямо по курсу

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 27 июн 2007, 16:02

sim писал(а):Gauss_Kruger
Ну вот вам и ответ.
На сколько мне известно, то проекция Гаусса-Крюгера, является равноугольной - т.е. не искажает углы.
я получаю все таки скорее всего начальный азимут, а мне нужен постоянный.

Мне кажется, что задача решаема.
Применительно к выражению Azimuth2

'polyline_Get_Azimuth2.cal
'Author: Ianko Tchoukanski
'http://www.ian-ko.com
'=========================
On Error Resume Next
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pCurve As ICurve
Dim pPoint1 As IPoint, pPoint2 As IPoint
Dim dDistance1 As Double, dDistance2 As Double
Dim bAsRatio1 As Boolean
Dim pVector As IVector3D
Dim dAzimuth As Double
Dim dDelta As Double
Dim Pi As Double
Dim bSrefFromMap As Boolean
'=======================
'adjust the parameters below
'bSrefFromMap = True ==> the length will be calculated in the projection of the Map
'bSrefFromMap = False ==> the length will be calculated in the projection of the data
'bSrefFromMap needs to be True only if a real distance in Map units will be used - bAsRatio = False
bSrefFromMap = False
dDistance1 = 0# 'Indicates the start point of the line. Change the value to perform calculations for a different point.
bAsRatio = True ' the distance above will be used as a ratio from the total length. Change to false to input an absolute distance.
dDelta = 0.000001 'A small tolerance - no change of direction expected within this tolerance
'========================
dDistance2 = dDistance1 + dDelta
Pi = 4 * Atn(1)
If (Not IsNull([Shape])) Then
Set pCurve = [Shape]
If (Not pCurve.IsEmpty) Then
If (bSrefFromMap) Then
Set pMxDoc = ThisDocument
Set pMap = pMxDoc.FocusMap
pCurve.Project pMap.SpatialReference
End If
Set pPoint1 = New Point
pCurve.QueryPoint 0, dDistance1, bAsRatio, pPoint1
Set pPoint2 = New Point
pCurve.QueryPoint 0, dDistance2, bAsRatio, pPoint2
Set pVector = New Vector3D
pVector.ConstructDifference pPoint2, pPoint1
dAzimuth = pVector.Azimuth
dAzimuth = dAzimuth * 360 / (2 * Pi)
End If
End If

Нам мой взляд в место мизерного приращения из начальной точки (dDelta = 0.000001 )
надо использовать конечную точку линии.
А вот как ее извлечь пока незнаю.

данная команда:
Set pCurve = [Shape]
выгружает данные из поля "Shape" в массив? а где там что сидит? ( во блин, предложение из одних союзов получилось :) )

или может я иду не в том направлении?

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

Сообщение Максим Дубинин » 27 июн 2007, 17:01

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

проведите такой эксперимент. Cделайте 2 линии в ГСК-WGS84:
1. c постоянной долготой 39
2. c постоянной долготой 36 (или возьмите свою 41)

Потом спроектируйте вид в GK Zone 7.

Попробуйте, напишите, что получится.
пристегивайтесь, турбулентность прямо по курсу

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 28 июн 2007, 07:41

Т.е. вы хотите сказать, что когда я ввожу данные, то у ARCGIS
хватает мозгов, чтобы пересчитать их в проекцию, а когда мне нужно провести измерения, то обратно эти данные не пересчитываются, а тупо мерятся по проекции?
или все же инструмент позволяет это делать, только надо его предупредить обэтом.
Как сказать ARCGISу, что мне нужен азимут померянный не по проекции , а истинный? не уж то он не может на лету конвертнуть пару точек?

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

Сообщение Максим Дубинин » 28 июн 2007, 21:05

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

Дело не в мозгах, их у ArcGIS нет :) Тот же результат вы бы получили, думаю в любой другой ГИС. Во-вторых, постоянный азимут весьма специфичная вещь и я бы, например, не хотел, чтобы программа всегда пыталась мне его подсовывать. Здесь мы бы имели дело с "принятием решения программой за пользователя".

Дело в том, какой алгоритм расчета используется и в какой системе координат находятся данные. Те скрипты что вы приводили все используют простую теорему косинусов:
http://gis-lab.info/qa/aveazimuth.html

Если вам нужны истинный азимут, то самое простое - используйте проекцию Mercator, все прямые в ней - линии румба (это НЕ так в ГК, надеюсь это ясно из примера).

Другой вариант, более сложный, можно использовать формулы определения постоянного (истинного) азимута и для 3D координат вида долгота/широта:
http://gis-lab.info/qa/angles-rhumb.html
пристегивайтесь, турбулентность прямо по курсу

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 29 июн 2007, 06:55

Наверно, я изначально задал неверно вопрос.

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

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

Попутно еще один вопрос, где почитать какие атрибуты живут в поле геометрии?

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

Сообщение Максим Дубинин » 29 июн 2007, 07:26

Почему мы используем эту проекцию а не другую - это к делу не относится.
Весь предыдущий разговор был об этом, "вы спросили, почему у меня в ГСК 180, а в ГК не 180", ответ - "потому что это ГК, был бы меркатор, было бы 180".
И каждый раз когда мне надо определить направление, конверитить данные в другую проекцию - тоже не выход
Пoчему нет? Это общепринятая практика - подбирать проекцию под задачу.

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

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 29 июн 2007, 12:52

sim писал(а):
И каждый раз когда мне надо определить направление, конверитить данные в другую проекцию - тоже не выход
Пoчему нет? Это общепринятая практика - подбирать проекцию под задачу.
Как оказалось - это совсем не обязательно!

Ларчик просто открывался.
как я и подозревал, в ARCGIS это все заложено и не надо изобретать велосипед.
Итак, данные у нас живут в проекции Гаусса-Крюгера - поэтому
система координат слоя она и указана (это обязательно).
При добавлении данных к карте системе координат фрейма по умолчанию присваивается такая же. И мы видим на экране меридианы сходящиеся к полюсу, вроде все так и должно быть. Тогда зачем система прописана 2 раза в разным местах? оказывается как раз именно для решения задач аналогичных моей.
Достаточно задать во фрейме другую систему и GIS на лету будет пересчитывать исходные данные в новую систему кординат. Заметьте данные остались в ГК и ими одновременно можно пользоваться в других проектах ( не надо конвертить или создавать дубликаты).
В то же время не надо извращаться со скриптами.

И в КАЛЬКУЛЯТОРЕ это учтено:
'bSrefFromMap = True ==> the length will be calculated in the projection of the Map
'bSrefFromMap = False ==> the length will be calculated in the projection of the data

Поставил "Да" вычиления будут производится над данными фрейма
Поставишь "Нет" - вычиления будут производится над данными слоя

Потерял полторы недели, зато как по-умнел :roll:

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

Сообщение Максим Дубинин » 29 июн 2007, 18:21

Как оказалось - это совсем не обязательно!
Ну как это не обязательно, если вы, в конце концов и сделали то, о чем я вам говорю на протяжении последних 3-4 сообщений - поменяли проекцию, не важно, проекция это данных или вида (фрейма данных), как вы правильно заметили, скрипты (с которыми вам возиться все-таки пришлось, выражение для калькулятора = скрипт) умеют работать и с тем и с тем.
пристегивайтесь, турбулентность прямо по курсу

GY-GY
Интересующийся
Сообщения: 15
Зарегистрирован: 24 авг 2006, 07:45
Репутация: 0

Сообщение GY-GY » 02 июл 2007, 11:41

Просто, я до этого не знал, что система фрейма,может отличаться от системы данных. Можно было просто ткнуть пальцем :!:
Все равно, большое спасибо, что помогли разобраться бестолковому...

Ответить

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

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

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