На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

Oleg Belenkov (все сообщения)

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти  
Форум » Пользователи » Oleg Belenkov
Выбрать дату в календаре ...  Выбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 181 След.
Конвертирование открытой карты в RSW, GEOTIFF с помощью API.
Есть еще такая функция в gisacces.dll :

// Вывести экранное изображение карты в файл BMP
// в текущих масштабе и составе объектов
// Данная функция реализована только для платформы Windows !
// Выводится фрагмент карты, заданный параметром rect.
// Размер фрагмента не может быть больше разрешения экрана на котором
// выполняется программа
// hmap - идентификатор открытых данных,
// rect - координаты фрагмента карты (Draw)
// в изображении (Picture),
// bmpname - имя создаваемого файла BMP,
// bits - число бит на пиксел (32 или 8)
// При ошибке в параметрах возвращает ноль

_MAPIMP long int _MAPAPI mapPaintMapToBMP(HMAP hmap, RECT * rect,
const char * bmpname, long int bits);


А эти функции в gispicex.dll :

// Сохранить карту в формате BMP, Tiff, RSW
// map - карта,содержащая векторные, растровые и др. данные;
// handle - диалог сопровождения процесса обработки;
// dframe - фрагмент сохраняемой карты(в метрах на местности)
// bitcount - кол-во бит на пиксел сохраняемого изображения (1, 8, 24-рекомендуемое значение)
// scale - масштаб сохраняемого изображения
// resolution - разрешающая способность сохраняемого изображения(т/м)
// filename - имя файла сохраняемого изображения (*.bmp, *.tif);
// handleMainWin - должен быть равен нулю
// При ошибке функция возвращает ноль
//
// Диалогу визуального сопровождения процесса обработки посылаются
// сообщения:
// - (WM_PROGRESSBAR) Извещение об изменении состония процесса
// WPARAM - текущее состоние процесса в процентах (0% - 100%)
// Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
//
// - (WM_ERROR) Извещение об ошибке
// LPARAM - указатель на структуру ERRORINFORMATION
// Структура ERRORINFORMATION описана в picexprm.h,
// WM_PROGRESSBAR и WM_ERROR - в maptype.h

_MAPIMP long int WINAPI LoadMapToPicture(HMAP map,HMESSAGE handle,
DFRAME * dframe, long bitcount, long scale, long resolution,
char* filename, HMESSAGE handleMainWin);

// Сохранить карту в формате EMF
// map - карта,содержащая векторные данные;
// handle - диалог визуального сопровождения процесса обработки.
// rectmetr - фрагмент сохраняемой карты(в метрах на местности)
// bitcount = 8 - кол-во бит на пиксел сохраняемого изображения
// scale - масштаб сохраняемого изображения
// resolution - разрешающая способность сохраняемого изображения(т/м)
// emfname - имя файла сохраняемого изображения (*.emf);
// При ошибке возвращает ноль
//
// Диалогу визуального сопровождения процесса обработки посылаются
// сообщения:
// - (WM_PROGRESSBAR) Извещение об изменении состония процесса
// WPARAM - текущее состоние процесса в процентах (0% - 100%)
// Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
//
// - (WM_ERROR) Извещение об ошибке
// LPARAM - указатель на структуру ERRORINFORMATION
// Структура ERRORINFORMATION описана в picexprm.h,
// WM_PROGRESSBAR и WM_ERROR - в maptype.h

_MAPIMP long int WINAPI LoadMapToEmf(HMAP map,HMESSAGE handle,
RECT rectmetr, long bitcount, long scale, long resolution, char* emfname);
Как изменить яркость/контрастность у объекта "полигон-стекло"
А в чем проблема?

После редактирования классификатора (как и любого другого объекта) необходимо его сохранить.
Варианты:

Код

  // Сохранить классификатор на диск
  // hRsc - идентификатор классификатора карты
  // При ошибке возвращает ноль

_MAPIMP  long int _MAPAPI mapCommitRsc(HRSC hRsc);

  // Выполнить согласование данных электронной карты
  // в памяти и на диске (при многопользовательском доступе
  // к данным)
  // hmap -  идентификатор открытых данных
  // Если состояние данных в памяти изменилось (по данным
  // с диска) - возвращает ненулевое значение (1), иначе 0
  // Если карта должна быть закрыта - возвращает 2
  // (доступ на ГИС Сервер прекращен!)
  // Если состояние изменилось - необходимо перерисовать
  // изображение карты
  // Опрос состояния целесообразно выполнять периодически
  // в процессе работы приложения

_MAPIMP long int _MAPAPI mapAdjustData(HMAP hMap);

В отношении второй функции в RSCAPI.H есть комментарий:

  // При наличии открытой карты  с данным классификатором  после
  // изменения порядка вывода слоев на экран, после перемещения объ-
  // ектов из слоя в слой и после удаления слоев необходимо привести
  // карту в соответствие с классификатором - вызвать mapAdjustData()
  // и при необходимости перерисовать карту
Как изменить яркость/контрастность у объекта "полигон-стекло"
Принципиально программа не должна менять параметры в классификаторе. Поскольку клиентов может быть много, каждый смотрит карту в своих условиях. Это хакерские приемы.

Есть функции, меняющие яркость\контрастность\прозрачность у пользовательской карты:

Код

  // Запросить яркость карты (от -16 до +16)
  // hMap   - идентификатор открытой основной карты
  // hSite  - идентификатор открытой пользовательской карты

_MAPIMP long int _MAPAPI mapGetSiteBright(HMAP hMap, HSITE hSite);


  // Установить яркость карты (от -16 до +16)
  // hMap   - идентификатор открытой основной карты
  // hSite  - идентификатор открытой пользовательской карты

_MAPIMP long int _MAPAPI mapSetSiteBright(HMAP hMap, HSITE hSite, long int bright);


  // Запросить контрастность  (от -16 до +16)
  // hMap   - идентификатор открытой основной карты
  // hSite  - идентификатор открытой пользовательской карты

_MAPIMP long int _MAPAPI mapGetSiteContrast(HMAP hMap, HSITE hSite);


  // Установить контрастность (от -16 до +16)
  // hMap   - идентификатор открытой основной карты
  // hSite  - идентификатор открытой пользовательской карты

_MAPIMP long int _MAPAPI mapSetSiteContrast(HMAP hMap, HSITE hSite, long int contrast);


  // Запросить степень прозрачности карты
  // hMap  - идентификатор открытой карты
  // hSite - идентификатор открытой пользовательской карты
  // Возвращает значение от 0 (карта не видна) до 100 (карта не прозрачная)

_MAPIMP long int _MAPAPI mapGetSiteTransparent(HMAP hMap,HSITE hSite);

  // Установить степень прозрачности карты (от 0 до 100)
  // hMap  - идентификатор открытой карты
  // hSite - идентификатор открытой пользовательской карты
  // transparent - степень прозрачности карты от 0 (карта не видна)
  // до 100 (карта не прозрачная)
  // Возвращает новое значение флага

_MAPIMP long int _MAPAPI mapSetSiteTransparent(HMAP hMap, HSITE hSite, long int transparent);  // 02/02/09


Если условия изменения цвета общие для всех клиентов, работающих с картой,
то еще есть волшебная семантика для принудительной смены цвета:

#define SEMIMAGECOLOR 31002 // ЦВЕТ ОТОБРАЖЕНИЯ ЗНАКА RGB

Планируется группа функций для динамической смены параметров отображения группы объектов.
В качестве подготовки появился примитив IMGDRAWMIX в mapgdi.h.
Он применяется в программируемых знаках (военном rscarmy и в новом terrplan) для отслеживания состояния семантик объекта и заодно некоторых глобальных условий, которые можно учитывать в IMLAPI. Например,
время суток.

Эту же задачу решает динамическое переключение палитры карты. Например, на морских картах есть дневная и ночная палитра (s57navy.rsc). Они могут переключаться программно или по выбору оператора.
Вокруг 180 меридиана
Можно хранить прикладные объекты на пользовательской карте в радианах на заданном эллипсоиде и использовать карту, как хранилище данных. А отрисовывать каждый объект в событии Paint c учетом текущей проекции отображаемого фрагмента. С возможной корректировкой геодезических координат на лету на +\- 360 градусов. Это позволит одни и те же объекты рисовать дважды. В принципе это можно сделать на уровне ядра. Надо подумать.
Перевод координат, Как перевести радианы в пикселы?
Цитата
Олег Белоусов пишет:
К сожалению "Меркатор..." для меня - темный лес. Никогда картографией не занимался - этот случай большая экзотика.
Если это поможет, указываю характеристики карты из ее паспорта:

Тип карты Обзорно-географическая произвольная
Проекция Коническая равноугольная
Эллипсоид Красовский 1940
Если еще какие-то данные нужны, укажите, пожалуйста, какие именно.


Повторю свою мысль. Не имеет значения, какие параметры у Вашей карты. Поскольку в web принято использовать ряд популярных проекций, которые удобно совмещать с различными данными и для которых быстро считаются координаты.
Для Конической проекции координаты считаются методами итераций. Скорость на пару порядков ниже, чем для Меркатора в указанном выше варианте.
Перевод координат, Как перевести радианы в пикселы?
Если Вы работаете на территории от -60 градусов до +60 градусов по широте, то подойдет проекция Цилиндрическая Меркатора на шаре. Она же применяется в Google и ряде других геопорталов. Ей соответствуют международные коды EPSG:3857 и EPSG:3395. Разница в учете полярного сжатия (можно не вникать в эту фразу).

Чтобы сформировать картинку в такой проекции можно в ГИС Карта 2011 (Панорама Мини) выбрать текущие параметры проекции по типу карты Цилиндрическая Меркатора. Карта в любой проекции будет отображена в проекции "Google" - EPSG:3395 (на WGS-84) или EPSG:3857 (шар, радиусом с большую полуось WGS-84, полярное сжатие равно 0).
Если Вы откроете свою карту и в списке геопорталов выберете нужный, карта автоматически преобразуется в требуемую проекцию.

Формулы имеют вид:

Код

//*********************************************************************
// Программы перевода координат X,Y в B,L и обратно для
// цилиндрической проекции Меркатора на эллипсоиде (Mercator_1SP)
//*********************************************************************

//---------------------------------------------------------------------
// Цилиндрическая прямая равноугольная Меркатора
//---------------------------------------------------------------------
void TTranslate::InitMercatorProjection(double r, double a)
{
  BigAxis     = r;        // Радиус 6 378 137.0
  Alfa        = a;        // 1./298.3
  ScaleFactor = 1;
  FalseEasting = 0;
  FalseNorthing = 0;
  M_PI = 3.14159265358979323846;

  E2        = 2.*Alfa - Alfa * Alfa;
  if (E2 > 0)
    ExscMerid = sqrt(E2);
  else
    ExscMerid = 0;

  if (ExscMerid == 0)
    {
      // Проекция на шаре
      va = 0;
      vb = 0;
      vc = 0;
      vd = 0;
    }
  else
    {
      double E4 = E2 * E2;
      double E6 = E4 * E2;
      double E8 = E6 * E2;

      va = E2 / 2. + E4 * 5. / 24. + E8 * 13. / 360.;
      vb = E4 * 7. / 48. + E6 * 29. / 240. + E8 * 811. / 11520.;
      vc = E6 * 7. / 120. + E8 * 81. / 1120.;
      vd = E8 * 4279. / 161280.;
    }

  ve = ScaleFactor * BigAxis;
}

//---------------------------------------------------------------------
// Вычисление геодезических координат B,L по прямоугольным координатам X,Y
// в проекции Цилиндрическая прямая равноугольная Меркатора на шаре
// Входные данные:
// x,y - координаты точки в метрах
// Выходные данные:
// b,l - широта и долгота точки в радианах
//---------------------------------------------------------------------
void _fastcall TTranslate::XY2BL_MercatorProjection(double x, double y, double &b, double &l)
{
  l = (y - FalseEasting) / ve + AxisMeridian;

  double ksi = M_PI/2.0 - 2 * atan(exp(-(x - FalseNorthing)/ve));

  b = ksi + va * sin(2. * ksi) + vb * sin(4. * ksi) + vc * sin(6 * ksi)  + vd * sin(8 * ksi);
}

//---------------------------------------------------------------------
// Вычисление прямоугольных координат X,Y по геодезическим координатам B,L
// в проекции Цилиндрическая прямая равноугольная Меркатора на шаре
// Входные данные:
// b,l - геодезические координаты точки в радианах
// Выходные данные:
// x,y - плоские прямоугольные координаты точки в метрах
//---------------------------------------------------------------------
void _fastcall TTranslate::BL2XY_MercatorProjection(double b, double l, double &x, double &y)
{
  y = ve * (l - AxisMeridian) + FalseEasting;

  double esinb = ExscMerid * sin(b);
  double temp  = (1. - esinb) / (1 + esinb);
  double e     = ExscMerid / 2.;
  temp         = pow(temp, e);                  

  x = ve * log(tan(M_PI/4.0 + b / 2.0) * temp) + FalseNorthing;
}


Все это реализовано в GIS WebService, который на лету выдает тайлы в различных форматах и в различных проекциях и в различных системах тайлов (отдельная тема, как от градусов и метров перейти к пикселям для конкретного геопортала) для обеспечения совместимости с популярными геопорталами (Вы можете совмещать в web свои данные и данные с других геопорталов).
Настройка подписи, в виде векторного объекта
Текст подписи поддерживает некоторые специальные символы.

1. Если в строке есть символы \n или \r (0x0A или 0x0D), то с этой позиции продолжение подписи переносится на следующую строку.

2. Не обязательно для 2-ух семантик формировать 2 элемента в векторном знаке.
Можно задать одну строку вида:
"#94 #95"

Значения семантик с кодами 94 и 95 будут выведены в виде одной строки через пробел.
Две семантики будут расположены одной строкой без наползания друг на друга.
Наверное, можно и третью задать после косой:
"#94 #95\#92\#93"

Знак косая линия "\" воспринимается как знак переноса строки.
Символ # означает, что дальше идет номер семантики.
Комплекс автоматизированного дешифрирования работа в демо режиме
Библиотеку заменили. Спасибо за сообщение! Версия 2.0.2 - http://gistoolkit.ru/download/automap.zip
СК 42 Проекция Гаусса-Крюгера, Пересчет номера зоны
Осевой меридиан зоны может принимать строго определенные целочисленные значения, определяемые по формуле:

Долгота = (Номер_зоны - 1 ) * 6 + 3

Ширина зоны для СК-42 и СК-95 - 6 градусов. По 3 градуса от осевого меридиана в обе стороны.
Осевой меридиан 13-ой зоны равен 75 градусов.
Осевой меридиан 15-ой зоны равен 87 градусов.

Меридиан 84 градуса расположен на границе зон и может быть отнесен и к 14-ой и к 15-ой зоне.
Аналогично меридиан 78 градусов относится к 13-ой и к 14-ой зоне.

Эти формулы (Ваша версия) с точки зрения компьютерной арифметики вовсе не тождественны:
Долгота = (Номер зоны - 1) * 6 + 3
=> Номер зоны = Долгота / 6 + 0.5

Поскольку в первой строке справа только целочисленные операции,
а во второй строке есть операнд с плавающей точкой. Тут и появится формула из ГОСТ.
Преобразование в МСК и обратно
В новой версии добавим сохранение в XML значение угла поворота для МСК (Топографическая Универсальная местная).
В XML сохраняется 12 разрядов после запятой. Это достаточно высокая точность - не хуже микронов в плане.
Нужно смотреть исходные данные, выбранные для расчета параметров. Ошибки в измерениях исходных точек существенно влияют на результат. Вышлите конкретные данные для анализа, чтобы мы смогли дать какие-то рекомендации.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 181 След.


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