На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Соединение двух точек

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
Соединение двух точек
 
Здравствуйте, помогите пожалуйста разобраться. Есть БД в ней координаты городов А и Б. Нужно чтобы строились линии (дуги)от А до Б.
 
Цитата
Александр Карулин написал:
Здравствуйте, помогите пожалуйста разобраться. Есть БД в ней координаты городов А и Б. Нужно чтобы строились линии (дуги)от А до Б.
Добрый день!
Уточните. пожалуйста, в какой программе и под какую OC работаете?
 
Delphi, windows
 
Добрый день!

Цитата
Александр Карулин написал:
Panorama 15, id 104300
У Вас лицензия на GIS ToolKit Free 15. Это инструментарий, предназначенный для разработки автономных ГИС-приложений.
Если Вам нужна прикладная задача, работающая в составе ГИС Панорама, вам следует использовать интерфейс PANTASK на основе MAPAPI.
Подробнее про выбор средств разработки тут.

В GIS ToolKit Free 15 для работы с объектами карты (в том числе создания линейных объектов) предназначен компонент TMapObj.
Для создания прямой линии достаточно просто создать линейный объект из 2х точек - начала и окончания (А и Б).
Под дугами, я так понимаю, Вы имели в виду ортодромию.
Ортодромию можно построить методом TMapView.CreateOrthodrome или функцией
Код
 // Построение ортодромии
 // first - координаты первой точки в радианах
 // second - координаты второй точки в радианах
 // pArr - адрес массива координат построенной ортодромии;
 //         размер массива равен count
 // count - количество точек для построения ортодромии (если точки размещены ближе 10-6 радиан, заполняет 2 точки)
 // Возвращает заполненное число точек в массиве 
 // При ошибке возвращает ноль

function  mapOrthodrome(First, Second, pArr : PDoublePoint; count: integer) : integer;
  stdcall external sGisAcces;


Полученные точки ортодромии следует заполнить в метрику создаваемого объекта.

Либо можно воспользоваться функцией, которая построит и сразу заполнит метрику ортодромии в объект:
Код
 // Построение ортодромии (дуга на поверхности Земли, задающая кратчайшее расстояние)
 // между заданными точками
 // info   - идентификатор объекта карты в памяти
 // first  - координаты первой точки в радианах на текущем эллипсоиде документа (SetDocProjection)
 // second - координаты второй точки в радианах
 // При больших расстояниях точки дуги формируются с шагом не более 0,5 градуса,
 // при малых растояниях - не чаще 10 километров, что обеспечивает определение
 // длин и углов с точностью триангуляции 1 класса
 // При ошибке возвращает ноль

function  mapOrthodromeObject(info : HOBJ; first, second : PDOUBLEPOINT) : integer;
  stdcall external sGisAcces;
 
Не строится ортодромия. Что не так делаю?

procedure TForm1.Button3Click(Sender: TObject);
var
   p1, p2  : TDOUBLEPOINT;
   pp1, pp2 : PDOUBLEPOINT;
   orto : array [0..4] of TDOUBLEPOINT;
 begin
     p1.X := 0.9730323687;
     p1.Y := 0.6565060353;

     p2.X := 0.9921269978;
     p2.Y := 1.0579614351;

     pp1 := @p1;
     pp2 := @p2;

    mvMap.CreateOrthodrome(pp1, pp2, @orto[0], Length(orto));

 end;
 
Цитата
Александр Карулин написал:
Не строится ортодромия. Что не так делаю?
  • По этим параметрам ортодромия строится корректно, но желательно увеличить размер массива, например, до 64 точек.
  • На картинке более 1 300 точек.
 
Добрый день!

Цитата
Александр Карулин написал:
mvMap.CreateOrthodrome(pp1, pp2, @orto[0], Length(orto));

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

Для работы метода TMapView.CreateOrthodrome в компоненте TMapView должна быть открыта карта. И, поскольку, метод работает с угловыми координатами, эта карта должна поддерживать геодезические СК (то есть крупномасштабный план с прямоугольными координатами без привязки к глобальным СК не подойдет).
 
Спасибо за помощь, но разобраться не удалось.
Добавил создание объекта, метрик из массива, но объект на карту не записывается.


procedure TForm1.Button3Click(Sender: TObject);
var
   i: integer;
   p1, p2  : TDOUBLEPOINT;
   pp1, pp2 : PDOUBLEPOINT;
   orto : array [0..4] of TDOUBLEPOINT;
 begin
     p1.X := 0.9730323687;
     p1.Y := 0.6565060353;

     p2.X := 0.9921269978;
     p2.Y := 1.0579614351;

     pp1 := @p1;
     pp2 := @p2;


     mvMap.CreateOrthodrome(pp1, pp2, @orto[0], Length(orto));
     MapObj1.CreateObjectByInCode(0,KM_IDDOUBLE2,cLOCAL_LINE);

    for i:= 0 to Length(orto)-1 do
       begin
         Memo1.Lines.Add(Format('x[%d] = %f, y[%d] = %f', [i+1, orto[i].X, i+1, orto[i].Y]));
         MapObj1.Metric.Append(0, @orto[i].X);
         MapObj1.Metric.Append(0, @orto[i].Y);
       end ;

     MapObj1.Commit;

 end;
Изменено: Александр Карулин - 14.10.2025 12:20:44
 
Добрый день!

Компонент TMapObj связан с TMapView?

Проверьте коды возврата от CreateObjectByInCode, .Metric.Append и Commit.

Визуально при использовании CreateObjectByInCode есть ошибка: cLOCAL_LINE - это не внутренний код, а характер локализации (линейный объект).
Вообще, внутренние коды используются только на программном уровне. Если Вы хотите зарегистрировать объект каким-то условным знаком, который Вы знаете, то можно, например, в редакторе классификатора посмотреть его код и с ним зарегистрировать объект.
Но это будет внешний код! А внутренний нигде в интерфейсе увидеть нельзя.

Лучше так:
Код
TMapObj.CreateObjectByExcode(0, KM_IDDOUBLE2, 1000000001, cLOCAL_LINE);
 
Коды возврата проверил

MapObj1.CreateObjectByExcode(0, KM_IDDOUBLE2, 1000000001, cLOCAL_LINE);

if (MapObj1.CreateObjectByExcode(0, KM_IDDOUBLE2, 1000000001, cLOCAL_LINE)) = 0 then ShowMessage('Ошибка!!');

ошибки нет (
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2026

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности