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

Сохранение долготы усл. знака происходит не точно

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Сохранение долготы усл. знака происходит не точно
 
Добрый день.
При каждом новом цикле записи/чтения точки усл. знака сбивается долгота. Данная проблема встречается не на всех картах. По ссылке пример с подробной инструкцией для воспроизведения поведения. Сборка gisdesigner под ARM.
https://drive.google.com/file/d/1ducJvh7vu0c97LTx1SweeJzfsh1GCHcp/view?usp=sharing
 
Цитата
Nikita Sarychev написал:
Добрый день.
При каждом новом цикле записи/чтения точки усл. знака сбивается долгота. Данная проблема встречается не на всех картах. По ссылке пример с подробной инструкцией для воспроизведения поведения. Сборка gisdesigner под ARM.
https://drive.google.com/file/d/1ducJvh7vu0c97LTx1SweeJzfsh1GCHcp/view?usp=sharing

Добрый день!

Для топографической карты важно удаление по долготе от осевого меридиана. На краях зоны погрешность пересчета координат составляет миллиметры.
Чем дальше удаляемся от осевого меридиана, тем больше погрешность в пересчете
С уважением, Демиденко Р.А.
 
Извините, но можно подробнее?  
 
Цитата
Nikita Sarychev написал:
Извините, но можно подробнее?  
Код
- для чтения координат:

// Запросить геодезические координаты точки в радианах в системе документа
// number - номер точки (начинается с 1)
// subject - номер подобъекта (если = 0, обрабатывается объект)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetGeoPoint(HOBJ info, DOUBLEPOINT * point,
long int number, long int subject);

- для записи координат:

// Изменить координаты точки метрики
// info - идентификатор объекта карты в памяти
// b,l - координаты точки в радианах
// number - номер обновляемой точки
// subject - номер подобъекта (если = 0, обрабатывается объект)
// Значение координат должно соответствовать системе координат,
// проекции и эллипсоиду карты
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapUpdatePointGeo(HOBJ info, double b, double l,
long int number, long int subject = 0);
С уважением, Демиденко Р.А.
 
В комментарии добавил вопросы:

Код
QTextCodec* codec = QTextCodec::codecForName( "KOI8-R");
        long list = mapGetSiteNumber( m_hMap, m_workingLayer);                          // Определить номер пользовательской карты в цепочке
        long objCount =mapGetObjectCount( m_hMap, list);                                // Запросить общее число объектов в листе
        long siteObjCount = mapGetSiteObjectCount( m_hMap, m_workingLayer);             // Запросить количество объектов в пользовательской карте
        qDebug() << "Objects count" << objCount << "siteObjCount" << siteObjCount;      
        HOBJ obj = mapCreateSiteObject( m_hMap, m_workingLayer);                        // Cоздать пустой объект пользовательской карты
        for( long i = 1; i <= siteObjCount; i++)
        {
            long key = mapGetSiteObjectKeyByNumber( m_hMap, m_workingLayer, i);         // Запросить уникальный идентификатор объекта по последовательному номеру объекта
            if( mapSeekSiteObject( m_hMap, m_workingLayer, obj, key) != 0)              // Поиск объекта по уникальному номеру на карте
            {
                QString objName = codec->toUnicode( mapObjectName( obj));
                qDebug() << "found object" << i << key << objName ;
                long pointCount = mapPointCount( obj, 0);                               // Запрос числа точек метрики объекта/подобъекта
                if( pointCount == 1)
                {
                    for( long j = 1; j <= pointCount; j++)
                    {
                        DOUBLEPOINT nextPoint;
                        if( mapGetGeoPoint( obj, &nextPoint, j, 0) != 0)                //Запрос в данном случае происходит в СК главной карты? Т.е. в СК .map карты, a не "111"?
                                                                                        //Получается, что координаты будут в СК-42?
                        {
                            m_objectPoint = QPointF( nextPoint.x * 180. / M_PI, nextPoint.y * 180. / M_PI); //Записываем текущие координаты в m_objectPoint
                            point = m_objectPoint;
                            qDebug() << QString( "mapGetGeoPoint %1; %2")
                                        .arg( m_objectPoint.x(), 0, 'f', 8)
                                        .arg( m_objectPoint.x(), 0, 'f', 8);
                        }
                    }
                    m_currentObject = obj;    // Записываем текущий объект
                    return;
                }
            }

        if( mapUpdatePointGeo( m_currentObject, m_objectPoint.x() * M_PI / 180., m_objectPoint.y() * M_PI / 180., 1, 0) == 0)     // В какой СК запишутся координаты? В СК главной карты, или в СК "111"? Координаты и объект те-же, что при чтении  
        {
            qDebug() << "FAIL write coordinates";
        }
        if( mapCommit( m_currentObject) == 0)   // Сохранить данные об объекте в карту
        {
            qDebug() << "FAIL commit object";
        }
 
Большинство функций, работающих с координатами, принимают и выдают значения в системе документа.
Изначально система документа соответствует первой открытой карте.
Ее можно изменить через вызов mapSetDocProjection.
Если первой открыта карта в СК-42, то и все функции работают в СК-42.

Ошибка возникает в 7 знаке по долготе в градусах. Это соотвествует нескольким миллиметрам на местности.
Она может возникать за счет пересчета датума с одной карты на другую (если в паспорте разные параметры датума)
и за счет пересчета геодезических координат в плоские прямоугольные (обычно возрастает при выходе за границы зоны топокарты).

Функции mapGetMapPlanePoint, mapUpdateMapPointPlane работают в системе координат карты в метрах, что исключает любые искажения.
Страницы: 1
Читают тему (гостей: 1)



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

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