Добрый день! Подскажите пожалуйста как я могу отобразить картинку из БД MSSQL, которая хранится в поле (Image) на карте формата *.sit. На сегодняшний день у меня получилось отобразить карту (*.sit)., а при нанесении точки при помощи кода отображается только маленький квадратик.
Код нанесения и отображения точки (С #):
private void MapView1_OnDblClick(object sender, EventArgs e) { using (var f = new F_EditMapItem()) { if (f.ShowDialog() != DialogResult.OK) return;
using (var db = new MyDataDataContext()) { var res = db.Lst_MapItems.FirstOrDefault(t => t.Description == "№89653" && t.Id == 1081); MapPoint.SetPoint(Convert.ToDouble(Program.Latitude), Convert.ToDouble(Program.Longitude));
//MapObj.Image = Image.FromStream(new MemoryStream(res.Image.ToArray()))); //// Может здесь я что-то делаю не правильно??
Далее нажимаю на кнопку "ОК" и на карте отображается квадратик
Хотя в БД MSSQL данные сохранились
Скрытый текст
Может быть я иду в не правильном направлении, но использование БД MSSQL это единственный вариант, который позволит мне автоматически наносить объекты на карту в зависимости от выбора пользователя. Я понимаю, что необходимо пользоваться классификатором, но тогда я теряю возможность автоматического нанесения объектов на карту. Я пишу на C# с использованием инструментов GIS Tool Kit 11. Если это возможно желательно ответ дать в виде кода.)) Для соединения с БД я использую LINQ запросы.
Долгий и тернистый путь Вы выбрали для отображения условных знаков.
При больших объемах данных такой подход приведет к очень сильному замедлению работы - во-первых, при потоковом нанесении объектов на карту, во-вторых, при последующей визуализации.
Кроме того свойство MapObj.Image не устанавливает картинку, а определяет код функции для отображения выделенного объекта. Задать объекту растровое изображение в качестве условного знака можно с помощью "графического вида объекта" - MapObj.AppendDrawObject (или mapAppendDraw) с параметрами: тип функции - IMG_GRAPHICMARK и структура параметров изображения - TIMGGRAPHICMARK
Скрытый текст
TIMGGRAPHICMARK = packed record // (165) ТОЧЕЧНЫЙ ЗНАК - ГРАФИЧЕСКОЕ ИЗОБРАЖЕНИЕ Length : integer; // Полная длина записи описания объекта Ident : integer; // Идентификатор изображения = 0 Name : array[0..255] of GTKCHAR;// Имя файла изображения FileType : integer ; // 1 - BMP, 2 - JPEG, 3 - Metafile Height : integer; // Габариты знака ( высота, ширина) Width : integer; // PosV : integer; // Точка привязки знака по вертикали PosH : integer; // и горизонтали (от начала габаритов Shift : integer; // Смещение тени Contour : TIMGLINE; // Параметры контура ContourFlag : GTKCHAR; // Флаг наличия контура ShadeFlag : GTKCHAR; // Флаг наличия тени TransparentFlag : GTKCHAR; // Флаг прозрачности фонового цвета // 29/10/09 // (первый пиксел картинки - левый нижний угол BMP) Reserv : array[0..13]of GTKCHAR ; // Резерв end;
Цитата
Александр Махин написал: Может быть я иду в не правильном направлении, но использование БД MSSQL это единственный вариант, который позволит мне автоматически наносить объекты на карту в зависимости от выбора пользователя. Я понимаю, что необходимо пользоваться классификатором, но тогда я теряю возможность автоматического нанесения объектов на карту.
Для этого достаточно в БД просто иметь справочник с кодами объектов, соответствующих классификатору карты, и при автоматическом нанесении регистрировать объект нужным кодом.
Да я с Вами полностью согласен, что будут жесткие подвисания ПО! Я решил пойти другим путем.! Я создал карту и привязал к ней классификатор. Теперь вопрос я уже третий день пытаюсь отобразить из классификатора векторный объект, но ни чего не происходит(((
Вот мой код на С# (данные объекта, который я пытаюсь отобразить на карте: код объекта - 13100, ключ - V00000013100, тип - векторный, номер 1, Имя - "Темно красный флаг")
Что я делаю не так? Желательно помочь и ответить кодом, чтобы я смог подробно изучить этот код т.к. читая руководство для программистов понимаю лишь 50% того что написано! Заранее Вас благодарю!!
Если "ничего не происходит", скорее всего, объект у Вас создается, но Вы его не видите. Либо не создается, но для того, чтобы это узнать, надо анализировать коды возврата от методов (ноль - это ошибка). Если объект создается, но на экране его нет, могут сбыть следующие причины.
Первый вопрос к этому участку:
Цитата
Александр Махин написал: MapObj.Metric.Append(0, MapPoint.C_CONTAINER); MapObj.Metric.Insert(0, 1, MapPoint.C_CONTAINER);
Зачем объекту одна и та же точка? Insert при вставке точки после последней - это то же Append. Если вдруг Ваш векторный объект в классификаторе настроен так, что он должен растягиваться по этим двум точкам, то это установка им одной и той же координаты - не есть хорошо.
Надо еще учитывать, что у каждого объекта классификатора может быть установлен масштабный ряд отображения. Если Вы объект создали, но карта при этом открыта в другом масштабе, выходящим за масштабные границы отображения объекта, этот объект не будет виден.
Если Вы ошиблись с метрикой, объект сохранится, но будет за пределами карты. slMap2.Text и slMap3.Text у Вас должны быть в метрах, так как Вы установили MapPoint.PlaceInp в метрах. Не перепутайте оси X и Y (см. Руководство по MAPAPI).
Здравствуйте! Я разобрался со своей ошибкой добавив в начало кода строку MapSelectObjectRsc.Show();, а в конце строку MapView1.Refresh(); Спасибо за помощь!!