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

Oleg Belenkov (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Oleg Belenkov
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 5 6 7 8 9 10 11 12 13 14 15 ... 412 След.
Как в QDMapView можно выбрать карту из ресурсов проекта ?
 
Карту можно сохранить в формате SITX с паролем. Пароль можно закодировать в программе. Файл можно переименовать в любое расширение - .so или .dll.
Внешне это не будет отличаться от библиотеки и открыть ее сможет только Ваша программа.
ГИС Панорама\Оператор создает такую карту в задаче Сортировка. Можно сформировать карту и без пароля.
Контроль качества векторной карты
 
Проблема была в том, что ключ задан числом. Число воспринималось, как код. Обычно идентификаторы объектов (в широком смысле) не должны начинаться с числа.
В наших классификаторах это правило соблюдается.
Добавили дополнительную проверку на то, что числовое значение не совпадает с ключом (идентификатор значения в классификаторе).
Это будет действовать для любых форматов. Но, теоретически, для коротких ключей возможна ошибка распознавания ключа вместо кода.
как отобразить на пользовательской карте эллипс?
 
Можно заменить. Можно добавить раньше, чтобы был полигон с контуром.
как отобразить на пользовательской карте эллипс?
 
Можно добавить площадной примитив типа IMGSQUARE.
как отобразить на пользовательской карте эллипс?
 
Создана пустая карта (EPSG:3395)
Собрана DLL из следующего кода:
Код
#include "mapapi.h"   

// --------------------------------------------------------------
//  Обязательная подпрограмма
// --------------------------------------------------------------
extern "C"
{
 __declspec(dllexport) long int WINAPI GetInterfaceVersion()
 {
    return 0;
 }
}

// --------------------------------------------------------------
//  Точка входа в задачу
// --------------------------------------------------------------
extern "C"
{
__declspec(dllexport) long int WINAPI CallMapFunctionEx(HMAP hmap, TASKPARMEX * parm)
{
  HOBJ info = mapCreateObject(hmap);

  mapDescribeObject(info, SQUARESERVINCODE);

  DOUBLEPOINT center = { 6197830, 7442044 };

  mapBuildEllipse(info, & center, 2000, 1000, 20.*M_PI/180., 32);

  mapCommitObject(info);

  mapFreeObject(info);

  return 0;
}
}

Запущена из меню Задачи\Запуск приложений. Тест выполняется и в Windows и в Linux при каждой сборке.
Вид задается через классификатор - mapDescribeObject(info, SQUARESERVINCODE); // Обычно фиолетовый полигон
Если объект не виден, его можно попробовать найти поиском.

как отобразить на пользовательской карте эллипс?
 
В стандартных тестах есть такой:
Код
 #define PANASSERT(condition, testname) if (!(condition)) { mapErrorMessage(IDS_DOERROR, testname); return 0; }
 #define PANASSERTCOMPLETED(testname) return 1;
 #define TESTNAME "GeodeticEllipse"

// --------------------------------------------------------------
//  Check building ellipse
// --------------------------------------------------------------
int test_GeodeticEllipse()
{
  MAPREGISTEREX  mapreg;
  DATUMPARAM     datum;
  ELLIPSOIDPARAM ellipsoid;

  PANASSERT(mapGetParametersForEPSG(3395, &mapreg, &datum, &ellipsoid),TESTNAME);

  TEMPHMAP hmap = mapCreateTempSitePro(WS("service.rsc"), &mapreg, &datum, &ellipsoid, 1);
  PANASSERT(hmap, TESTNAME);

  TEMPHOBJ hobj = mapCreateSiteObject(hmap, hmap);
  PANASSERT(hobj, TESTNAME);

  PANASSERT(mapDescribeObject(hobj, SQUARESERVINCODE), TESTNAME);

  DOUBLEPOINT center(6197830, 7442044);

  PANASSERT(mapBuildEllipse(hobj, & center, 2000, 1000, 20.*M_PI/180., 32), TESTNAME);

  PANASSERT(mapCommitObject(hobj), TESTNAME);

  int count = mapPointCount(hobj, 0);
  PANASSERT(count == 33, TESTNAME);

  // Correct result: distance = 9 672.8923824823
  double distance = mapLengthInMap(hobj);
  PANASSERT(Compare(distance, 9672.8923824823) == 0, TESTNAME);

  // Correct result on ellipsoid: distance = 6 391.82228430545
  distance = mapLength(hobj);
  PANASSERT(Compare(distance, 6391.82228430545) == 0, TESTNAME);

  // Correct result: distance = 6 242 890.30451456
  double square = mapSquareInMap(hobj);
  PANASSERT(Compare(square, 6242890.30451456, 0.00001) == 0, TESTNAME);

  // Correct result: distance = 2 725 978.21426187
  square = mapSquare(hobj);
  PANASSERT(Compare(square, 2725978.21426187, 0.00001) == 0, TESTNAME);

  PANASSERTCOMPLETED(TESTNAME);
}

Если создать не временную карту, то после теста ее можно открыть и посмотреть результат.
Ошибки и пожелания. Часть 3
 
Многие пользователи, не занимающиеся профессионально подготовкой к изданию, нажав некоторый пункт настроек (например, чертежное масштабирование),
запрашивают техподдержку о причине изменения вида карты.
Поэтому при старте программы вид карты нормализуется.

В новой версии в командную строку будет добавлен параметр  /7 - установить чертежный вид масштабирования.
После этого к иконке на рабочем столе можно привязать команду на запуск ГИС Панорама с этим параметром для автоматического открытия карт с чертежным режимом масштабирования.
Угол фиксации отрисовки карты
 
"Внутренние алгоритмы" приведены выше - TMapMetric::Turn, TMapMetric::Inverse.

Дерганье от "недерганья" отличается только скоростью смены кадра на экране.

"функции пересчёта географических координат карты в пиксельные работают очень точно и экранные координаты изменяются плавно" - других функций нет. Они же работают при отображении.
Угол фиксации отрисовки карты
 
Код
// -----------------------------------------------------------------
// Установить угол поворота карты
// -----------------------------------------------------------------
double TMapMetric::SetTurnAngle(double angle, double fixation)
{
  // Угол близок к нулю (установить 0)
  if (fabs(angle) < DELTANULL)
  {
    TurnActive = 0;
    Angle      = 0;
    return 0;
  }

  // Проверить угол на вхождение в диапазон
  if (angle < 0)
    while (angle < -M_PI)
      angle += M_PI * 2.;
  else
    while (angle > M_PI)
      angle -= M_PI * 2.;

  // Предыдущий угол не равен нулю
  if (fabs(Angle) > DELTANULL)
  {
    double delta;

    // Проверить угол сектора фиксации на вхождение в диапазон
    fixation = max(0.0, min(M_PI/6., fixation));
    delta    = fabs(Angle-angle);

    // Угол близок к предыдущему (оставить предыдущий)
    if (delta < fixation)
      return Angle;

    // Значения близких углов могут иметь разные знаки (около 180 градусов)
    if ((delta -= M_PI*2.) > 0)
    {
      // Угол близок к предыдущему (оставить предыдущий)
      if (delta < fixation)
        return Angle;
    }
  }

  // Установить новое значение угла
  SinTurn    = sin(Angle = angle);
  CosTurn    = cos(Angle);
  TurnActive = 1;

  return Angle;
}

// -----------------------------------------------------------------
// Повернуть точку
// -----------------------------------------------------------------
void _fastcall TMapMetric::Turn(DOUBLEPOINT& point, DOUBLEPOINT& turnpoint)
{
  turnpoint.X = point.X * CosTurn - point.Y * SinTurn;
  turnpoint.Y = point.X * SinTurn + point.Y * CosTurn;
}

// -----------------------------------------------------------------
// Повернуть точку обратно
// -----------------------------------------------------------------
void _fastcall TMapMetric::Inverse(DOUBLEPOINT& point, DOUBLEPOINT& turnpoint)
{
  turnpoint.X =  point.X * CosTurn + point.Y * SinTurn;
  turnpoint.Y = -point.X * SinTurn + point.Y * CosTurn;
}
Угол фиксации отрисовки карты
 
В предложении 2 части.
Первая реализована. Отрисовка идет в буфер.
Вторая - крутить картинку до накопления некоторого промежуточного угла поворота.

Возможно, что отрисовка идет дольше, чем период обновления угла.
Приходят команды на 10 поворотов по 1 градусу. А карта отрисовалась 1 раз. Следующий раз будет смена на 10 градусов - рывок.
Добавим промежуточные повороты исходного растра, пока идет отрисовка (в потоке через HPAINT).
Это догадки. Данных и кода у меня нет.
Страницы: Пред. 1 ... 5 6 7 8 9 10 11 12 13 14 15 ... 412 След.



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

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