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

Обрезка векторной карты

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 След.
RSS
Обрезка векторной карты
 
Для построения пересечений линейных, площадных объектов можно воспользоваться компонентом axMapOverlay.
 
У меня уже есть готовый функционал выделения и поиска по области. Логически я должен :
1. Выполнить выделение по области.

2. Найти все объекты попадающие в выделенную область.

3. Обрезать все объекты не попадающие в выделенную область с использованием компонента axMapOverlay.

4. Скопировать полученные объекты.

5. Вставить на созданную карту.

Правильно ли это?  
 
Почти.

1. Выполнить выделение по области.

2. Найти все объекты попадающие в выделенную область или пересекающие ее.

3. Определить, что объект целиком находится внутри области. Если да, то просто скопировать, если нет, то найти все части внутри области и скопировать их как отдельные объекты на новую.  Использовать компонента axMapOverlay.
 
Спасибо буду пробовать.  
 
Добрый день, господа разработчики.
У меня получилось скопировать объекты по выделенной области.

Далее я создал пользовательскую карту и на нею добавил скопированные объекты.

Но созданная мною пользовательская карта примыкает к верхнему левому углу экрана 😒 вопрос: как сделать, чтобы карта отображалась по центру экрана?  
 
Добрый день, подскажите пожалуйста как правильно использовать mapSetSiteBorder

OpenMap.openSit(EControls.Get<C_Map>().MapScreen, SiteFileName);
                       int mapW = MapScreen.MapWidth;
                       int mapH = MapScreen.MapHeight;
                       TxMapFrame frame = new TxMapFrame
                       {
                           X1 = 0,
                           Y1 = mapH*2,
                           X2 = mapW*2,
                           Y2 = 0
                       };
                       MapAPI.mapSetSiteBorder((IntPtr) 0, (IntPtr) 0, frame, (IntPtr)1);
                       [DllImport("gis32acces", CharSet = CharSet.Ansi)]
                      public static extern int mapSetSiteBorder(IntPtr hMap, IntPtr hSite, TxMapFrame frame, IntPtr place);

Пишу на С# с использованием GisToolKit ActiveX Free 14.0.2
 
Мой действия:
1. Я создал карту.
2. Добавил на нее объекты.
Но при открытии карта смещена в левый верхний угол т.е. в точку отсчета.
Мне необходимо ее сдвинуть к центру так как по всем сторонам карты будут добавляться дополнительные объекты и выноски.
Карта.png (51.25 КБ)
 
Габариты карты в пикселах для текущего масштаба таковы, что она автоматически отображается в верхнем левом углу окна.

В mapSetSiteBorder надо передать используемую систему  координат. В Вашей ситуации - это 2.

enum PPLACE            // ПРИМЕНЯЕМАЯ СИСТЕМА КООРДИНАТ
{
  PP_MAPOLD   = 1,    // КООРДИНАТЫ ТОЧЕК В СИСТЕМЕ КАРТЫ В ДИСКРЕТАХ (УСТАРЕВШЕЕ)
  PP_PICTURE  = 2,    // КООРДИНАТЫ ТОЧЕК В СИСТЕМЕ ИЗОБРАЖЕНИЯ В ПИКСЕЛАХ
  PP_PLANE    = 3,    // КООРДИНАТЫ ТОЧЕК В ПЛОСКОЙ ПРЯМОУГОЛЬНОЙ СИСТЕМЕ НА МЕСТНОСТИ В МЕТРАХ
  PP_MAP      = 3,
  PP_GEO      = 4,    // КООРДИНАТЫ ТОЧЕК В ГЕОДЕЗИЧЕСКИХ КООРДИНАТАХ В РАДИАНАХ
  PP_GEOWGS84 = 8,    // КООРДИНАТЫ ТОЧЕК В ГЕОДЕЗИЧЕСКИХ КООРДИНАТАХ В РАДИАНАХ В СИСТЕМЕ WGS 84
};

Установить масштаб отображения и сместить центр в координату.

procedure  ScaleInPoint(NewScale :  integer; Point : IaxMapPoint);  

Описание:  

Метод устанавливает  текущий масштаб отображения карты в NewScale  и центр  отображения смещает в Point.

В случае Point = nil, выполняется  вычисление центра окна карты (запоминается в метрах), далее выполняется  масштабирование, а в качестве центра отображения устанавливается ранее  вычисленная координата в метрах.

 
Все равно происходит ошибка

[DllImport("gis32acces", CharSet = CharSet.Ansi)]
public static extern int mapSetSiteBorder(IntPtr hMap, IntPtr hSite, TxMapFrame frame, int place);

TxMapFrame frame = new TxMapFrame
                       {
                           X1 = 0,
                           Y1 = mapH * 2,
                           X2 = mapW * 2,
                           Y2 = 0
                       };
                       mapSetSiteBorder((IntPtr)0, (IntPtr)0, frame, 2);
Ошибка.png (81.81 КБ)
 
Добрый день!

Сначала смотрим исходное описание:
Цитата

 // Обновить размеры пользовательской карты и габариты района
 // Данная функция может применяться при создании карты, когда объектов еще
 // нет и необходимо задать пустую область для окна карты
 // При создании или обновлении объектов габариты пользовательской карты
 // будут автоматически пересчитаны
 // После вызова этой функции необходимо согласовать параметры
 // скроллинга подобно масштабированию карты
 // hMap   - идентификатор открытой основной карты
 // hSite  - идентификатор открытой пользовательской карты
 // dframe - координаты прямоугольной области района
 // place  - система координат (PP_PLANE, PP_GEO, PP_PICTURE)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSetSiteBorder(HMAP hMap, HSITE hSite, DFRAME *dframe, long int place);

Структура frame передается по указателю.
Не сильно разбираюсь в C#, но думаю, что должно быть указание ref.
Вылет, скорее всего из-за этого.


Далее, функция ничего не обработает, так как карту Вы не указываете.
Первые два параметра - это идентификатор открытого района работ и идентификатор конкретной пользовательской карты в его составе.
Первый параметр нулем быть не может никак, второй - только если пользовательская карта у Вас только одна и она же открывалась первой.

Первый параметр: axMapView.MapHandle
Второй параметр: aiMapSite.SiteHandle

А вообще, если Вы используете компоненты, то и пользоваться их методами:
aiMapSite.SetSiteBorder

Добраться к классу пользовательской карты можно через свойство Item класса axMapView.MapSites
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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