Как пометить точку на карте знаком из заданного набора

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

vs 2005+ C# + arcgis Engine.
Задача следующая. По имеющимся координатам точки я устанавливаю фокус изображения в эту точку. Необходимо пометить точку каким нибудь знаком. Для начала допустим красным кружочком, затем - изображением из имеющегося набора .
Спасибо за любую идею или подсказку.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Отобразить точку вроде получилось -

Код: Выделить всё

            ESRI.ArcGIS.Carto.IPictureElement pPictureElement;
            pPictureElement = new ESRI.ArcGIS.Carto.JpgPictureElementClass();
            pPictureElement.ImportPictureFromFile(@"D:/Data/images/ЛогоГУ_МЧС.jpeg");
            ESRI.ArcGIS.Geometry.IEnvelope pEnv = new ESRI.ArcGIS.Geometry.EnvelopeClass();
            pEnv.PutCoords(x, y, x+500, y+500);

            ESRI.ArcGIS.Carto.IElement pElement;
            pElement = pPictureElement as ESRI.ArcGIS.Carto.IElement;
            pElement.Geometry = pEnv;
            ESRI.ArcGIS.Carto.IGraphicsContainer pGraphicContainer;
            pGraphicContainer = axMapControl1.Map as ESRI.ArcGIS.Carto.IGraphicsContainer;
            pGraphicContainer.AddElement(pElement, 0);
            ESRI.ArcGIS.Carto.IActiveView pActiveView;
            pActiveView = pGraphicContainer as ESRI.ArcGIS.Carto.IActiveView;
            pActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, pElement, pEnv);
А вот как ее убрать теперь , чтобы не восстановить изображение карты.
Задача такая - по выбору оператора отображать на карте те или иные объекты из базы данных.
Как это делается стандартным способом? На мой дилетантский взгляд можно

1. Отображать значки на специальном слое и при необходимости просто очищать слой и
формировать новую группу значков по новому запросу из БД.
1. Запомнить изображение карты в том месте где будет значок, а затем его восстанавливать

А какие есть еще варианты?
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

И в догонку - сложно ли создать новый "чистый" слой для отображения значков?
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Дмитрий Барышников »

Вам надо устанавливать для слоя критерии (SQL) выбора и потом перерисовать
Интерфейс IFeatureLayerDefinition получаем из ILayer простым приведением
Метод/свойство DefinitionExpression устанавливает что рисовать по принципу Имя_Поля = Условие_выборки
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Заранее не известно на каком слое и какие объекты отображать и какими значками - это зависит от действий оператора. Оператор запрашивает набор данных для отображения (каждый элемент содержит координаты центра), затем может выбрать произвольный значок и затем дается команда на отображение.
Для исполнения следующего запроса нужно убрать результаты предыдущего и вывести новый набор.
Сейчас я попробовал сделать так
1. установить изображение значка по заданным координатам

Код: Выделить всё

        ESRI.ArcGIS.Carto.IGraphicsContainer pGraphicContainer;
        ESRI.ArcGIS.Carto.IElement pElement;
        ESRI.ArcGIS.Carto.IActiveView pActiveView;
        ESRI.ArcGIS.Geometry.IEnvelope pEnv = new ESRI.ArcGIS.Geometry.EnvelopeClass();

            x = 6482002;
            y = 6767366;
            ESRI.ArcGIS.Carto.IPictureElement pPictureElement;
            pPictureElement = new ESRI.ArcGIS.Carto.JpgPictureElementClass();
            pPictureElement.ImportPictureFromFile(@"D:/Data/images/ЛогоГУ_МЧС.jpeg");
            pEnv.PutCoords(x, y, x+500, y+500);

            pElement = pPictureElement as ESRI.ArcGIS.Carto.IElement;
            pElement.Geometry = pEnv;

            pGraphicContainer = axMapControl1.Map as ESRI.ArcGIS.Carto.IGraphicsContainer;
            pGraphicContainer.AddElement(pElement, 0);

            pActiveView = pGraphicContainer as ESRI.ArcGIS.Carto.IActiveView;
            pActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, pElement, pEnv);
Убрать изображение

Код: Выделить всё

            pGraphicContainer.DeleteElement(pElement);
            pActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, null, pEnv);
И еще маленький вопрос - если возможность реализовать эффекты типа мигания значка?
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Дмитрий Барышников »

Такой подход нарушает дизайн базы данных и ведет к топологическим ошибкам.
Но если очень хочется - то используйте интерфейс IDisplay - рисуете что угодно поверх окна карты. После обновления все исчезает, вы рисуете опять - вызывает эффект мерцания.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Спасибо!
У меня пока 2 базы данных. Первая - mySQL, это "обычная" , не картографическая БД.
Карта и ее внутренняя геобазаданных - ведется пока отдельно. Там могут появляться свои слои и прочее.
Я в специальном окне программы - отображаю карту через axMapControl, где указываю рабочий документ карты.
Пока так. Не совсем понятно пока каким образом могут появляться топологические ошибки.
Через iDisplay попробую.
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Дмитрий Барышников »

Имелось в виду - случай геопростанственной БД (MySQL тоже имеет пространственное расширение).
Правильно спроектированная база (а вы это пытаетесь переложить эти задачи на свою программу) - на 90% залог успеха. Не надо перекладывать на приложение не свойственные ему функции.
Данные должны лежать по слоям в БД. Для каждого слоя свой стиль оформления (может настраиваться оператором, причем с использованием нескольких условных знаков).
Дальше вы отображаете оператору только нужные ему данные из слоя при помощи выборок.
Если надо вводить данные, то в зависимости от типа информации, они должны попадать в тот или иной слой с теми или иными атрибутами.
Несоблюдение этого подхода и есть топологическая ошибка.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Возможно мне трудно перенастроиться с исходного подхода. Основная была "обычная" БД, а картографическая база играла, по крайней мере , на начальных этапах вспомогательную роль. Программа обеспечивает взаимодействие баз данных.
Возможно эти две структуры нужно тщательней продумать , и вооще - нужно ли их разделять?
Мне кажется, что некоторые плюсы разделения баз есть - база без геоданных более легкая в плане переносимости, и имеет некоторую самостоятельную ценность.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Возвращаюсь к задаче отображения объектов на карте. В прошлый раз я остановился на следующем варианте. Написал процедуру отображения значков на axMapControl:

Код: Выделить всё

        private void setMarker(double x, double y){
            ESRI.ArcGIS.Geometry.IEnvelope pEnv = new ESRI.ArcGIS.Geometry.EnvelopeClass();
            ESRI.ArcGIS.Carto.IPictureElement pPictureElement;
            pPictureElement = new ESRI.ArcGIS.Carto.JpgPictureElementClass();
            pPictureElement.ImportPictureFromFile(@"D:/Data/images/Chrysanthemum.jpg");

            pEnv.PutCoords(x, y, x+drMax, y+drMax);

            pElement = pPictureElement as ESRI.ArcGIS.Carto.IElement;
            pElement.Geometry = pEnv;

            pGraphicContainer = axMapControl1.Map as ESRI.ArcGIS.Carto.IGraphicsContainer;
            pGraphicContainer.AddElement(pElement, 0);

            pActiveView = pGraphicContainer as ESRI.ArcGIS.Carto.IActiveView;
            pActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, pElement, pEnv);
    }
Но при этом размер значков изменяется в соответствии с изменением масштаба отображения карты. Т.е. если приближаешь карту - соответственно значки увеличиваются до неприемлемых размеров. Такмм образом необходимо
1. изменить процедуру так, чтобы размеры значков не изменялись при изменении масштаба axMapControl.
2. изменить подход к решению задачи.
Если рассматривать второй вариант , то можно было бы создать специальный слой для для отображения объектов определенного вида.
Допустим требуется отобразить на карте республики все пожарные части. Есть ли общепринятый подход к решению этой задачи?
1. Если я правильно понимаю , можно создать пустой слой, допустим в arcgis desctop, прописать атрибуты и затем можно программно заполнить базу ?
В этом случае этим слоем можно пользоваться и непосредственно из Arcgis Desctop , без моей программы. И программно только сопровождать содержание этого слоя.
(похоже я работаю с базами mySQL - создаю базы и обслуживаю через dbForge, а работаю с ними из программы)

2. Отображение действующих ЧС , или всех ЧС за год можно , видимо , отображать на лету. Но слой возможно тоже лучше формировать заранее, и только заполнять базу по запросу оператора. Но опять же , возможно ли сделать размеры значков не зависящими от выбранного масштаба.

Спасибо за любой совет или ссылку!
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Дмитрий Барышников »

Я бы сделал слой со всеми значками. Настроил его отображение через символику с категориями. Этот слой должен быть у всех пользователей. Затем программно ставить атрибутивный запрос (defenition query) в свойства слоя - будут показываться только нужные данные.
Для этого используйте IFeatureLayerDefinition::put_DefinitionExpression
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Я попробую именно так. Но хотел попробовать сделать слой в arcgis desctop, а его содержанием и отображением уже управлять из программы. Пока ищу как создается простой (не составной ) слой . Как ни странно не могу найти . В какой программе делается shape file, и вообще простые слои? Если я правильно понимаю в arcmap Добавить данные - и ищешь уже готовый файл слоя, а где он сам создается...
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Дмитрий Барышников »

В ArcGIS есть два вида слоев: слой как оформление (lyr файл, или часть документа mxd) и слой как источник данных (shp, mdb, gdb).
Слои первого типа создаются в ArcMap, второго - в ArcCatalog.
Зачем вам слой в виде шейп-файл если у вас база. Вам нужно написать свой источник данных, как, например, zigGIS.
http://edndoc.esri.com/arcobjects/9.2/c ... source.htm
еще можно почитать:
http://edndoc.esri.com/arcobjects/9.2/C ... uction.htm
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

У меня ведь есть карта респулики - точки ЧС нужно привязывать к ней. Если я правильно понимаю таблицы данных нужно к какому-то шейп файлу или чему то еще
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Как пометить точку на карте знаком из заданного набора

Сообщение Tereha »

Посмотрю ZigGis + пространственное расширение MySQL+ как попроще сделать слой в arcCatalog для привязки ЧС
Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя