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

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

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

Страницы: Пред. 1 ... 5 6 7 8 9 10 11 12 13 14 15 ... 411 След.
как отобразить на пользовательской карте эллипс?
 
В стандартных тестах есть такой:
[CODE] #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);
}[/CODE]
Если создать не временную карту, то после теста ее можно открыть и посмотреть результат.
Ошибки и пожелания. Часть 3
 
Многие пользователи, не занимающиеся профессионально подготовкой к изданию, нажав некоторый пункт настроек (например, чертежное масштабирование),
запрашивают техподдержку о причине изменения вида карты.
Поэтому при старте программы вид карты нормализуется.

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

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

"функции пересчёта географических координат карты в пиксельные работают очень точно и экранные координаты изменяются плавно" - других функций нет. Они же работают при отображении.
Угол фиксации отрисовки карты
 
[CODE]// -----------------------------------------------------------------
// Установить угол поворота карты
// -----------------------------------------------------------------
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;
}[/CODE]
Угол фиксации отрисовки карты
 
В предложении 2 части.
Первая реализована. Отрисовка идет в буфер.
Вторая - крутить картинку до накопления некоторого промежуточного угла поворота.

Возможно, что отрисовка идет дольше, чем период обновления угла.
Приходят команды на 10 поворотов по 1 градусу. А карта отрисовалась 1 раз. Следующий раз будет смена на 10 градусов - рывок.
Добавим промежуточные повороты исходного растра, пока идет отрисовка (в потоке через HPAINT).
Это догадки. Данных и кода у меня нет.
Угол фиксации отрисовки карты
 
Наверное, для исключения дрожания изображения нужно применять "двойную буферизацию" при выводе карты. Например, методы из набора функций MAPAPI - mapCreateImageEx и далее.
То есть, формировать изображение в некотором буфере, а затем выводить. При повороте картинки средствами Qt реализуется тот же принцип. Кроме того, поворот готового растра выполняется
быстрее, чем перерисовка всего изображения.
Возможно, лучше до некоторого угла (например, 10 градусов) поворачивать картинку, а дальше переходить к новому углу для карты.
Xml для EPSG 5940, Требуется xml для загрузки в панораму.
 
Уточнил значение главной параллели - 81 градус 06 минут 52.265 секунд.
Это соответствует - 0.99400000025174096

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

Контрольный пример (когда осевой меридиан равен нулю !):

Polar Stereographic (Variant A) (EPSG Dataset coordinate operation method code 9810).

kO = 0.994 (вводим в паспорте 81 градус 06 минут 52.265 секунд)

73N 44E  - это E = 3320416.75 m N = 632668.43 m

На карте в ГИС Панорама X = 632668.430926 Y = 3320416.747694

Для осевого меридиана 105 градусов (EPSG:5940)

На карте в ГИС Панорама X = 1078466.812984 Y = 337510.122555

Запись в crslist.xml
[CODE]</Project>
<Project Name="Russia Polar Stereographic"
Comment="Карта Арктики, вид со стороны России"
EPSG="5940"
CrsIdent="EPSG_5940">
<Projection Type="Stereographic"
CentralMeridian="105.0"
LatitudeOfOrigin="90.0"
StandardParallel1="81.114518055386"
FalseEasting="2000000.0"
FalseNorthing="2000000.0"/>
<Spheroid Type="WGS 84"
Parm="6378137.000, 298.25722356"/>
</Project>[/CODE]
Как в QDMapView можно выбрать карту из ресурсов проекта ?
 
Любой комплект наборов данных (векторные карты, снимки, матрицы, документы) можно собрать вместе и упаковать в проект формата MPTZ - это один файл.
При необходимости можно его включить в состав дистрибутива и открывать по заданному пути. Открыть данные из выполняемого файла не позволит большинство антивирусов и средств защиты.
Как изменить цвет слоя на изображении карты?
 
Попробуйте применить функцию mapPaintAndSelectToXImage
Проблема с разработкой прикладной задачи MVS 2019 C++
 
HMAP CMyOpenMapFile::OpenMapFile(const WCHAR* mapname)
{
   long int error = 0;
   return mapOpenAnyDataPro(mapname, 0, &error, 0, 0);
}

Пароль нужен, когда карта зашифрована. Например, морская карта стандарта S63.
Страницы: Пред. 1 ... 5 6 7 8 9 10 11 12 13 14 15 ... 411 След.



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

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