Описание алгоритма получения полноценного растра из графического файла BMP:
1. Конвертируем изображение растра из файла BMP в файл RSW.
Используем одну из функций, объявленных в файле mappicex.h: picexLoadBmpToRstAndCompress, picexLoadBmpToRstAndCompressJPEG, LoadBmpToRstByPlace...
В результате выполнения функции импорта получаем на диске файл RSW.
2. Открываем полученный растр RSW в отдельном документе вызовом функции mapOpenData() из mapapi.h.
В результате выполнения функции получаем идентификатор (дескриптор) HMAP открытого документа. В документе у нас открыт только один растр.
3. Заполняем структуры MAPREGISTEREX, ELLIPSOIDPARAM, DATUMPARAM параметрами проекции и системы координат.
4. Устанавливаем параметры проекции и СК (системы координат) в растр RSW вызовом функций: mapSetRstProjectionData, mapSetRstEllipsoidParam, mapSetRstDatumParam.
Функции, позволяющие установить параметры проекции и СК растра (и многое другое), объявлены в файле rstapi.h.
Как правило, функции принимают на вход дескриптор открытого документа HMAP, который мы получили вызовом функции mapOpenData() (см. п.2), и номер растра в цепочке (документе), т.к. в документ можно добавить несколько растров.
Номер растра в цепочке (документе) определяется вызовом функции mapGetRstNumberByName.
5. Закрываем документ с растром для освобождения ресурсов и памяти:
Код |
---|
// Закрыть все данные электронной карты
// hmap - идентификатор открытых данных
// Идентификатор HMAP становится недействительным !
_MAPIMP void _MAPAPI mapCloseData(HMAP hMap); |
Код |
---|
char * bmpName = "D:\\image.bmp";
char * rswName = "D:\\raster.rsw";
double x_min = 100; // значения привязки условные !
double y_min = 100;
double x_max = 200;
double y_max = 200;
DFRAME frame;
frame.X1 = x_min;
frame.Y1 = y_min;
frame.X2 = x_max;
frame.Y2 = y_max;
// Конвертор Bmp -> Rsw
if (LoadBmpToRstByPlace(0, 0, bmpName, rswName, 500, &frame) != 0)
{
// Открыть данные с автоматическим определением их типа
HMAP hMap = mapOpenData(rswName, 0);
if (hMap)
{
// Запросить номер растра в цепочке по имени файла
int numberRsw = mapGetRstNumberByName(hMap, rswName);
if (numberRsw != 0)
{
MAPREGISTEREX mapreg;
memset(&mapreg, 0, sizeof(MAPREGISTEREX));
mapreg.Length = sizeof(MAPREGISTEREX);
ELLIPSOIDPARAM ellipsoid;
memset(&ellipsoid, 0, sizeof(ELLIPSOIDPARAM));
DATUMPARAM datum;
memset(&datum, 0, sizeof(DATUMPARAM));
// Код EPSG указал первый попавшийся
long int epsgcode = 4326; // WGS 84 (Lat/Lon)
// Запросить параметры проекции и системы координат по коду EPSG
// Если код EPSG задает геодезическую систему координат,
// то устанавливается проекция Широта\Долгота и соответствующие
// параметры эллипсоида и датум
// Если код EPSG задает плоскую прямоугольную систему координат,
// то все параметры устанавливаются из базы EPSG
// epsgcode - код EPSG, для СК-42 зоны 2-32 : 28402-28432, для СК-95 зоны 4-32: 20004-20032
// mapreg - параметры системы координат и проекции
// datum - параметры пересчета с эллипсоида рабочей системы координат
// к WGS-84
// ellipsoid - параметры пользовательского эллипсоида для рабочей
// системы координат
// Для геодезических систем координат возвращает 2,
// для плоских прямоугольных возвращает 1.
// При ошибке возвращает 0
if (mapGetParametersForEPSG(epsgcode, &mapreg, &datum, &ellipsoid) != 0)
{
// Установить данные о проекции растра
if (mapSetRstProjectionData(hMap, numberRsw, &mapreg) != 0 &&
// Установить параметры эллипсоида растра
mapSetRstEllipsoidParam(hMap, numberRsw, &ellipsoid) != 0 &&
// Установить коэффициенты трансформирования геодезических координат растра
mapSetRstDatumParam(hMap, numberRsw, &datum) != 0)
{
// установка параметров проекции и СК выполнена
// Записать изменения растра в файл
// hMap - идентификатор открытой векторной карты
// number - номер файла в цепочке
// При ошибке возвращает ноль
mapSaveRst(hMap, numberRsw);
}
else
{
// Ошибка установки параметров проекции и СК
// MessageBox(...);
}
}
}
// Закрыть все данные электронной карты
// hmap - идентификатор открытых данных
// Идентификатор HMAP становится недействительным !
mapCloseData(hMap);
}
}
|