На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Странности с преобразованием координат

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3
RSS
Странности с преобразованием координат, ошибка или так задумано?
 
Вы используете одни и те же переменные xx и yy для обоих случаев.

Но в первом случае у Вас в них сначала заносится координата курсора, с приведением к метрам с помощью MouseXY (хотя из примера не очевидно, какой вид координат задан на вход, какой на выход):
MouseXY.SetPoint(MapView.MapLeft + xx, MapView.MapTop + yy);
MouseXY.GetPoint(ref xx, ref yy);
После mapPlaneToGeo42 в xx и yy радианы.
Затем Вы из преобразуете в градусы.

Во втором случае утверждается, что в xx и yy лежат пикселы:
MapPoint.PlaceInp = TxPPLACE.PP_PICTURE;
MapPoint.SetPoint(xx, yy);

Как они туда попали из примера не понятно. Также не ясно, учтено ли смещение для координат относительно угла окна карты (MapView.MapLeft, MapView.MapTop).
Еще не совсем понятно, зачем тут компонент MapEditMetric, если нет интерактивного заполнения метрики объекта с его помощью.

Поэтому следует проверить какие координаты, в какой системе и в каком виде используются в первом и во втором случаях.
 
 Спасибо за разъяснения! Помогло!
Но для меня до сих пор загадка как имея координаты объекта в формате (x=50.0883 и y=73.6532, а также ключ объекта из классификатора  = 610) нанести его на карту, да так чтобы все совпало???
Я так понимаю, что необходимо эти координаты перевести в пиксели если да, то как это сделать не знаю!!
Вот по значению e.x и e.y добавляет объект, а по координатам объект улетает куда то в сторону))))
Как быть???
 
Для начала следует различать, какие значения Вы понимаете под координатами.

Формат "x=50.0883 и y=73.6532" наталкивает на мысль, что то градусы, хотя могут быть вариации.

Координаты могут быть:
- в метрах на местности;
- в виде широты/долготы (радианы);
- в пикселах экрана.

Нужное значение надо установить а параметр MapPoint.PlaceInp перед тем, как передать MapPoint в MapObj.Metric.Append.

Но!
Перед этим, если у Вас на входе градусы, то они должны быть преобразованы в радианы.
Если у Вас пиксели экрана внутри окна карты, то к ним надо прибавить смещение карты в этом окне (MapView.MapLeft и MapView.MapTop).

Работа с экранными координатами возможна только "здесь и сейчас" - то есть только при текущем масштабе отображения и текущем смещении карты в окне.

На уровне ГИС-ядра работа с метрикой выполняется только в метрах или в радианах (в зависимости от заданных в паспорте карты параметров).

Метод MapObj.Metric.Append автоматически сохранит нужные координаты так, как этого требует карта.
Главное - правильно указать исходные координаты в MapPoint.SetPoint и корректно задать их тип в MapPoint.PlaceInp.
 
Суть такова, что у меня есть небольшая БД с наименованием населенного пункта, его координаты (широта / долгота) и краткое описание к нему.
Далее я чекаю необходимые мне населенные пункты из списка, забираю их координаты и присваиваю им ключ объекта из классификатора, после чего данные объекты появляются на карте согласно полученным координатам.
Вот мой код по добавлению чекнутых населенных пунктов (я пишу на C#)

private void CreateObj(double latitude, double longitude) ...... Вот чего здесь я неправильно делаю, а что не понимаю уже 4 день бьюсь не получается
       {
           MapSelectObjectRsc.Show();
           MapPoint.PlaceInp = TxPPLACE.PP_PLANE;
           MapPoint.SetPoint(latitude, longitude);
           MapObj.Metric.Append(0, MapPoint.C_CONTAINER);
           MapObj.Commit();
           MapView.Refresh();
       }

       /// <summary>
       /// Нанесение выбранного населенного пункта на карту по координатам
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void AddSubdivision_ItemClick(object sender, ItemClickEventArgs e)
       {
           using (var f = new EditText())
           {
               if (f.ShowDialog() != DialogResult.OK) return;
               var list = f._list;
               foreach(var s in list) CreateObj(s.Breadth, s.Longitud);
           }
           MapObj.Commit();
           MapView.Refresh();
       }

А при движении мышкой по карте получаю координаты вот так

private void MapView_OnMapMouseMove(object sender, AxaxGisToolKit.IaxMapViewEvents_OnMapMouseMoveEvent e)
       {
           if (!MapView.MapShow) return;
           xx = e.x;
           yy = e.y;
           slMap1.Text = MapView.MapName;
           slMap2.Text = "1 : " + MapView.ViewScale;
           MouseXY.SetPoint(MapView.MapLeft + xx, MapView.MapTop + yy);
           MouseXY.GetPoint(ref xx, ref yy);//получаем в метрах
           Program.ConvertCoordinates.mapPlaneToGeo42(MapView.MapHandle, ref xx, ref yy);
           xx = xx * 180 / Math.PI;
           yy = yy * 180 / Math.PI;
           slMap3.Text = "Широта= " + Math.Round(xx, 7);
           slMap4.Text = "Долгота= " + Math.Round(yy, 7) + "   (СК42)";
       }

Как быть подскажите и желательно кодом!! Буду Вам благодарен!
1.1.PNG (26.63 КБ)
 
Судя по скриншоту, координаты у Вас в геодезической системе координат - широта/долгота в градусах с долями.

Вы же почему-то настойчиво указываете компоненту MapPoint, что передаете в него метры:
MapPoint.PlaceInp = TxPPLACE.PP_PLANE;

А надо преобразовать градусы в радианы и сказать об этом компоненту MapPoint:
MapPoint.PlaceInp = TxPPLACE.PP_GEO; (при условии, что координаты в БД в той же СК, что и в паспорте карты, например - и там, и там 42 год)
или
MapPoint.PlaceInp = TxPPLACE.PP_GEOWGS84; (это если координаты в БД в WGS84)

И только затем установить координаты в радианах в MapPoint, при этом первая координата передается X или широта, вторая Y или долгота (для метров или радиан соответственно):
MapPoint.SetPoint(latitude, longitude);

Рекомендую пользоваться справочными системами по используемым продуктам. Также в составе GIS ToolKit Active есть множество примеров с исходными кодами.

Из документации по GIS ToolKit Active -
описание вариантов значений TxPPLACE:
Цитата
Перечислимый тип TxPPLACE
Применяемая система координат
Значения
PP_MAP         = $0000;        // Координаты точек в системе карты в дискретах
PP_PICTURE  = $0001;        // Координаты точек в системе изображения в пикселях
PP_PLANE     = $0002;        // Координаты точек в плоской прямоугольной  системе на местности в метрах
PP_GEO        = $0003;        // Координаты точек в геодезических координатах в радианах
PP_GEOWGS84 = $0004;        // Координаты точек в геодезических координатах в радианах WGS84
 
Спасибо большое за помощь я понял в чем была моя ошибка!!
Данная тема может быть закрыта!! Все доброго!
Страницы: Пред. 1 2 3
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности