[QUOTE]Ксения Смирнова написал: Или откуда берутся данные методы?[/QUOTE] это файлы с расширением CS которые содержат
[QUOTE]Что за mapproc и maptype?[/QUOTE] [B]mapproc[/B][CODE]namespace mapproc { [DllImport(GisLibrary, CharSet = CharSet.Ansi)] public static extern HMAP mapOpenMap(string name, int mode);
[DllImport(GisLibrary, CharSet = CharSet.Ansi)] public static extern void mapCloseMap(HMAP hMap); .... .... } [/CODE] [B]maptype [/B]- объявление типов .... что-то по на подобии такого [CODE]namespace maptype { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DFrame { public double X1; public double Y1; public double X2; public double Y2; public bool Empty { get { return (X1.Equals(0.0) && X2.Equals(0.0) && Y1.Equals(0.0) && Y2.Equals(0.0)); } } }
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DOUBLEPOINT // КООРДИНАТЫ ТОЧКИ { public double X; public double Y; public void Point(double x, double y) { X = x; Y = y; } }
public enum MAPTYPE // Типы флага "Тип карты" { TOPOGRAPHIC = 1, // Топографическая CK_42 = 1, // Система координат 42 года GEOGRAPHIC = 2, // Обзорно-географическая GLOBE = 3, // Космонавигационная (ГЛОБУС) CITYPLAN = 4, // Топографический план города LARGESCALE = 5, // Крупномасштабный план местности AERONAUTIC = 6, // Аэронавигационная SEANAUTIC = 7, // Морская навигационная AVIATION = 8, // Авиационная BLANK = 9, // Бланковка UTMNAD27 = 10, // UTM на North American Datum 1927 UTMWGS84 = 11, // UTM на WGS84 UTMTYPE = 12, // UTM CK_63 = 13, // Система координат 63 года CK_95 = 14 // Система координат 95 года } .... .... .... .... } [/CODE]
[QUOTE]Ксения Смирнова написал: А как сделать, чтобы объектам с одним кодом, указанным в классификаторе, например, лес густой, код 71111110, добавить семантику «относительная высота» и значение[/QUOTE] [CODE]using System.Windows.Forms; using maptype; using mapproc;
namespace MySolution { public partial class MainForm : Form { public void ForKsuhaSmirnova(HMAP map, double Hotn ) { HOBJ obj = mapCreateSiteObject(map, map); // создать контейнер для объекта HSELECT sel = mapCreateSiteSelectContext(map, map); // создать поисковик по карте mapSelectObject(sel , -1, 0); // "потушить" в поисковике все объекты (по умолчанию активны все объекты карты) // выбрать в поисковике только объекты с кодом 71111110 и площадой локализацией mapSelectObject(sel, mapRscObjectCode(map, 71111110, OL_SQUARE), 1); int flag = 0; while (mapSeekSiteSelectObject(map, map, obj, sel, flag)) // перебираем всё что найдено { mapAppendSemanticLong(obj, 1, Hotn); // добавляем семантику относительная высота (код 1) со значением Hotn (поступающим на вход процедуры) mapCommitObject(obj); // записываем содержимое "контейнера объекта" на карту flag = 4; } mapDeleteSelectContext(sel); // удаляем поисковик mapFreeObject(obj); // удаляем контейнер для объекта }
Пробовал копировать объект, - "воз" там же (см. оранжевые объекты) [QUOTE] while mapGetNextConsent(cross, obj) <> 0 do begin if mapReadCopyObject(ret, obj)<>0 then begin mapRegisterObject(ret, 81140100, OL_LINE); mapCommitObject(ret); end; end; [/QUOTE] П.С. работаю с ядром ГИС Панорама 13! (mapacces64.dll) .. не с GTK !
Вопрос к разрабочикам. Функция mapGetNextConsent точно должна формировать объект (красную линию)... не две зелёные? см.. картинку Выше?? п.с для проверки: Исходная карта находится в папке [B]\Data.Ani\Карта регионов\ICAO-countries.sitx[/B] (изделия АНИ)
[QUOTE] задается точка с известными радиалом (азимутом) и дальностью (выделена на рисунке красным – R187°, D28.9), как определить геодезические координаты этой точки?[/QUOTE]
Рисуем отрезок первая точка которого в VOR/DME а вторая произвольная Нажимаем на отрезок и считаем/меняем координату [IMG WIDTH=792 HEIGHT=500]https://c.radikal.ru/c25/2003/b8/ce5733a66a5e.png[/IMG]
После манипуляций результат во второй строчке (точка 2) см рисунок выше
ВАЖНО! Радиал от РНС это [B][U]магнитный [/U][/B]азимут от центра его антенны. Поэтому, при вычислении точки, к значению R187° нужно добавить магнитное склонение в РНС (из АИП)
[QUOTE]Елена Кузнецова написал: Возможно файл SHD имеет нулевую длину.[/QUOTE] Возможно. Уточняющий вопрос. Данная карта очень интенсивно обновляется (это карта реальной воздушной обстановки) Любое изменение глобальной настройки (подстановка цветного/чёрного классификатора, переход с даты на дату и.т.п) начинается из физического удаления всех файлов SIT (sit, sda, sse, shd) и повторное создание новой карты mapCreateAndAppendSite Сразу же после создания карты - идёт массовое нанесение объектов (до 500 штук) и каждые 4 секунды (тик) идёт полное обновление всех семантик и метрики (иммитация движения) Карта может работать в таком режиме месяцами НО, как видно из логов , появляются какие-то моменты, когда выдаётся вот такое сообщение.
[QUOTE]Денис Вицко написал: Скорее всего, fTmpMark.Parm некорректно заполняется.[/QUOTE] Денис, если бы заполнялась некорректно, то не было бы этого эффекта (отрисовки в диалоге при повторном вызове):
Кроме того, я не работаю со структурой, я работаю с памятью Выделил GetMem-ом слил туда дамп функцией mapDrawParameters и забыл до "деструктора" или повторного вызова.
[QUOTE]Денис Вицко написал: Для чистоты эксперимента можно попробовать вручную заполнить fTmpMark (без вызова диалогов) и посмотреть как отработает mapPaintExample.[/QUOTE] "Воз" там же.
Тут стоит вопрос как правильно заполнять TPAINTEXAMPLE
Имеется некий графический объект нарисованный в диалоге medChoicePointImage для болванки "HOBJ" и скопированный оттуда функциями mapDrawParameters mapDrawImageв память В Итоге, у меня в памяти нормальная структура типа [B]IMGMULTIMARK. [/B] Используя указатель на эту структуру, я корректно и правилно создаю объекты на карте НО у меня стоит задача ДО того как выполнено нанесение (на этапе настройки вида) отобразить этот дамп на TPanel или TForm неважно на потомке TControl
Пересмотре все возможные варианты функций остановился на [B]mapPaintExample[/B] [B] [/B] Подготовил структуру котрая передаётся вторым параметром
obj := mapCreateSiteObject(fTask.FHMap,fTask.FHMap); mapRegisterDrawObject(obj, 0, OL_MARK); if Assigned(fTmpMark.Parm) then// если уже есть вид передаём в диалог mapAppendDraw(obj, IMG_MULTIMARK, fTmpMark.Parm); if (medChoicePointImage(fTask.FHMap, fTask.FParm, obj, 0, 0)<>0) and (mapDrawImage(obj,1) = IMG_MULTIMARK) then begin if Assigned(fTmpMark.Parm) then FreeMem(fTmpMark.Parm); fTmpMark.Parm := nil; ref := mapDrawParameters(obj, 1); if Assigned(ref) then // запоминаем вид в памяти begin GetMem(fTmpMark.Parm, PIMGMULTIMARK(ref)^.Head.Length); move(ref^, fTmpMark.Parm^, PIMGMULTIMARK(ref)^.Head.Length); // залил
end; end; mapFreeObject(obj);[B] [/B]
--------------------- [B]отрисовка - НА ПАНЕЛИ НИЧЕГО НЕ ВИДНО[/B] procedure TdlgLoadParcel.FormPaint(Sender: TObject); begin if Assigned(fTask) and (fTmpMark.DC<>0) and Assigned(fTmpMark.Parm) then mapPaintExample(fTask.FHMap, fTmpMark); end;
ВОПРОС, что я не правильно заполнил ? Хотел бы получить эффект по типу "предварительного просмотра вида объекта