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

[MAPAPI] Импорт SXF

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
[MAPAPI] Импорт SXF, Как правильно импортировать SXF.
 
Здравствуйте.
Как правильно работать с SXF?

Сталкивался с двумя вариантами  -
  1. SXF представляет из себя один лист карты, и при импортировании по первому SXF карта создаётся (ImportFromAnySxf), по всем другим карта обновляется с добавлением новых листов (UpdateFromAnySxf).
  2. SXF - большая карта, возможно без рамки, по типа  примеров карт областей РФ, полученных из OpenStreetMap (примеры в смысле  на сайте), и после импорта получается один sit файл
В первом варианте математическая основа карты у всех листов совпадает, и она корректная - под корректной я понимаю возможность создать многолистовую векторную топографическую карту (СК42 на эллипсоиде Красовского, или любую другую комбинацию, позволяющую делать многолистовую векторную карту, то есть в SXF файлах прописаны номенклатуры листов)

Во втором варианте номенклатура SXF листа совпадает с именем файла, то есть это Sit (однолистовая безрамочная карта), и из неё можно получить только такую карту.

И как быть если хочется из SXF файла который по факту должен импортироваться в Sit сделать многолистовую векторную карту?

Вот, допустим, если взять с сайта SXF файл Рязанской области, то в нём будет 200+ тысяч объектов (или 20+ тысяч, не помню) и указан масштаб 1:25000.
В многолистовой векторной карте (топографическая СК42 на элипсоиде Красовского) в масштабе 1:25000 получается 858 листов (недавно задавал вопрос про номенклатуры, это всё та же история).

Как я пытался делать - брал габариты SXF файла, пересчитывал их в СК42, вычислял зоны, в которых находится данные габариты (для Рязанской области - 7-ая и 8-ая зоны),
создавал пустую векторную Sit карту без рамки вроде (в СК42 на эллипсоиде красовского), указывал для неё одну из рассчитанных зон,
создавал на ней объект с замкнутой метрикой, вычислял список номенклатур для листов в таком масштабе,
создавал новую векторную MAP карту с одним из вычисленных листов, потом добавлял в неё все оставшиеся листы, и после этого пытался вызвать UpdateFromAnySxf, в надежде что все объекты будут перенесены
на MAP карту в требуемые зоны.
У функции UpdateFromAnySxf три режима работы (mode) - в одном из них функция отработала, но она, как я понял, просто работала с MAP файлом как с SIT файлом, судя по результату (в папке с картой была куча пустых листов и огромный MAP файл)
В двух других функция UpdateFromAnySxf не отрабатывала корректно, а в папке LOG я видел сообщение о не соответствии СК - что в принципе правильно, если я правильно понял как работать с Import/UpdateFromAnySxf.




Собственно, чтобы сделать MAP карту с требуемой мне математической основой, мне нужно сначала импортировать большой SXF в SIT карту,
потом создать MAP карту с набором листов и каким-то образом копировать объекты ?
Или это как-то по другому делается или вообще не возможно ?



Ещё я знаю про SetDocProjection, который позволит конвертировать на лету координаты в требуемую проекцию, но это не много не то. Мне бы хотелось именно MAP карту получить в требуемой мне проекции на требуемом мне эллипсоиде.
 
Коприую объекты из Sit, полученного из Sxf карты ингушении http://gisinfo.ru/download_map?id=19в многолистовую карту MAP в другой СК (СК-42, топографическая)
Код
    qDebug() << __FUNCTION__ << "objects on sit:" << objCount;
    int objCopied = 0;
    for (long objIdx = 1; objIdx <= objCount; objIdx++){
        qDebug() << __FUNCTION__ << "try read obj id:" << objIdx;
        if (panorama::mapReadObjectByNumber(hsite, hsite, hobj, 1, objIdx) == hobj){
            qDebug() << __FUNCTION__ << "try change map for obj with id:" << objIdx;
            if (panorama::mapChangeObjectMap(hobj, hmap, 0) != 0){
                objCopied++;
                panorama::mapCommitWithPlace(hobj);
                qDebug() << __FUNCTION__ << "current obj copied:" << objCopied << "next index:" << objIdx+1;
            }else{
                qDebug() << __FUNCTION__ << "can not change obj with id:" << objIdx;
            }
        }else{
            qDebug() << __FUNCTION__ << "can not read object by number with id:" << objIdx;
        }
    }
Если создаю MAP в масштабе 1:100000 - все объекты копируются (5000 с небольшим),если в меньшем масштабе - зависает на 358-ом объекте.
Код
importFromGenericSit current obj copied: 351 next index: 352
importFromGenericSit try read obj id: 352
importFromGenericSit try change map for obj with id: 352
importFromGenericSit current obj copied: 352 next index: 353
importFromGenericSit try read obj id: 353
importFromGenericSit try change map for obj with id: 353
importFromGenericSit current obj copied: 353 next index: 354
importFromGenericSit try read obj id: 354
importFromGenericSit try change map for obj with id: 354
importFromGenericSit current obj copied: 354 next index: 355
importFromGenericSit try read obj id: 355
importFromGenericSit try change map for obj with id: 355
importFromGenericSit current obj copied: 355 next index: 356
importFromGenericSit try read obj id: 356
importFromGenericSit try change map for obj with id: 356
importFromGenericSit current obj copied: 356 next index: 357
importFromGenericSit try read obj id: 357
importFromGenericSit try change map for obj with id: 357
importFromGenericSit current obj copied: 357 next index: 358
importFromGenericSit try read obj id: 358
importFromGenericSit try change map for obj with id: 358


И проблема в том что зависает - не крэшится, не возвращает ошибку, а просто зависает.
Карта ингушетии - пока единственная, которую я нашёл на которой процесс копирования завершился бы в принципе, на нескольких других (Рязанская область, орловская, магаданская) либо зависает на копировании объектов, либо зависает на вычислении листов, либо в принципе не может рассчитать листы по габаритам Sit карты.


Архив - Sit файл из которого копирую, MAP карта куда копирую, исходные SXF и RSC файлы
Изменено: Владимир Егоров - 12.07.2018 15:48:12
 
Здравствуйте!

Для нарезки карты на листы можно использовать функцию vecCutSiteToSheets (vecexapi.h):
Код
// Нарезать исходную карту по листам выходной карты                                    
// hmap  - идентификатор открытых данных
// hsite -  идентификатор открытой пользовательской карты
// hmapout - идентификатор выходной карты (для ускорения загрузки установить mapSetLoadState)
// hselect - условия отбора объектов или 0 (обработать все объекты)
// Возвращает число обработанных объектов
// При прерывании задачи оператором возвращает -1
// При ошибке возвращает ноль

_VECIMP long int _VECAPI vecCutSiteToSheets(HMESSAGE handle, HMAP hmap, HSITE hsite, HMAP hmapout, HSELECT hselect);

Для нарезки карты на листы и нанесения разграфки можно использовать готовые задачи, входящие в состав ГИС Панорама и ГИС Оператор.
Страницы: 1
Читают тему (гостей: 1)



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

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