|
ГІС
інструментарій для Pocket PC (на С# для Windows Mobile)
ГІС
інструментарій для Pocket PC (на С# для Windows Mobile)
ГІС
інструментарій для Pocket PC (на С# для Windows Mobile)
Інструментарій
розроблювача ГІС-додатків для Pocket PC призначений для написання програм
для ОС Windows Mobile у середовищі Visual Studio. Основою інструментарію
є ГІС-ядро, яке виконує тисячі різних функцій по обробці векторних карт
місцевості, матриць і растрів, а також вихідні тексти ГІС Panorama Mobile
мовою програмування С#. Доступ до функцій ГІС-ядра виконується через MAPAPI
-інтерфейс, який має єдину реалізацію для різних платформ (Windows, Windows
Mobile, Linux, Solaris і т.д.).
ГІС Panorama Mobile (http://www.gisinfo.ru/products/panoramamobile.htm)
- програма для навігації по векторних, растрових картах і матрицях у форматах
ГІС Карта 2008 (Панорама) в ОС Windows Mobile. Програма забезпечує запис
траси руху, пошук об'єктів, перегляд і редагування семантичних характеристик,
визначення координат довільних точок, визначення довжини й азимута лінії,
нанесення об'єктів на карту, редагування характеристик об'єктів, зміну
складу даних, що відображаються, та інші операції.
Програма може бути встановлена на КПК із ОС Windows Mobile. Запис траси
може виконуватися при відсутності карт або поверх векторних (MAP, SIT)
або растрових карт (RSW) і матриць висот (MTW), підготовлених у ГІС Карта
2008.
Траса руху записується на користувальницьку карту (SIT),
яка потім може бути скопійована на настільний комп'ютер для подальшої
обробки. При необхідності траса може бути конвертована засобами ГІС Карта
2008 у формати DXF, MIF\MID, SHP, SXF, TXT, DBF, MP, GDF та інші. Вихідні
карти для КПК можуть бути підготовлені в ГІС Карта 2008 шляхом конвертування
з обмінних форматів SXF, DXF, MIF\MID, SHP, S57, MP, TXT, DBF.
До складу Інструментарію розроблювача ГІС-додатків для
Pocket PC входить ГІС-ядро у вигляді динамічної бібліотеки mapaxlib.dll,
h-файли з описом прототипів функцій MAPAPI мовою С, проект ГІС Panorama
Mobile мовою програмування С#, проект інсталяції (CAB) для ГІС Panorama
Mobile, допоміжний проект SaveBMPToCS для підготовки іконок панелей інструментів
у ГІС-додатку, документація та довідник по функціях MAPAPI у форматі html.
Для розробки нового ГІС-додатку можуть використовуватися
вихідні тексти проекту ГІС Panorama Mobile
у повному обсязі або частково, у вихідному вигляді або модифіковані.
Усі права зареєстровані. Свідоцтво про офіційну реєстрацію
програми для ЕОМ № 2005612905 "Інструментарій розроблювача ГІС-додатків
для Pocket PC (GIS ToolKit для Pocket PC )" і № 2008614932 "Геоінформаційна
система "Panorama Mobile". Повторна реєстрація вихідних текстів
і дизайну програми не допускається.
Вимоги до програмного та апаратного забезпечення
Для використання GIS ToolKit Mobile необхідно мати наступні
апаратні та програмні засоби:
- ПК з процесором типу Intel Pentium IV - 2GHz; RAM - від 1Гб і вище;
- Операційна система: MS Windows 2000 SP4 і вище;
- Microsoft Visual Studio 2008.
Порядок встановлення
Для установки GIS ToolKit Mobile необхідно скопіювати
вміст папки [GIS ToolKit Mobile X.X] або архіву gtkmobile.zip у користувальницьку
папку.
У папці \Doc міститься Посібник програміста (даний документ), Посібник
користувача ГІС Panorama Mobile і Посібник програміста по функціях ГІС-ядра.

Рис. 2. Вміст папок для GIS ToolKit Mobile
РОЗРОБКА ДОДАТКІВ В GIS ToolKit Mobile
Опис демонстраційного проекту
Щоб почати роботу з демонстраційним проектом необхідно
запустити додаток Microsoft Visual Studio 2008 і відкрити проект \GIS
ToolKit Mobile X.X\PanoramaMobile\PanoramaMobile.csproj.

Рис. 3. Загальний вигляд проекту ГІС Panorama Mobile
Процедура запуску додатка описана у файлі Program.cs:
namespace MobileGIS
{
static class Program
{
public
static MyForm MainForm = new MyForm();
///
///
The main entry point for the application.
///
[MTAThread]
static
void Main()
{
Application.Run(MainForm);
}
}
}
Клас головної форми додатку MyForm оголошений в MainForm.cs.
При старті додатку виконується оброблювач події MyForm_Load, у якому виконується
читання параметрів з файлу Panorama.INI.
При відкритті карти встановлюється значення ідентифікатора відкритої карти
hMap.
Для швидкої відрисовки карти створюється буфер екрана в пам'яті, зв'язаний
з ідентифікатором вікна додатку (HWND):
hImage = MapAccess.mapCreateImage((int)Handle);
Відображення карти у вікні додатка виконується в оброблювачі
події MyForm_Paint.
При необхідності зображення карти обновляється в буфері екрану:
MapAccess.mapDrawImageMapEx(hImage,
hMap, ref MapRect, 0, 1);
Для малювання на фоні карти елементів управління, тимчасових
об'єктів та інших даних застосовується подвійна буферизація зображення
карти. Другий буфер створюється автоматично при малюванні поверх карти
в буфері екрана:
// Обновити вміст другого буфера
з першого буфера
//
Автоматично створює другий буфер
MapAccess.mapClearImageObjects(hImage, 0);
// Запросити контекст другого
буфера
int dc = MapAccess.mapGetImageObjectDC(himage);
if (dc != 0)
{
IntPtr
hdc = (IntPtr)dc;
Graphics
g = Graphics.FromHdc(hdc);
Program.MainForm.DrawFormat.Alignment
= StringAlignment.Center;
g.DrawString(Title,
Program.MainForm.Font,
Program.MainForm.WhiteBrush,
Rect,
Program.MainForm.DrawFormat);
}
Готове зображення з буфера виводиться у вікно додатку:
MapAccess.mapViewImageEx(hImage,
(int)Handle, ref MapRect);
Для обробки повідомлень від GPS\ГЛОСНАСС-приймача створюється
таймер (потік обробки повідомлень)
ServiceAction = new TimerCallback(ServiceActionByTime);
Обробка повідомлень міститься у файлі MapEvent.cs.
ServiceTimer = new System.Threading.Timer(ServiceAction,
null, 1000, 1000);
// Service thread for time
action
public void ServiceActionByTime(Object state)
{
…
if (GpsPort.IsActive())
{
if
((ViewGpsPosition() != 0) && (IsUserActive != 0))
Invoke((myDelegateBool)CommentPoint,
true);
}
…
}
Опис класу доступу до GPS\ГЛОСНАСС-приймача міститься
в MapGps.cs.
Для безпечного виклику функцій з іншого потоку застосовується
метод Invoke. При необхідності виконання відновлення вікна карти з різних
потоків викликається функція Refresh, яка застосовує для безпеки критичну
секцію (lock):
public override void Refresh()
{
if (hMap == 0)
base.Refresh();
else
lock (this)
{
Invoke((myDelegate)base.Refresh);
}
}
Для застосування функцій і структур MAPAPI-інтерфейса
їхні прототипи описані в TMapAccess.cs. Для передачі строкових параметрів
використовуються функції, що мають у назві суфікс "Un".
StructLayout(LayoutKind.Sequential,
CharSet = CharSet.Auto)]
public struct DOUBLEPOINT // КООРДИНАТИ
ТОЧКИ
{
public double X;
public double Y;
public void Point(double x, double
y)
{
X
= x; Y = y;
}
}
[DllImport(GisLibrary, CharSet
= CharSet.Auto)]
public static extern int mapOpenDataUn(string name, int mode);
Для обробки подій від кнопок і виконання різних операцій
на карті використовується базовий клас MapAction, описаний в MapAction.cs.
Похідні класи від MapAction, які виконують складні дії та використовують
діалоги, описані в TaskAction.cs.

Рис. 4. Вигляд діалогу при проектуванні
У файлах CreateParm.cs, FContents.cs, FGps.cs, MapDialogs.cs
та інших міститься реалізація різних діалогів.

Рис. 5. Вигляд діалогу при виконанні програми
Оброблювачі повідомлень від головного меню описані в
MapMenu.cs.
У файлі IcoList.cs розміщені зображення кнопок для панелі інструментів.
У файлі MapPanel.cs описаний клас для управління панеллю інструментів.
Налагодження додатку
Розроблений додаток може бути протестований на реальному
пристрої або емуляторі. Для виконання додатку на пристрої або емуляторі
повинні копіюватися наступні дані: модуль (EXE), що виконується, бібліотека
ГІС-ядра (mapaxlib.dll) та бібліотеки NET Compact Framework (при необхідності).
Щоб бібліотека mapaxlib.dll автоматично копіювалася разом з додатком,
необхідно її включити до складу проекту (через меню по правій кнопці в
проекті - Add\Existing Item). Потім потрібно встановити властивість бібліотеки
(через меню по правій кнопці над бібліотекою - Properties)
 
Рис. 6. Налагодження властивостей бібліотеки для автоматичного копіювання
Для автоматичного копіювання бібліотек NET Compact Framework
(при необхідності) необхідно у властивостях проекту (PanoramaMobile Properties)
включити параметр Deploy the latest version of the .NET Compact Framework.

Рис. 7. Налагодження параметрів проекту
Для запуску додатка в режимі налагодження необхідно
вибрати тип пристрою (наприклад, Pocket PC 2003 SE Emulator) і нажати
кнопку Debug.

Рис. 8. Налагодження типу пристрою
Щоб відкрити карту в емуляторі, необхідно на робочому
комп'ютері підготувати папку з картою та вказати шлях до папки в параметрах
емулятора. Для цього потрібно вибрати в головному меню вікна емулятора
пункт "File\Configure..." і вказати шлях до папки з картою в
поле Shared Folder.

Рис. 9. Налагодження параметрів емулятора

Рис. 10. Налагодження шляху до папки з картою
Особливості використання функцій MAPAPI-інтерфейсу
Для забезпечення доступу й роботи з електронною векторною
картою місцевості, одержання зображення карти, пошуку в карті та в інших
задач використовуються функції інтерфейсу MAPAPI бібліотеки ГІС-ядра -
mapaxlib.dll.
Програмний код, що виконується під управлінням середовища Microsoft .NET
Framework, називається керованим кодом. І навпаки, код, що виконується
поза середовищем виконання, називається некерованим кодом. Прикладами
некерованого програмного коду і являються функції інтерфейсу MAPAPI.
Для взаємодії з бібліотеками DLL використовується платформенний виклик
некерованих функцій. Платформенний виклик - служба .NET Framework, яка
дозволяє керованому програмному коду викликати функції, реалізовані в
бібліотеках DLL. Платформенний виклик знаходить і викликає експортовану
функцію та в міру необхідності виконує маршалінг її аргументів (чисел,
рядків, структур і так далі) у границях взаємодії. В GIS ToolKit Mobile
для платформенного виклику використовується клас MapAccess.
Більшість типів даних мають загальне представлення, як у керованому, так
і в некерованому кодах (int, float і т.д.). Інші типи даних можуть мати
неоднозначне подання (char* у якості значення некерованої функції, що
вертається) або взагалі не бути представленими (char**) у керованій пам'яті.
Маршалер взаємодії забезпечує інструкції для предствалення різних типів
даних у керований тип.
Щоб застосувати експортовані функції DLL, необхідно:
- створити клас для зберігання набору функцій MAPAPI;
- для використання служби платформенного виклику некерованих функцій
додати простір імен System.Runtime.InteropServices;
using System.Runtime.InteropServices;
- створити прототипи функцій MAPAPI у класі функцій для платформенного
виклику й правильного маршалінгу даних. Для ідентифікації DLL і функції
треба використовувати атрибут DLLImport. Указати точне ім'я функції
та позначити метод модифікаторами static й extern, наприклад:
private const string GisLibrary = "mapaxlib"; // GIS core
dll
[DllImport(GisLibrary, CharSet = CharSet.Auto)]
public static extern int mapOpenDataUn(string name, int mode);
- викликати функцію MAPAPI, як метод керованого класу подібно будь-якому
іншому керованому методу.
Нижче приводяться приклади на C# створення прототипів
керованих функцій для передачі аргументів і одержання значень від MAPAPI
функцій. Особливий випадок представляє передача структур в якості параметру
функції. Показано застосування атрибута MarshalAs і класу Marshal для
явного маршалінгу даних при використанні структур і рядків. Нехай клас
для платформенного виклику функцій MAPAPI називається Interop.
Рядок у якості вхідного або вихідного параметра MAPAPI
функції.
Значення рядка середовища .NET Framework не може бути
змінено некерованою функцією. Тому при використанні рядка в якості буфера
для розміщення результату необхідно застосовувати клас StringBuilder.
Функція MAPAPI, що визивається з mapaxlib.dll, має прототип в mapapi.h:
long int _MAPAPI mapSemanticValueUn(HOBJ
info, long int number,
WCHAR
* value, long int size);
Керований прототип у класі MapAccess має вигляд:
[DllImport(GisLibrary, CharSet
= CharSet.Auto)]
private static extern int mapSemanticValueUn(int info, int number,
StringBuilder sb,
int bufsize);
public static string netSemanticValue(int hobj, int number)
{
StringBuilder sb = new StringBuilder(256);
if (mapSemanticValueUn(hobj, number,
sb, sb.Capacity) == 0)
return "";
return sb.ToString();
}
Виклик функції на коді на C#:
string semvalue = MapAccess.netSemanticValue(hObj,
i);
В даному прикладі показане оголошення структури в керованому коді та
передача її типу як параметр функції mapCreateSiteUn. Структура передається
по посиланню, тому що функція повинна одержати покажчик на структуру.
MAPAPI містить наступний опис структури (в maptype.h)
та функції (в mapapi.h):
typedef struct CREATESITEUN
{
long Length; //
Довжина запису структури CREATESITE
WCHAR MapName[128]; //
Ім'я району в кодуванні UNICODE
long int MapType; //
Узагальнений тип карти
long int MaterialProjection; //
Проекція вихідного матеріалу
long int EllipsoideKind; //
Тип еліпсоїда
long Scale; //
Знаменник масштабу карти
long Reserve; //
Резерв (повинен бути 0)
double FirstMainParallel; //
Перша головна паралель
double SecondMainParallel; //
Друга головна паралель
double AxisMeridian; //
Осьовий меридіан
double MainPointParallel;
// Паралель головної точки
double PoleLatitude; //
Широта полюса проекції
double PoleLongitude;
// Довгота полюса проекції
}
CREATESITEUN;
HMAP _MAPAPI mapCreateSiteUn(const
WCHAR * mapname,
const
WCHAR * rscname, CREATESITEUN * createsite);
Об'явлення в TMapAccess.cs:
[StructLayout(LayoutKind.Sequential,
CharSet = CharSet.Unicode)]
public struct CREATESITEUN // СТВОРЕННЯ КОРИСТУВАЛЬНИЦИЬКОЇ КАРТИ
{
public int Length; //
Довжина запису структури - 328
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = 128)]
public string MapName; //
Ім'я району в кодуванні UNICODE
public int MapType;
// Узагальнений тип карти
public int MaterialProjection; //
Проекція вихідного матеріалу
public int EllipsoideKind; //
Тип еліпсоїда (1 - Красовського, 9 - WGS84,...)
public int Scale; //
Знаменник масштабу карти
public int Reserve; //
Резерв (повинен бути 0)
//
В радіанах:
public double FirstMainParallel;
// Перша головна паралель
public double SecondMainParallel;
// Друга головна паралель
public double AxisMeridian; //
Осьовий меридіан
public double MainPointParallel;
// Паралель головної точки
public double PoleLatitude; //
Широта полюса проекції
public double PoleLongitude; //
Довгота полюса проекції
public
void Init()
{
Length
= 328;
MapName
= "User map";
MapType
= (int)MAPTYPE.SEANAUTIC;
MaterialProjection
= (int)MAPPROJECTION.MERCATORMAP;
EllipsoideKind
= (int)ELLIPSOIDKIND.WGS_84;
Scale
= 10000;
Reserve
= 0;
FirstMainParallel
= 0;
SecondMainParallel
= 0;
AxisMeridian
= 0;
MainPointParallel
= 0;
PoleLatitude
= 0;
PoleLongitude
= 0;
}
}
Керований прототип функції в класі MapAccess:
// Create user map
// mapname - name of map file (*.sit)
// rscname - name of classifier file (must be exist)
// createsite - map parameters
// sheetname - map title
// If the function fails, the return value is zero
[DllImport(GisLibrary, CharSet = CharSet.Auto)]
public static extern int mapCreateSiteUn(string mapname, string rscname,
ref
CREATESITEUN createsite);
Виклик функції в коді на C#:
CREATESITEUN csite = new CREATESITEUN();
csite.Init();
csite.MapName = name.Substring(pos);
csite.MapType = (int)MAPTYPE.SEANAUTIC; //
Mercator map
csite.Scale = 10000;
// 1 : 10 000
csite.EllipsoideKind = (int)ELLIPSOIDKIND.WGS_84;
hMap = MapAccess.mapCreateSiteUn(MapName,
rscname, ref csite);
Більш докладну інформацію про маршалінг даних і платформенний
виклик функцій DLL у середовищі .NET Framework можна знайти на сайті компанії
Microsoft http://msdn.microsoft.com.
РОЗГОРТАННЯ ГОТОВОГО ДОДАТКУ
Для установки готового додатку на КПК користувача можуть
використовуватися інсталяційні файли формату CAB.

Рис. 11. Загальний вигляд проекту для зборки CAB-файлу
До складу GIS ToolKit Mobile входить приклад проекту
для збірки файлу CAB. У проект включаються всі файли, які встановлюються
на КПК і вказується місце розміщення додатка (наприклад, у папці Programs
Folder) і назва створюваного ярлика для запуску додатка (наприклад, GIS
Panorama Mobile 3.1).
Для установки додатка необхідно завантажити файл PanoramaMobile.CAT на
КПК і вибрати даний файл у Провіднику для його автоматичної установки.
Для цього підключіть пристрій до настільного комп'ютера та виберіть у
програмі Microsoft ActiveSync кнопку "Провідник". Потім виберіть
папку для копіювання та скопіюйте файл (через буфер обміну або перетаскуванням
мишкою).
Для роботи додатка необхідно підготувати й розмістити на КПК картографічні
дані.
Час відображення карти залежить від обсягу даних (числа об'єктів, форми
подання даних у файлах і т.д.), а також від складності графічного подання
об'єктів карти: видів точкових знаків, стилів ліній, видів заливання полігонів.
Тому для більш ефективної роботи додатку рекомендується зменшувати обсяг
карти місцевості та оптимізувати опис видів об'єктів у класифікаторі ресурсів
карти.
Зменшити об'єм карти можна за допомогою задачі "Стиск методом округлення
координат", що входить до складу ГІС "Карта 2008": меню
Задача / Запуск додатків / Конвертування даних / Стиск карти методом округлення
координат.

Рис. 12. Підготовка даних для КПК
При роботі з векторною картою на велику територію рекомендується
розділити її на кілька листів - ГІС "Карта 2008", меню Завдання
/ Запуск додатків / Обробка листів карт і генералізація / Формування листів
карт по координатах.
Робота електронної карти буде більш ефективною, якщо замість однієї векторної
карти створити набір карт, організований відповідно до мети використання
карти. При цьому векторна карта місцевості може використовуватися тільки
як фон, а цільові об'єкти (дані) можуть перебувати в окремих користувальницьких
картах. Наприклад, з великомасштабних планів міст на окрему користувальницьку
карту можна перенести об'єкти адреси й виконувати адресний пошук тільки
в цій карті.
Для більш ефективної роботи, а також для кращого візуального сприйняття
карти рекомендується виконувати настроювання границь видимості знаків,
підписів, об'єктів інших видів у класифікаторі карти. При розробці в класифікаторі
графічного представлення об'єктів карти треба враховувати, що відображення
складних знаків, ліній складних стилів, шрифтів з тінню та обведенням
символів збільшує час створення малюнка карти. Тому використання складних
графічних примітивів об'єктів на КПК небажано.
|