Здравствуйте.
Пишу утилиту для импорта SXF (полученных из OpenStreet Map проекта, доступных для скачивания с Вашего сайта)
Алгоритм пока следующий:
Карта масштаба 25000 (карта Рязанской области с сайта)
Подаю на вход временно созданную карту, объект с замкнутой метрикой, соответствующей габаритам SXF карты,
и массив из 1024 структур LISTREGISTER.
На моём хосте (ПК) с использованием ГИС Конструктор с сайта работает корректно (правда масштаб приходится менять на 100000 из-за ограничений FREE версии),
получаю рассчитанные 72 листа карты.
На целевой платформе (arm) в масштабе 25000 должно быть 858 листов рассчитано,
и вроде бы данное количество листов влезает в массив из 1024 структур,
но функция mathSheetFromFrame возвращает 1024, и массив структур никак не заполняет.
А вот если создать массив из 2048 элементов, то функция mathSheetFromFrame уже нормально работает,рассчитывая 858 листов карты.Готового примера у меня нет, приведу пока только функцию, вычисляющую список листов:
Так работает (массив из 2048 элементов), листы рассчитываются:
А если массив из 1024 элементов, то листы уже не рассчитываются:
Пишу утилиту для импорта SXF (полученных из OpenStreet Map проекта, доступных для скачивания с Вашего сайта)
Алгоритм пока следующий:
- Получить габариты карты SXF.
- Вычислить список листов MAP карты в требуемой мне системе
- ...
- ...
- ...
- Запустить процесс конвертирования SXF в MAP
Код |
---|
// Создание списка номенклатур по заданным габаритам района // hmap - идентификатор открытых данных // info - заданная область расчёта номенклатур листов карты (метрика // должна быть замкнутой) // scale - знаменатель масштаба карты (25000 - 1000000) // listreg - адрес массива структур паспортных данных листа карты // sheet - максимальное число номенклатур // Возвращаемое значение: при ошибке - 0, // при нормальном завершении заполнятся поля структуры LISTREGISTER для // каждого листа long int WINAPI mathSheetFromFrame(HMAP hmap, HOBJ info, long scale, LISTREGISTER* listreg, long sheet); |
Подаю на вход временно созданную карту, объект с замкнутой метрикой, соответствующей габаритам SXF карты,
и массив из 1024 структур LISTREGISTER.
На моём хосте (ПК) с использованием ГИС Конструктор с сайта работает корректно (правда масштаб приходится менять на 100000 из-за ограничений FREE версии),
получаю рассчитанные 72 листа карты.
На целевой платформе (arm) в масштабе 25000 должно быть 858 листов рассчитано,
и вроде бы данное количество листов влезает в массив из 1024 структур,
но функция mathSheetFromFrame возвращает 1024, и массив структур никак не заполняет.
А вот если создать массив из 2048 элементов, то функция mathSheetFromFrame уже нормально работает,рассчитывая 858 листов карты.Готового примера у меня нет, приведу пока только функцию, вычисляющую список листов:
Код |
---|
LISTREGISTER* calcSheets(const QFileInfo& sxfFile, const QFileInfo& rscFile) { QString sxfFilePath = sxfFile.absoluteFilePath(); QByteArray sxfKoi8r = gis::common::convertStringToKOI8_R(sxfFilePath); QByteArray rscKoi8r = gis::common::convertStringToKOI8_R(rscFile.absoluteFilePath()); gis::core::MapInfo mapInfo; gis::core::VMapSheetInfo sheetInfo; long rc = panorama::mapGetAnySxfInfoByName(sxfKoi8r.constData(), mapInfo, sheetInfo); if (rc == 0){ qDebug() << "can't get sxf info for" << sxfFile.absoluteFilePath(); return nullptr; } system("mkdir /tmp/mapForSheets"); HMAP hmap = panorama::mapCreateMapEx("/tmp/mapForSheets/map", rscKoi8r.constData(), mapInfo, sheetInfo); if (hmap == 0){ qDebug() << "can't create map"; return nullptr; } HOBJ hobj = mapCreateObject(hmap); if (hobj == 0){ qDebug() << "can't create map obj"; mapCloseData(hmap); return nullptr; } gis::coord::System s(mapInfo.getEPSGCode()); gis::coord::GeoCoord sxfNW(s, sheetInfo.getGeoNorthWest().getB(), sheetInfo.getGeoNorthWest().getL()); gis::coord::GeoCoord sxfNE(s, sheetInfo.getGeoNorthEast().getB(), sheetInfo.getGeoNorthEast().getL()); gis::coord::GeoCoord sxfSE(s, sheetInfo.getGeoSouthEast().getB(), sheetInfo.getGeoSouthEast().getL()); gis::coord::GeoCoord sxfSW(s, sheetInfo.getGeoSouthWest().getB(), sheetInfo.getGeoSouthWest().getL()); rc = mapAppendPointGeo(hobj, sxfNW.getB(), sxfNW.getL()); if (rc == 0){ qDebug() << "can't add point to object"; mapFreeObject(hobj); mapCloseData(hmap); return nullptr; } rc = mapAppendPointGeo(hobj, sxfNE.getB(), sxfNE.getL()); if (rc == 0){ qDebug() << "can't add point to object"; mapFreeObject(hobj); mapCloseData(hmap); return nullptr; } rc = mapAppendPointGeo(hobj, sxfSE.getB(), sxfSE.getL()); if (rc == 0){ qDebug() << "can't add point to object"; mapFreeObject(hobj); mapCloseData(hmap); return nullptr; } rc = mapAppendPointGeo(hobj, sxfSW.getB(), sxfSW.getL()); if (rc == 0){ qDebug() << "can't add point to object"; mapFreeObject(hobj); mapCloseData(hmap); return nullptr; } rc = mapAppendPointGeo(hobj, sxfNW.getB(), sxfNW.getL()); if (rc == 0){ qDebug() << "can't add point to object"; mapFreeObject(hobj); mapCloseData(hmap); return nullptr; } const int MaxSheetsCount = 1024*2; LISTREGISTER* lists = new LISTREGISTER[MaxSheetsCount]; rc = mathSheetFromFrame(hmap, hobj, mapInfo.getScale(), lists, MaxSheetsCount); if (rc == 0){ qDebug() << "can't calc sheets"; mapFreeObject(hobj); mapCloseData(hmap); return nullptr; }else{ qDebug() << "rc of calc sheets" << rc; } for (long i = 0; i < rc; i++){ gis::core::VMapSheetInfo sheet(lists[i]); qDebug() << gis::common::parseStringFromKOI8_R(lists[i].Nomenclature) << lists[i].Length; qDebug() << sheet.getNomenclature() << sheet.getName() << sheet.getPlaneNorthEast().qPoint() << sheet.getPlaneSouthWest().qPoint(); } mapFreeObject(hobj); mapCloseData(hmap); return lists; } |
Цитата |
---|
Запускается ./run.sh... SxfUtil mkdir: cannot create directory '/tmp/mapForSheets' : File exists rc of calc sheets 858 "0.N-37-102-1-2" 544 "0.N-37-102-1-2" "N3710212" QPointF(5.91185e+06,7.48334e+06) QPointF(5.90261e+06,7.47497e+06) "0.N-37-102-2-1" 544 "0.N-37-102-2-1" "N3710221" QPointF(5.91183e+06,7.49167e+06) QPointF(5.90258e+06,7.48331e+06) "0.N-37-102-2-2" 544 "0.N-37-102-2-2" "N3710222" QPointF(5.91182e+06,7.5e+06) QPointF(5.90255e+06,7.49166e+06) "0.N-37-103-1-1" 544 "0.N-37-103-1-1" "N3710311" QPointF(5.91183e+06,7.50833e+06) QPointF(5.90255e+06,7.5e+06) "0.N-37-103-1-2" 544 ... ... ... "0.N-38-014-3-4" 544 "0.N-38-014-3-4" "N3801434" QPointF(6.14603e+06,8.35752e+06) QPointF(6.13702e+06,8.34929e+06) Приложение завершилось с кодом 0. |
Цитата |
---|
Запускается ./run.sh... SxfUtil mkdir: cannot create directory '/tmp/mapForSheets' : File exists rc of calc sheets 1024 "" 0 "" "" QPointF(0,0) QPointF(0,0) "" 0 "" "" QPointF(0,0) QPointF(0,0) "" 0 "" "" QPointF(0,0) QPointF(0,0) "" 0 "" "" QPointF(0,0) QPointF(0,0) "" 0 ... ... ... "" 0 "" "" QPointF(0,0) QPointF(0,0) Приложение завершилось с кодом 0. |