RUS  ENG 

GetConvertPoint

Страницы: 1
RSS
GetConvertPoint
 
Пытаюсь преобразовать координаты между системами.


const eEllipsoidKrassovsky = 3
const eCoordTransformPositionVector7Parameter = 2
const eCoordTransformToPZ90 = 3
const eProjTransverseMercator = 4

Function CK42CRS(Lon0, FE, FN)
Set crs = CreateObject("ZuluLib.CRS")
Set datum = crs.GetDatum()
Set ellipsoid = datum.GetEllipsoid()
ellipsoid.SetByCode eEllipsoidKrassovsky
With datum
.dX = 25.0
.dY = -141
.dZ = -80.0
.Rx = 0
.Ry = -0.35
.Rz = -0.66
.dS = 0
.TransformMethod = eCoordTransformPositionVector7Parameter
.TransformTo = eCoordTransformToPZ90
.SetEllipsoid ellipsoid
End With
crs.SetDatum datum
crs.ProjectionType = eProjTransverseMercator
crs.Lon0 = Lon0
crs.FE = FE
crs.FN = FN
Set CK42CRS = crs
End Function

Set CRS1 = CK42CRS(136.71666666666666666666666666667, 3300000, -4916586.44)
X1 = 466789.297151777719 : Y1 = 3184459.28832338052
Set CRS2 = CK42CRS(135.0, 0, 0)
Set pt2 = CRS1.GetConvertPoint(X1, Y1, CRS2)


В результате pt2 в точности равна X1, Y1. А центральный меридиан и смещения другие.
Ничего не понимаю. Может быть, я где-то забыл указать, что координаты в метрах, а не в градусах? Но не пойму как.
 
У нас ошибка. Завтра подправим. Идет сравнение проекций и если у них датумы равны, то и преобразования не происходит. А датумы у обоих равны Custom :)
Можно было бы в два этапа, сперва в CRS1 в WGS84, а из нее в CRS2, но там, смотрю тоже ошибка, т.к. нужно добавить функцию типа CRS.Commit или CRS.Update, которая бы завершила подготовку внутренних переменных проекции к работе. А так все присвоили, а внутренние переменные не инициализировались как надо. В Zulu-то внутри все это делается. А объектной моделью по проекциям практически никто не пользовался.
 
А нет, можно через промежуточную предопределенную проекцию. Если SetDatum вызывать последним после присвоения всего остального, тогда инициализация CRS происходит:


const eEllipsoidKrassovsky = 3
const eCoordTransformPositionVector7Parameter = 2
const eCoordTransformToPZ90 = 3
const eProjTransverseMercator = 4

Function CK42CRS(Lon0, FE, FN)
Set crs = CreateObject("ZuluLib.CRS")
Set datum = crs.GetDatum()
Set ellipsoid = datum.GetEllipsoid()
ellipsoid.SetByCode eEllipsoidKrassovsky
With datum
.dX = 25.0
.dY = -141
.dZ = -80.0
.Rx = 0
.Ry = -0.35
.Rz = -0.66
.dS = 0
.TransformMethod = eCoordTransformPositionVector7Parameter
.TransformTo = eCoordTransformToPZ90
.SetEllipsoid ellipsoid
End With

crs.ProjectionType = eProjTransverseMercator
crs.FE = FE
crs.FN = FN
crs.Lon0 = Lon0
crs.SetDatum datum

Set CK42CRS = crs
End Function

Sub Mike()

Set CRS1 = CK42CRS(136.71666666666666666666666666667, 3300000, -4916586.44)
X1 = 466789.297151777719 : Y1 = 3184459.28832338052
Set CRS2 = CK42CRS(135.0, 0, 0)

Set crs84 = CreateObject("ZuluLib.CRS")

crs84.InitByCode "EPSG:4326"

Set pt2 = CRS1.GetConvertPoint(X1, Y1, crs84)

msgbox pt2.y

Set pt2 = crs84.GetConvertPoint(pt2.x, pt2.y, CRS2)

msgbox pt2.y

End Sub

Что там за числа получаются не знаю, но какие-то отличные от исходных.
 
Спасибо, заработало! И даже без промежуточного WGS84, только с переносом SetDatum в конец.
Может быть, воткнуть crs.Commit во что-то вроде копирующего конструктора, чтобы автоматом вызывалось? Или таки добавить явно, чтобы уж без ошибок.
 
Втемную теперь будет правильно работать.
 
Здравствуйте. Подскажите, пожалуйста, как программно определить в компоненте ZCNTaskWinCtrl какие источники выбрал пользователь или как выделить теплосеть для выделенного источника перед началом расчета? Заранее благодарю.
 
ZCNTaskWinCtrl предназначен для интерактивной работы. Это диалог, который не программируется. Программно можно работать через ZCNTaskThermo (ZCNTaskThermoCtrl), ZCNTaskHydro (ZCNTaskHydroCtrl) и т.д.
Страницы: 1