ГИС и Геоинформационные технологии. Геодезия. Картография. Навигация. рус | eng | укр | блг 
 
RSS
   ГИС инструментарий для Pocket PC (на С# для Windows Mobile)
 


GIS ToolKit (Windows)


Инструментарий разработчика ГИС-приложений для Pocket PC предназначен для написания программ для ОС Windows Mobile в среде Visual Studio . Основой инструментария является ГИС-ядро, которое выполняет тысячи различных функций по обработке векторных карт местности, матриц и растров, а также исходные тексты ГИС Panorama Mobile на языке программирования С#. Доступ к функциям ГИС-ядра выполняется через MAPAPI -интерфейс, который имеет единую реализацию для различных платформ ( Windows , Windows Mobile , Linux , Solaris и т.д.).

ГИС Panorama Mobile - программа для навигации по векторным, растровым картам и матрицам в форматах ГИС Карта 2011 (Панорама) в ОС Windows Mobile. Программа обеспечивает запись трассы движения, построение кратчайшего маршрута по графу дорог, поиск объектов, просмотр и редактирование семантических характеристик, определение координат произвольных точек, определение длины и азимута линии, нанесение объектов на карту, редактирование характеристик объектов, изменение состава отображаемых данных и другие операции.

Программа может быть установлена на КПК с ОС Windows Mobile. Запись трассы может выполняться при отсутствии карт или поверх векторных (MAP, SIT) или растровых карт (RSW) и матриц высот (MTW), подготовленных в ГИС Карта 2011.

Трасса движения записывается на пользовательскую карту (SIT), которая затем может быть скопирована на настольный компьютер для дальнейшей обработки. При необходимости трасса может быть конвертирована средствами ГИС Карта 2011 в фор-маты DXF, MIF\MID, SHP, SXF, TXT, DBF, MP, GDF и другие.

Исходные карты для КПК могут быть подготовлены в ГИС Карта 2011 путем конвертирования из обменных форматов SXF, DXF, MIF\MID, SHP, S57, MP, TXT, DBF.

Все права зарегистрированы. Свидетельство об официальной регистрации программы для ЭВМ N 2005612905 "Инструментарий разработчика ГИС-приложений для Pocket PC (GIS ToolKit для Pocket PC)" и N 2008614932 "Геоинформа-ционная система "Panorama Mobile". Повторная регистрация исходных текстов и дизайна программы не допускается.

В состав Инструментария разработчика ГИС-приложений для Pocket PC входит ГИС-ядро в виде динамической библиотеки mapaxlib.dll, библиотека обработки графа дорог mapgraph.dll, h-файлы с описанием прототипов функций MAPAPI на языке С, проект ГИС Panorama Mobile на языке программирования С#, проект инсталляции (CAB) для ГИС Panorama Mobile, вспомогательный проект SaveBMPToCS для подготовки иконок панелей инструментов в ГИС-приложение, документация и справочник по функциям MAPAPI в формате html.
Для разработки нового ГИС-приложения могут использоваться исходные тек-сты проекта ГИС Panorama Mobile в полном объеме или частично, в исходном виде или модифицированные.

MobileGIS

Рис. 1. Общий вид ГИС Panorama Mobile

Функции ГИС-ядра обеспечивают управление отображением векторных, растровых и матричных данных о местности, редактирование данных, выполнение расчетов по карте, выполнение оверлейных операций, поиск и выделение объектов по различных критериям, пересчет координат между различными системами, подключение GPS/ГЛОНАСС-приемников и решение других задач.
Проект на языке C # может быть откомпилирован для платформы с любым типом процессора ( Any CPU ), однако библиотека ГИС-ядра mapaxlib . dll и библиотека mapgraph . dll собраны для платформы с процессором Intel ARM . Подготовка библиотек для другой платформы может быть выполнена по отдельному заказу.

Установка GIS ToolKit 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 ();
/// <summary>
/// The main entry point for the application.
/// </summary>
[ 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 описан класс для управления панелью инструментов.
В файле Roadgraph.cs содержатся функции для расчетов по графу дорог.

 

Отладка приложения

Разработанное приложение может быть протестировано на реальном устройстве или эмуляторе. Для выполнения приложения на устройстве или эмуляторе должны копироваться следующие данные: выполняемый модуль (EXE), библиотека ГИС-ядра (mapaxlib.dll), библиотека обработки графа дорог (mapgraph.dll) и библиотеки NET Compact Framework (при необходимости).
Чтобы библиотеки mapaxlib.dll и mapgraph.dll автоматически копировалась вме-сте с приложением, необходимо включить их в состав проекта (через меню по правой кнопке в проекте - Add\Existing Item). Затем нужно установить свойство копирования для библиотек (через меню по правой кнопке над библиотекой - Properties)

Рис. 6. Настройка свойств библиотеки для автоматического копирования

Для автоматического копирования библиотек NET Compact Framework (при не-обходимости) необходимо в свойствах проекта (PanoramaMobile Properties) включить параметр Deploy the latest version of the .NET Compact Framework.

Рис. 7. Настройка параметров проекта

Для запуска приложения в режиме отладки необходимо выбрать тип устройства (например, USA Windows Mobile 5.0 Pocket PC R2 Emulator) и нажать кнопку Debug.

Рис. 8. Настройка типа устройства

Чтобы открыть карту в эмуляторе, необходимо на рабочем компьютере подготовить папку с картой и указать путь к папке в параметрах эмулятора.

Рис. 9. Настройка параметров эмулятора

Для этого нужно выбрать в главном меню окна эмулятора пункт “ File \ Configure …” и указать путь к папке с картой в поле Shared Folder .


 Рис. 10. Настройка пути к папке с картой


Особенности использования функций MAPAPI-интерфейса

Для обеспечения доступа и работы с электронной векторной картой местности, получения изображения карты, поиска в карте и в других задач используются функции интерфейса MAPAPI библиотеки ГИС-ядра – mapaxlib.dll. Программный код, выполняющийся под управлением среды Microsoft .NET Framework, называется управляемым кодом. И наоборот, код, который выполняется вне среды выполнения, называется неуправляемым кодом. Примерами неуправляемого программного кода и являются функции интерфейса MAPAPI. Для взаимодействия с библиотеками DLL используется платформенный вызов неуправляемых функций. Платформенный вызов – служба .NET Framework, которая позволяет управляемому программному коду вызывать неуправляемые функции, реа-лизованные в библиотеках DLL. Платформенный вызов находит и вызывает экспортируемую функцию и по мере необходимости выполняет маршалинг ее аргументов (чисел, строк, структур и так далее) в границах взаимодействия. В GIS ToolKit Mobile для платформенного вызова используется класс MapAccess. Большинство типов данных имеют общее представление, как в управляемом, так и в неуправляемом кодах (int, float и т.д.). Другие типы данных могут иметь неодно-значное представление (char* в качестве возвращаемого значения неуправляемой функции) или вообще не быть представленными (char**) в управляемой памяти. Маршалер взаимодействия обеспечивает инструкции для представления различных типов данных в управляемый тип.

  1. Создать класс для хранения набора функций MAPAPI;

  2. Для использования службы платформенного вызова неуправляемых функций добавить пространство имен System.Runtime.InteropServices;

    using System.Runtime.InteropServices;

  3. Создать прототипы функций 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);

  4. Вызвать функцию 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 4.0).
Для установки приложения необходимо загрузить файл PanoramaMobile.CAT на КПК и выбрать данный файл в Проводнике для его автоматической установки. Для этого подключите устройство к настольному компьютеру и выберите в программе Mi-crosoft ActiveSync кнопку “Проводник”. Затем выберите папку для копирования и скопируйте файл (через буфер обмена или перетаскиванием мышкой).

Для работы приложения необходимо подготовить и разместить на КПК карто-графические данные.
Время отображения карты от объема данных (числа объектов, формы представ-ления данных в файлах и т.д.), а также от сложности графического представления объ-ектов карты: видов точечных знаков, стилей линий, видов заливки полигонов. По-этому для более эффективной работы приложения рекомендуется уменьшать объем карты местности и оптимизировать описание видов объектов в классификаторе ре-сурсов карты.
Уменьшить объем карты можно при помощи задачи «Сжатие методом округления координат», входящей в состав ГИС «Карта 2008»: меню Задачи / Запуск прило-жений / Конвертирование данных / Сжатие карты методом округления координат.

Рис. 12. Подготовка данных для КПК

При работе с векторной картой на большую территорию рекомендуется разде-лить ее на несколько листов - ГИС «Карта 2008», меню Задачи / Запуск приложений / Обработка листов карт и генерализация / Формирование листов карт по координатам.
Работа электронной карты будет более эффективной, если вместо одной вектор-ной карты создать набор карт, организованный в соответствии с целью использования карты. При этом векторная карта местности может использоваться только как фон, а целевые объекты (данные) могут находиться в отдельных пользовательских картах. Например, с крупномасштабных планов городов на отдельную пользовательскую кар-ту можно перенести объекты адреса и выполнять адресный поиск только в этой карте.
Для более эффективной работы, а также для лучшего визуального восприятия карты, рекомендуется выполнять настройку границ видимости знаков, подписей, объ-ектов других видов в классификаторе карты. При разработке в классификаторе графи-ческого представления объектов карты надо учитывать, что отображение сложных знаков, линий сложных стилей, шрифтов с тенью и обводкой символов увеличивает время создания рисунка карты. Поэтому использование сложных графических прими-тивов объектов на КПК нежелательно.

 

 

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

Copyright © Panorama Group 1991- 2012