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

Создание слоя

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Создание слоя
 
Прошу помощи
Исходные данные: VS 2019 C#, собственный классификатор, прямоугольные координаты (осевой меридиан), начинающий программист.
Задача: программное создание слоя с нанесением на него объектов, с собственным интерфейсом (без отображения карты и т.д.)

Прошу громко не ругать, а поделиться простым проектом (создать слой (sitx/sit), создать 1-2 объекта и сохранить этот слой. Если возможно без gisacces.dll)

ЗЫ: сделал создание txf, но хотелось бы сразу sitx (sit) без импорта.
Изменено: Hellraiser - 22.08.2019 22:34:24
 
Без gisacces.dll не получится. Это основной исполняемый файл ГИС-ядра.
Как создавать карту , работать с объектами карты описано в руководстве программиста - http://gistoolkit.ru/download/doc/mapapi.pdf. В вашем случае это интерфейс MAPAPI.
Справочник по функциям ГИС-ядра - http://help.gisinfo.ru/
Пример приложения с исходными текстами на C# для Windows - http://gisinfo.ru/download?id=80.
 
Andrey Gheleznyakov, Спасибо за ответ. Разобрался. Буду рыть дальше.
Изменено: Hellraiser - 23.08.2019 22:18:25
 
Код
MAPREGISTEREX mapreg = new MAPREGISTEREX();
LISTREGISTER listreg = new LISTREGISTER();
MapAccess.mapRegisterFromMapType(MAPTYPE.CK_42, ref mapreg);
mapreg.DeviceCapability = -2;
mapreg.Scale = 200000;
mapreg.Name = "Район работ";
listreg.ListName = "Лист 001";
double degreetoradian = 3.14159265358979323846 / 180.0;
mapreg.AxisMeridian = 27 * degreetoradian;
listreg.XSouthWest = 4300000;          // X ю-з
listreg.YSouthWest = 9700000;          // Y ю-з
listreg.XNorthWest = 4400000;           // X с-з
listreg.YNorthWest = 9700000;          // Y с-з
listreg.XNorthEast = 4400000;          // X с-в
listreg.YNorthEast = 9800000;          // Y с-в
listreg.XSouthEast = 4300000;          // X ю-в
listreg.YSouthEast = 9800000;          // Y ю-в

hMap = MapAccess.mapCreateMapEx("test.sitx", "bag.rsc", ref mapreg, ref listreg);

int info = MapAccess.mapCreateSiteObject(hMap, 1, KIND.IDDOUBLE2, 0);
MapAccess.mapRegisterObject(info, 19, OBJLOCAL.LOCAL_POINT);  // 19 - точечный знак в классификаторе
MapAccess.mapAppendPointPlane(info, 4356000, 9750000);
MapAccess.mapCommitWithPlace(info);
MapAccess.mapFreeObject(info);
слой создает, а объект не наносит. что не так? или надо создать Site и только после этого вносить?
Изменено: Hellraiser - 26.08.2019 01:25:46
 
На первый взгляд последовательность действий нормальная, но смущяет полное отсутствие проверок кода возврата после вызова функций.
Например, MapAccess.mapRegisterObject(info, 19, OBJLOCAL.LOCAL_POINT);, а может она не нашла такого внешнего кода в классификаторе?
 
Код
            if (MapAccess.mapRegisterObject(info, 19, OBJLOCAL.LOCAL_POINT) == 0) Console.WriteLine("ОШИБКА mapRegisterObject");
            if (MapAccess.mapAppendPointPlane(info, 4356000, 9750000) == 0) Console.WriteLine("ОШИБКА mapRegisterObject");


нет ошибок (((
 
Судя по тексту - приложение 32-ух разрядное.

Код
  // Cоздать пустой объект пользовательской карты (обстановки)
  // (создание подобъекта - см. редактирование метрики объекта)
  // По умолчанию метрика 2-ух мерная
  // hMap  - идентификатор открытой основной карты
  // hSite - идентификатор открытой пользовательской карты
  //         в которой будет расположен создаваемый объект
  // text  - признак метрики с текстом (объекты типа "подпись")
  // kind  - формат метрики
  // После вызова функций типа What...() и Seek...() все параметры
  // полученного объекта могут измениться (text,kind и т.п.)
  // Для каждого полученного и больше не используемого
  // идентификатора HOBJ необходим вызов функции FreeObject()
  // При ошибке возвращает ноль

_MAPIMP HOBJ _MAPAPI mapCreateSiteObject(HMAP hMap, HSITE hSite, long int kind = IDDOUBLE2,  long int text = 0);
В вызове mapCreateSiteObject второй параметр не может быть 1. Функция не должна отработать и должна вернуть ноль. Тогда последующие функции тоже вернут ноль.
Можно указать hMap, если карта одна.
Или функция MapAccess.mapCreateSiteObject связана с функцией MAPAPI mapCreateObject, тогда параметры верные.

int info = MapAccess.mapCreateSiteObject(...) - строго говоря, info - это указатель. Для 32-ух разрядного приложения ошибки не будет, но лучше применить другой тип.

Если все функции отрабатывают без ошибки, то нужно перерисовать карту.
Если карта была пустой или  новый объект в стороне от других объектов, то изменились габариты карты и нужно их "поднять".

Например:
Код
  // Пересчитать общие габариты района работ
  // hmap - идентификатор открытых данных
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSetRegion(HMAP hMap);
 
Код
            int info = MapAccess.mapCreateObject(hMap, 1, KIND.IDDOUBLE2, 0);
            if (info == 0) Console.WriteLine("ОШИБКА mapCreateObject");
            if (MapAccess.mapRegisterObject(info, 19, OBJLOCAL.LOCAL_POINT) == 0) Console.WriteLine("ОШИБКА mapRegisterObject");
            if (MapAccess.mapAppendPointPlane(info, 4356000, 9750000) == 0) Console.WriteLine("ОШИБКА mapAppendPointPlane");
            if (MapAccess.mapCommitWithPlace(info) == 0) Console.WriteLine("ОШИБКА mapCommitWithPlace");

            MapAccess.mapFreeObject(info);
            MapAccess.mapSetRegion(hMap);

            Console.WriteLine("mapGetListCount="+MapAccess.mapGetListCount(hMap));
            Console.WriteLine("mapGetObjectCount=" + MapAccess.mapGetObjectCount(hMap, 1));
            Console.WriteLine("mapGetRealObjectCount=" + MapAccess.mapGetRealObjectCount(hMap, 1));

Получаю ответ:

Код
mapGetListCount=1
mapGetObjectCount=2
mapGetRealObjectCount=2

Содержимое лог файла
Код
---> 21:30:20 OPEN MAP. 26/08/2019
     21:30:20 CREATE MAP : test.sitx
     21:30:20  ? 1, 
Как видно пишет, что объекта 2.
1 - это рамка, а 2 как бы и не существует. Открываю в ГИС Операторе - рамку вижу, а объект - нет. В строке состояния написано что 2 объекта. Поиск объекта находит только рамку.

ЗЫ Приложение х64.
Изменено: Hellraiser - 26.08.2019 21:31:54
 
Неужели ни у кого нет простого примера консольного приложения (создание слоя и 1 объекта) на C#?
Страницы: 1
Читают тему (гостей: 1)



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

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