Как пометить точку на карте знаком из заданного набора
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Как пометить точку на карте знаком из заданного набора
vs 2005+ C# + arcgis Engine.
Задача следующая. По имеющимся координатам точки я устанавливаю фокус изображения в эту точку. Необходимо пометить точку каким нибудь знаком. Для начала допустим красным кружочком, затем - изображением из имеющегося набора .
Спасибо за любую идею или подсказку.
Задача следующая. По имеющимся координатам точки я устанавливаю фокус изображения в эту точку. Необходимо пометить точку каким нибудь знаком. Для начала допустим красным кружочком, затем - изображением из имеющегося набора .
Спасибо за любую идею или подсказку.
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Отобразить точку вроде получилось -
А вот как ее убрать теперь , чтобы не восстановить изображение карты.
Задача такая - по выбору оператора отображать на карте те или иные объекты из базы данных.
Как это делается стандартным способом? На мой дилетантский взгляд можно
1. Отображать значки на специальном слое и при необходимости просто очищать слой и
формировать новую группу значков по новому запросу из БД.
1. Запомнить изображение карты в том месте где будет значок, а затем его восстанавливать
А какие есть еще варианты?
Код: Выделить всё
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. Запомнить изображение карты в том месте где будет значок, а затем его восстанавливать
А какие есть еще варианты?
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
И в догонку - сложно ли создать новый "чистый" слой для отображения значков?
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как пометить точку на карте знаком из заданного набора
Вам надо устанавливать для слоя критерии (SQL) выбора и потом перерисовать
Интерфейс IFeatureLayerDefinition получаем из ILayer простым приведением
Метод/свойство DefinitionExpression устанавливает что рисовать по принципу Имя_Поля = Условие_выборки
Интерфейс IFeatureLayerDefinition получаем из ILayer простым приведением
Метод/свойство DefinitionExpression устанавливает что рисовать по принципу Имя_Поля = Условие_выборки
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Заранее не известно на каком слое и какие объекты отображать и какими значками - это зависит от действий оператора. Оператор запрашивает набор данных для отображения (каждый элемент содержит координаты центра), затем может выбрать произвольный значок и затем дается команда на отображение.
Для исполнения следующего запроса нужно убрать результаты предыдущего и вывести новый набор.
Сейчас я попробовал сделать так
1. установить изображение значка по заданным координатам
Убрать изображение
И еще маленький вопрос - если возможность реализовать эффекты типа мигания значка?
Для исполнения следующего запроса нужно убрать результаты предыдущего и вывести новый набор.
Сейчас я попробовал сделать так
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 - рисуете что угодно поверх окна карты. После обновления все исчезает, вы рисуете опять - вызывает эффект мерцания.
Но если очень хочется - то используйте интерфейс IDisplay - рисуете что угодно поверх окна карты. После обновления все исчезает, вы рисуете опять - вызывает эффект мерцания.
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Спасибо!
У меня пока 2 базы данных. Первая - mySQL, это "обычная" , не картографическая БД.
Карта и ее внутренняя геобазаданных - ведется пока отдельно. Там могут появляться свои слои и прочее.
Я в специальном окне программы - отображаю карту через axMapControl, где указываю рабочий документ карты.
Пока так. Не совсем понятно пока каким образом могут появляться топологические ошибки.
Через iDisplay попробую.
У меня пока 2 базы данных. Первая - mySQL, это "обычная" , не картографическая БД.
Карта и ее внутренняя геобазаданных - ведется пока отдельно. Там могут появляться свои слои и прочее.
Я в специальном окне программы - отображаю карту через axMapControl, где указываю рабочий документ карты.
Пока так. Не совсем понятно пока каким образом могут появляться топологические ошибки.
Через iDisplay попробую.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как пометить точку на карте знаком из заданного набора
Имелось в виду - случай геопростанственной БД (MySQL тоже имеет пространственное расширение).
Правильно спроектированная база (а вы это пытаетесь переложить эти задачи на свою программу) - на 90% залог успеха. Не надо перекладывать на приложение не свойственные ему функции.
Данные должны лежать по слоям в БД. Для каждого слоя свой стиль оформления (может настраиваться оператором, причем с использованием нескольких условных знаков).
Дальше вы отображаете оператору только нужные ему данные из слоя при помощи выборок.
Если надо вводить данные, то в зависимости от типа информации, они должны попадать в тот или иной слой с теми или иными атрибутами.
Несоблюдение этого подхода и есть топологическая ошибка.
Правильно спроектированная база (а вы это пытаетесь переложить эти задачи на свою программу) - на 90% залог успеха. Не надо перекладывать на приложение не свойственные ему функции.
Данные должны лежать по слоям в БД. Для каждого слоя свой стиль оформления (может настраиваться оператором, причем с использованием нескольких условных знаков).
Дальше вы отображаете оператору только нужные ему данные из слоя при помощи выборок.
Если надо вводить данные, то в зависимости от типа информации, они должны попадать в тот или иной слой с теми или иными атрибутами.
Несоблюдение этого подхода и есть топологическая ошибка.
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Возможно мне трудно перенастроиться с исходного подхода. Основная была "обычная" БД, а картографическая база играла, по крайней мере , на начальных этапах вспомогательную роль. Программа обеспечивает взаимодействие баз данных.
Возможно эти две структуры нужно тщательней продумать , и вооще - нужно ли их разделять?
Мне кажется, что некоторые плюсы разделения баз есть - база без геоданных более легкая в плане переносимости, и имеет некоторую самостоятельную ценность.
Возможно эти две структуры нужно тщательней продумать , и вооще - нужно ли их разделять?
Мне кажется, что некоторые плюсы разделения баз есть - база без геоданных более легкая в плане переносимости, и имеет некоторую самостоятельную ценность.
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Возвращаюсь к задаче отображения объектов на карте. В прошлый раз я остановился на следующем варианте. Написал процедуру отображения значков на axMapControl:
Но при этом размер значков изменяется в соответствии с изменением масштаба отображения карты. Т.е. если приближаешь карту - соответственно значки увеличиваются до неприемлемых размеров. Такмм образом необходимо
1. изменить процедуру так, чтобы размеры значков не изменялись при изменении масштаба axMapControl.
2. изменить подход к решению задачи.
Если рассматривать второй вариант , то можно было бы создать специальный слой для для отображения объектов определенного вида.
Допустим требуется отобразить на карте республики все пожарные части. Есть ли общепринятый подход к решению этой задачи?
1. Если я правильно понимаю , можно создать пустой слой, допустим в arcgis desctop, прописать атрибуты и затем можно программно заполнить базу ?
В этом случае этим слоем можно пользоваться и непосредственно из Arcgis Desctop , без моей программы. И программно только сопровождать содержание этого слоя.
(похоже я работаю с базами mySQL - создаю базы и обслуживаю через dbForge, а работаю с ними из программы)
2. Отображение действующих ЧС , или всех ЧС за год можно , видимо , отображать на лету. Но слой возможно тоже лучше формировать заранее, и только заполнять базу по запросу оператора. Но опять же , возможно ли сделать размеры значков не зависящими от выбранного масштаба.
Спасибо за любой совет или ссылку!
Код: Выделить всё
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
Для этого используйте IFeatureLayerDefinition::put_DefinitionExpression
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Я попробую именно так. Но хотел попробовать сделать слой в 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
Слои первого типа создаются в ArcMap, второго - в ArcCatalog.
Зачем вам слой в виде шейп-файл если у вас база. Вам нужно написать свой источник данных, как, например, zigGIS.
http://edndoc.esri.com/arcobjects/9.2/c ... source.htm
еще можно почитать:
http://edndoc.esri.com/arcobjects/9.2/C ... uction.htm
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
У меня ведь есть карта респулики - точки ЧС нужно привязывать к ней. Если я правильно понимаю таблицы данных нужно к какому-то шейп файлу или чему то еще
-
- Завсегдатай
- Сообщения: 423
- Зарегистрирован: 15 май 2010, 06:13
- Репутация: 7
Re: Как пометить точку на карте знаком из заданного набора
Посмотрю ZigGis + пространственное расширение MySQL+ как попроще сделать слой в arcCatalog для привязки ЧС
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 20 гостей