SharpMap - лейблы, которые должные время от времени перемещаться

Кроме QGIS
Ответить
Ulis
Новоприбывший
Сообщения: 14
Зарегистрирован: 05 янв 2009, 10:48
Репутация: 0

SharpMap - лейблы, которые должные время от времени перемещаться

Сообщение Ulis » 04 июн 2009, 14:17

Все таки остановился на SharpMap - действительно хорошее решение, по функционалу - в самый паз, правда быстродействие не очень порадовало.
К сожадению нормального руководства к SharpMap нет, или есть? Кто-нибудь знает?

В данный момент столкнулся с такой проблемой, мне нужно реализовать набор Лейблов, которые должные время от времени изменять положение (поступают новые координаты), есественно для лейблов выделяется свой слой. Каким образом вообще отображать свои лейблы?

пробовал вот эти два способа - безрезультатно

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



            Graphics gr = Graphics.FromImage(pictureBox1.Image);

  SharpMap.Rendering.VectorRenderer.DrawLabel(
               gr, new PointF((float)p.X, (float)e.Y), new PointF((float)e.X + 100, (float)e.Y + 100), new Font("Times New Roman", 20),
              Color.Red, Brushes.AliceBlue, Pens.White, 0, "Some text", _sharpMap
               );

//-----------------------------------------------

  SharpMap.Styles.LabelStyle LS = new SharpMap.Styles.LabelStyle();
            LS.ForeColor = Color.Red;
            LS.Font = new Font("Times New Roman",20);

            SharpMap.Rendering.Label myLabel = new SharpMap.Rendering.Label
              ("Some text", new PointF((float)e.X, (float)e.Y), 0, 3,
              new SharpMap.Rendering.LabelBox((int)e.X, (int)e.Y, 100, 100),
                  LS);

Обязательно все хранить в базе? Если да, то как помещать?

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение JEY » 05 июн 2009, 08:06

Приветствую!

Для начала хотел сказать, что руководство по SharpMap все же есть... Его можно найти и скачать с тоге же самого сайта, где расположен SharpMap. Если Вы не смогли его найти, то укажите адрес Вашей электронной почты и я Вам его вышлю.

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

Попробуйте использовать данный код, немного его исправив:

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


SharpMap.Geometries.Geometry Geometries = New List(SharpMap.Geometries.Geometry);

Geometries.Add(New SharpMap.Geometries.Point(46.968841,31.961828));

SharpMap.Layers.VectorLayer GPSLayer = New SharpMap.Layers.VectorLayer("GPS");

GPSLayer.DataSource = New SharpMap.Data.Providers.GeometryProvider(Geometries);
GPSLayer.Style.Symbol = Bitmap.FromFile(@"C:\data\car.gif"); //если нужна иконка.

Map.Layers.Add(GPSLayer);

Если что-то не получится, не стесняйтесь обращаться за помощью!

Ulis
Новоприбывший
Сообщения: 14
Зарегистрирован: 05 янв 2009, 10:48
Репутация: 0

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение Ulis » 05 июн 2009, 09:45

Спасибо, что откликнулись, вот только я не могу понять, при чем же тут лейблы? В данном примере идет речь о выводе точек, с этим я , слава богу, уже разобрался.
Пособие я скачал, вся проблема в том, что там хорошо описаны объекты, но не всегда понятно, как их использовать например объект лейбл- как создать и настроить понятно, а как вывести - я не понял. Есть там также второй метод я(это привел во второй чати кода) - там непонятно, какие атрибуты вставлять при создании (как например объект graphics - первый аргумент, как он должен создаваться неизвестно)

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение JEY » 05 июн 2009, 11:41

Дело в том, что в SharpMap нет объекта Label или Annotation. Это всего лишь подписывание реальных объектов на карте...

В качестве примера использования подписей на карте в SharpMap посоветую следующий, но он на VB.NET:

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


Dim _vector_layer_states_provider As New SharpMap.Data.Providers.MsAccess(_connection.ConnectionString, "States", "WKB_Geometry", "oid")
Dim _vector_layer_states As New SharpMap.Layers.VectorLayer("Страны", _vector_layer_states_provider)

Dim _label_layer_states As New SharpMap.Layers.LabelLayer("Название стран")

_label_layer_states.DataSource = _vector_layer_states_provider
_label_layer_states.MaxVisible = 9.9
_label_layer_states.MinVisible = 0.9
_label_layer_states.LabelColumn = "NAME"
_label_layer_states.Style.CollisionBuffer = New SizeF(3, 3)
_label_layer_states.Style.CollisionDetection = True
_label_layer_states.Style.HorizontalAlignment = SharpMap.Styles.LabelStyle.HorizontalAlignmentEnum.Center
_label_layer_states.Style.Font = New Font("Times New Roman", 12.75, FontStyle.Italic, GraphicsUnit.Pixel)
_label_layer_states.Style.ForeColor = Color.Gold
_label_layer_states.Style.VerticalAlignment = SharpMap.Styles.LabelStyle.VerticalAlignmentEnum.Middle
_label_layer_states.SRID = 4326

В этом примере была использована часть кода из реализованного проекта. Все это действительно работает.

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение JEY » 05 июн 2009, 11:45

И еще... Класса SharpMap.Data.Providers.MsAccess в стандартном наборе провайдеров не существует. Его я сам разработал.

XxX
Новоприбывший
Сообщения: 3
Зарегистрирован: 09 фев 2010, 11:38
Репутация: 0

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение XxX » 09 фев 2010, 11:55

Доброго время суток. Все выше перечисленные ответы связанны не посредственно с извлечением данных из базы и выведения лейблов на карту. если другой способ вывести лейбл на карту. пример: есть MapImage в котором происходит событие MousDown считав координаты я могу установить точку

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

private void MainMapImage_MouseDown(SharpMap.Geometries.Point WorldPos, MouseEventArgs ImagePos)
{
            GeoPoint point = new GeoPoint(WorldPos.Y,WorldPos.X);
            VectorLayer Layer = new VectorLayer("Point");
            Collection<Geometry> geometry = new Collection<Geometry>();
            geometry.Add(point);          
            GeometryProvider provider = new GeometryProvider(geometry);           
            Layer.DataSource = provider;           
            MainMapImage.Map.Layers.Add(Layer);
            MainMapImage.Refresh();
}
как мне подписать точку??????????????
как подписать линию вдоль неё??????
как подписать полигон в нутри него???????????

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение JEY » 10 фев 2010, 07:32

Приветствую!

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

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение JEY » 10 фев 2010, 07:46

Можно конкретнее, не на VB.NET, а на C#:

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

SharpMap.Layers.LabelLayer labellayer = new SharpMap.Layers.LabelLayer("Подписи точек");

labellayer.DataSource = provider;
labellayer.MaxVisible = 9.9; //Здесь нужно указать максимальный масштаб.
labellayer.MinVisible = 0.9; //Здесь нужно указать минимальный масштаб.
labellayer.LabelColumn = "Подписи"; //Или любое другое наименование столбца таблицы базы данных.
labellayer.Style.CollisionBuffer = new SizeF(3, 3);
labellayer.Style.CollisionDetection = true;
labellayer.Style.HorizontalAlignment = SharpMap.Styles.LabelStyle.HorizontalAlignmentEnum.Center;
labellayer.Style.Font = new Font("Times New Roman", 12.75, FontStyle.Italic, GraphicsUnit.Pixel);
labellayer.Style.ForeColor = Color.Gold;
labellayer.Style.VerticalAlignment = SharpMap.Styles.LabelStyle.VerticalAlignmentEnum.Middle;
labellayer.SRID = 4326;
Вот и все! Должно работать. Не забудьте добавить этот слой на карту, чтобы Ваши подписи на ней отображались!

XxX
Новоприбывший
Сообщения: 3
Зарегистрирован: 09 фев 2010, 11:38
Репутация: 0

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение XxX » 11 фев 2010, 08:54

Я задал вопрос, не о на несении надписей, которые лежат в БД, а не посредственно в ходе программы.
есть координаты точки, которые считываются по клику мыши на карте и есть обычное текстовое поле, в котором пишется наименование надписи, а также поле с углом поворота надписи. и эту надпись нужно вывести.
А вы предлагаете сначало запихнуть эту надпись в БД потом её считать. помоему это гемор. Вы так не считаете???????????

Аватара пользователя
JEY
Активный участник
Сообщения: 228
Зарегистрирован: 17 июл 2008, 13:42
Репутация: 1

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение JEY » 12 фев 2010, 09:17

Что-то мешает Вам открыть исходный код SharpMap в Visual Studio и сделать то, что Вам нужно? Когда я не нахожу то, что мне нужно в каком-либо проекте, то я дописываю нужный мне функционал, используя исходный код или API.

XxX
Новоприбывший
Сообщения: 3
Зарегистрирован: 09 фев 2010, 11:38
Репутация: 0

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение XxX » 16 фев 2010, 20:36

Нашел ответ на официальном сайте, но там была ошибка и её подправели http://sharpmap.codeplex.com/Thread/Vie ... adId=72272
мой код

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

            FeatureDataTable layerTable = new FeatureDataTable();//таблица где хранятся точки с надписями
            layerTable.Columns.Add("label", Type.GetType("System.String"));//колонка - название и тип данных Надпись
            layerTable.Columns.Add("rotate", Type.GetType("System.Int32"));//колонка - название и тип данных Пворот
           
            GeoPoint point = new GeoPoint(63, 55);//Точка

            FeatureDataRow fdrRow = layerTable.NewRow();//строки где хранятся точки с надписями
            fdrRow.Geometry = point;//Добавляем точку в строку
            fdrRow["label"] = "Надпись";//Добавляем надпись которая будет отображаться
            fdrRow["rotate"] = 0;//Добовляем угол поворота надписи
            layerTable.AddRow(fdrRow);//добавляем строки в таблицу
          
            VectorLayer lotsLayer = new VectorLayer("Lots");//векторный слой на котором отбражается картинка
            lotsLayer.DataSource = new GeometryFeatureProvider(layerTable); // добавляем на слой таблицу с геометрией
            //после этого можно поместить картинку на слой для этого свойства слоя style  (lotsLayer.Style.Symbol = ваш бит мап;)
            lotsLayer.Style.EnableOutline = true;//не знаю чё это но пусть будет
            lotsLayer.Style.Outline = Pens.DarkGreen;

            LabelLayer lblLayer = new LabelLayer("Labels");//слой с подписями
            lblLayer.DataSource = lotsLayer.DataSource;//добавляем провайдер с подписями
            lblLayer.Enabled = true;
            lblLayer.LabelColumn = "label";//имя колонки в таблицы где хранятся надписи
            lblLayer.RotationColumn = "rotate";//имя колонки в таблицы где хранятся угол поворота
                              
           lblLayer.Style = new LabelStyle();//создаем стиль слою с подписями
            lblLayer.Style.CollisionDetection = true;
            lblLayer.Style.CollisionBuffer = new SizeF(20, 20);
            lblLayer.Style.ForeColor = Color.Black;//цвет текста
            //lblLayer.Style.BackColor =  new SolidBrush(Color.Blue);
            lblLayer.Style.Font = new Font("%Times New Roman", 12, FontStyle.Bold, lblLayer.Style.Font.Unit);            
            
            lblLayer.Style.VerticalAlignment = SharpMap.Styles.LabelStyle.VerticalAlignmentEnum.Bottom;//положение текста относительно картинки по вертикали
            lblLayer.Style.HorizontalAlignment = SharpMap.Styles.LabelStyle.HorizontalAlignmentEnum.Center;//положение текста относительно картинки по горизонтали
            mpiMap.Map.Layers.Add(lotsLayer);//добавляем слой на карту
            mpiMap.Map.Layers.Add(lblLayer);//добавляем слой на карту
            mpiMap.Refresh();//обнавляем карту
Вопрос снят. всем спасибо)))))))))))))
если будут ещё вопросы. пишите всегда рад помочь таким же пионерам как и я. потому как не шарил в это нифига

and
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 янв 2010, 16:07
Репутация: 0

Re: SharpMap - лейблы, которые должные время от времени перемеща

Сообщение and » 02 июн 2010, 14:59

Не много не потеме, но никак не могу найти, как в sharpMap нарисовать окружность?

Ответить

Вернуться в «Свободные, бесплатные, открытые ГИС»

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

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