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

Поиск наличия расхождения координат

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Поиск наличия расхождения координат
 
Здравствуйте, коллеги!
Производство снова озадачило - часть файлов при загрузке в Панораму выдаёт всем известный диалог о расхождении координат:

Можно ли проконтролировать такое без загрузки SXF в Панораму? Одно дело - пара листов, другое - когда их сотни.
Предполагаю, что Панорама сравнивает рамку 91000000 с теоретическими координатами в Гауссе-Крюгере, вычисленными по номенклатуре.
Предполагаю, что функция загрузки SFX (забыл название) может слать соответствующее сообщение ядру - это было бы вообще здорово!
Что скажете-посоветуете?
 
Господа разработчики поймут - при подключении maptrans.h компилер ругается на неизвестный тип данных CONSTPROJ...
 
Вы хотите просто проконтролировать список SXF на наличие такого расхождения или загрузить sxf во внутренний формат с преобразованием без лишних вопросов и диалогов?
 
Я хочу максимально ускорить процесс - например указать директорию с SXF (и если нужен - RSC), нажать кнопку... В принципе - да, без лишних вопросов и диалогов.
ЗЫ - хотя нашёл дорожку для просто контроля без загрузки, но...
 
Вот пример вызова загрузки sxf без сообщений и диалога

int mesenable = mapMessageEnable(0); // Отключить выдачу сообщений

WCHAR wnamesxf[MAX_PATH];
StringToUnicode(sxfname.c_str(),wnamesxf,MAX_PATH);

WCHAR wnamersc[MAX_PATH];
StringToUnicode(rscname.c_str(),wnamersc,MAX_PATH);

WCHAR namemap[MAX_PATH]; // возвращаемое имя созданной карты
namemap[0] = 0;

ImportFromAnySxfPro(0,wnamesxf,wnamersc,namemap,MAX_PATH,0,0,1,1,0,0);

ShowMessage("Загрузка завершена.");
// Вернуть выдачу сообщений (если была)
mapMessageEnable(mesenable);
 
Ндя-я-я... Ну не умею я объяснять, такой уж уродился!
Попробую ещё раз.
На входе - директория с SXF-файлами.
Надо - максимально быстро, с наименьшими затратами, определить в каких из них расхождение координат находится в допустимом (для масштаба карты) пределе, а в каких из них - нет. Далее - или в протокол, или просто "нехорошие" файлы перекинуть в поддиректорию.
Возможные пути реализации:
1 - в среде самой Панорамы. Бот, отслеживающий появление окна (см. первый пост) и жмакающий соответствующие кнопки в нём (вместо оператора). Самый громоздкий путь.
2 - средствами SxfAPI/MapAPI, вариант 1. Читаю номенклатуру из заголовка SXF, затем
Код
  reg = new TMapRegister();
  COORDINATES B, L, X, Y;
  int p = reg->GeodeticsCoordinateGauss("0.N-34-053", 4, &B, &L);
  // тут вроде всё ОК:
  double Bsw = B.Coord[0] * 180.0 / M_PI;
  double Lsw = L.Coord[0] * 180.0 / M_PI;
  double Bne = B.Coord[2] * 180.0 / M_PI;
  double Lne = L.Coord[2] * 180.0 / M_PI;
  // а тут какая-то фигня... потому что NULL вместо TTranslate
  int q = reg->GeodeticToRightAngle(&B, &L, &X, &Y, NULL);
Затык, потому что при подключении maptrans.h компилер ругается на неизвестный тип данных CONSTPROJ...
3 - средствами SxfAPI/MapAPI, вариант 2. Читаю номенклатуру из заголовка SXF, затем пробую использовать стандартные функции MapAPI нестандартным образом.
-----
Далее (SxfAPI) читаю объект 91000000 и сверяю его координаты в Гауссе-Крюгере с теоретическими.
-----
Второй путь наиболее оптимален, но в нём использован тип данных, которого нет ни в одном из хидеров. Хотя использован CONSTPROJ несколько раз в нескольких функциях.


========================
С одним справился:
Код
#define CONSTPROJ MAPREGISTER  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include "mapTrans.h"
#include "mapCreat.h"
#include "mapRegis.h"

Пошли заморочки другого плана
Цитата
[ILINK32 Error] Error: Unresolved external '__fastcall TTranslate::SetProjection(int, MAPREGISTER *, int, int)' referenced from C:\JOB\COORDS\DEBUG\CRDCHECKFORM.OBJ
То же самое - для вызова конструктора TTranslate с параметрами...
Изменено: Газонокосильщик - 09.11.2013 14:59:34
 
Пока с уже готовой картой, без создания её из SXF/RSC.
Принял путь № 4 (без открытой карты не обойтись, SxfAPI отдыхает :) ):
Код
  FMap = mapOpenDataUn(OpenDialog1->FileName.c_str(), GENERIC_READ);
  mapGetMapInfo(FMap, 1, &FMR, &FLR);
  int scCoeff;
  switch (FMR.Scale) {
    case 1000000 : scCoeff = 1; break;
    case  500000 : scCoeff = 2; break;
    case  200000 : scCoeff = 3; break;
    case  100000 : scCoeff = 4; break;
    case   50000 : scCoeff = 5; break;
    case   25000 : scCoeff = 6; break;
    case   10000 : scCoeff = 7; break;
    default      : ; // ???
  }
  reg->GeodeticsCoordinateGauss(FLR.Nomenclature, scCoeff, &thrB, &thrL);

  memcpy(&thrX, &thrB, sizeof(COORDINATES));
  memcpy(&thrY, &thrL, sizeof(COORDINATES));
  for (int i = 0; i < 4; i++)
    mapGeoToPlane(FMap, &(thrX.Coord[i]), &(thrY.Coord[i]));

  mapCloseMap(FMap);

  double dXsw = fabs(thrX.Coord[0] - FLR.XSouthWest);
  double dYsw = fabs(thrY.Coord[0] - FLR.YSouthWest);
  double dXne = fabs(thrX.Coord[2] - FLR.XNorthEast);
  double dYne = fabs(thrY.Coord[2] - FLR.YNorthEast);

Если хоть одно не в допуске - всё ясно. Если всё ОК, проверить рамку 91000000 на совпадение теории с данными.
==============================
Господа разработчики! Убедительная просьба - добавьте в mapacces.dll обёртку для вот этого:
Код
reg->GeodeticsCoordinateGauss(FLR.Nomenclature, scCoeff, &thrB, &thrL);

//============================
Ну да, результаты:
1.png (6.53 КБ)
Изменено: Газонокосильщик - 09.11.2013 17:00:12
 
Кстати, господа разработчики - какое расхождение допустимо и зависит ли его величина от масштаба ИКМ?
---
Я сейчас тестирую на карте 1 : 200 000, отклонения в пределах 0.002...0.004 имеют место быть.
---
Код
// maptype.h
// Точность обработки координат при выполнении расчетов
#define DOUBLENULL  ((double)(1e-6))   // 26/04/00

Оно???
------------
Не ОНО.
Изменено: Газонокосильщик - 10.11.2013 14:49:48
 
Господа разработчики, проблемка возникла:
- получил набор координат объекта 91000000 при помощи (всю цепочку не пишу) mapSeekSelectObject();
- получил набор координат при помощи mapGetListFrameObject();
- получил набор координат по углам рамки для номенклатуры, шагу по долготе и mapGeoToPlane().
Все три набора совпали с точностью до 7-го знака.
А вот в паспорте действительно есть расхождения, максимальное из них - то, что Панорама выдаёт в диалоге. Затем идёт окно уже с рамкой, для всех Y показано это же расхождение, хотя я в отладчике вижу, что хотя бы для углов они - разные!
Ничего не понимаю...
Изменено: Газонокосильщик - 10.11.2013 12:16:20
 
Наверное уже всем надоел...
Господа разработчики, достаточен ли вот такой код:
Код
bool __fastcall TFCrdCheckForm::Check() {
  HMAP map = mapOpenMap(mapName, GENERIC_READ);
  // паспорт
  MAPREGISTER mr = {0};
  LISTREGISTER lr = {0};
  mapGetMapInfo(map, 1, &mr, &lr);
  // рамка 91000000
  HOBJ obj = mapCreateSiteObject(map, map, IDDOUBLE2, 0);
  mapGetListFrameObject(map, 1, obj);
  LINT pcnt = mapPointCount(obj, 0);
  // углы рамки
  DOUBLEPOINT dp[4] = {0};
  mapGetPlanePoint(obj, &(dp[0]), 1, 0);            // SW
  mapGetPlanePoint(obj, &(dp[1]), 2, 0);            // NW
  int stepCnt = (pcnt - 5) / 2;
  int nePos = stepCnt + 2 + 1;                      // индексы с 1
  mapGetPlanePoint(obj, &(dp[2]), nePos, 0);        // NE
  mapGetPlanePoint(obj, &(dp[3]), nePos + 1, 0);    // SE
  //-------------------------------------------------------------------------
  mapFreeObject(obj);
  mapCloseMap(map);
  //-------------------------------------------------------------------------
  double delta[8];
  delta[0] = fabs(dp[0].x - lr.XSouthWest);
  delta[1] = fabs(dp[0].y - lr.YSouthWest);
  delta[2] = fabs(dp[1].x - lr.XNorthWest);
  delta[3] = fabs(dp[1].y - lr.YNorthWest);
  delta[4] = fabs(dp[2].x - lr.XNorthEast);
  delta[5] = fabs(dp[2].y - lr.YNorthEast);
  delta[6] = fabs(dp[3].x - lr.XSouthEast);
  delta[7] = fabs(dp[3].y - lr.YSouthEast);
  for (int i = 0; i < 8; i++)
    if (delta[i] > DOUBLENULL)                      // ??????????????????????
      return false;
  return true;
}

И с чем сравнивать расхождение? С каким допуском?
На первой картинке карта, для которой Панорама расхождение фиксирует, на второй - нет:
1.png (15.62 КБ)
2.png (14.64 КБ)
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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