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

Непонятное поведение mapDistanceObjectEx

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Непонятное поведение mapDistanceObjectEx
 
При определении минимального расстояния между объектами с помощью функции
Код
 // Определение кратчайшего расстояния между объектами и координат
 // точек на контурах объектов
 // hobj1  - идентификатор первого объекта карты в памяти
 // hobj2  - идентификатор второго объекта карты в памяти
 // point1 - координаты первой точки линии кратчайшего расстояния
 //          между объектами (на объекте hobj1)
 // point2 - координаты второй точки линии кратчайшего расстояния
 //          между объектами (на объекте hobj2)
 // Возвращает вычисленное расстояние  в метрах
 // или большое значение (>= 100000000) в случае ошибки

_MAPIMP double _MAPAPI mapDistanceObjectEx(HOBJ hobj1, HOBJ hobj2, DOUBLEPOINT * point1, DOUBLEPOINT * point2);
иногда возникает ситуация, когда линейные объекты пересекаются, соответственно расстояние =0, но в point1 и point2 тоже все нули, вот пример  https://disk.yandex.ru/i/fu59s8r4fwfnpw
дуга графа дорог 1832 пересекает реку 992 (линейный объект), (x1,x2) - из point1 (x2,y3) - из point2.
Так и задумывалось для пересекающихся объектов?
Также нули в point1 и point2 возвращаются если, например, дуга графа дорог лежит внутри площадного объекта (леса).
И как эти ситуации различать между собой?
 
1. Если контура объектов 1 и 2 пересекаются, то расстояние между ними 0.
2. Если любой контур лежит внутри контура площадного объекта, то расстояние между ними 0.
3. Если нужно найти расстояние от контура линейного объекта (дуги) до контура площадного объекта (леса), то необходимо предварительно площадному объекту (лесу) назначить локализацию "Линейный". Проще всего это сделать с помощью функции:
mapDescribeObject(hobj, LINESERVINCODE);
Затем вызвать mapDistanceObjectEx(...)
 
расстояние понятно, что 0. А почему у двух линейных объектов дает 0 в координатах ближайшей точки? ведь это фактически точка пересечения
 
На рисунке показано положение точек:
// point1 - координаты первой точки линии кратчайшего расстояния
//          между объектами (на объекте hobj1)
// point2 - координаты второй точки линии кратчайшего расстояния
//          между объектами (на объекте hobj2)

Вариант А
Точка point1 совпадает с точкой контура объекта 1
Точка point2 не совпадает с точкой контура объекта 2 (точка лежит на отрезке объекта 2)

Вариант Б
Точки point1 и point2 не совпадают с точками контуров (точка пересечения лежит на отрезках объектов 1 и 2)

Данная функция не предназначена для возврата точек пересечения. Точек пересечения у объектов может быть много
Код
 // HCROSS hCross = mapCreateObjectsCross(info1, info2, method, precision)
 // if (hCross)
 // {
 //   while(mapGetNextCross(hCross,info))
 //   {
 //     ...
 //   }
 //   mapFreeObjectsCross(hCross);
 // }
 
Существует ли функция поиска средней точки линейного объекта (ломаной полилинии), лежащей на объекте и находящейся на равном расстоянии от обоих концов?
 
Если правильно Вас поняли: нужно найти середину длины контура.

Соответственно запрашиваем длину контура, делим пополам, запрашиваем координаты точки по заданной длине от начала.
Если вызывать функции, работающие с координатами объектов на карте, то это будет геометрическое построение.
Если работать с реальными длинами на эллипсоиде, то геодезическое.
Результаты могут сильно отличаться с учетом проекции карты.

Например:
Код
 // Вычисление длины объекта по карте
 // Координаты объекта не пересчитываются, полученная длина может значительно отличаться от реальной длины объекта на местности
 // info - идентификатор объекта карты в памяти
 // Для подобъектов считается суммарная длина
 // При ошибке возвращает ноль

_MAPIMP double _MAPAPI mapLengthInMap(HOBJ info);

  // Определение координат точки, лежащей на заданном расстоянии вдоль контура от заданной точки
  // Расчеты выполняются в системе координат карты без учета проекции
  // info   - идентификатор объекта в памяти
  // number - номер начальной точки
  // distance - расстояние
  // если distance > = 0 - поиск по направлению цифрования
  //               <   0 - поиск против направления цифрования
  // point - координаты выходной точки в прямоугольной системе в метрах на местности
  // subject - номер подобъекта
  // Возвращает номер точки, за которой находится или c которой совпадает найденная точка
  // Если найденная точка в точности совпадает с точкой метрики, то возвращается отрицательный номер точки
  // Если запрошенное расстояние превышает длину объекта - возвращает ноль
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSeekVirtualPointByDistanceInMap(HOBJ info, long int number, double distance, DOUBLEPOINT *point, long int subject);

Если применить аналогичные функции с названиями без "InMap", то будет построение на эллипсоиде.
 
Цитата
Валерий Парусов написал:
иногда возникает ситуация, когда линейные объекты пересекаются, соответственно расстояние =0, но в point1 и point2 тоже все нули
Вот пример кода для сборки библиотеки и запуска из меню Задачи - Запуск приложений. Для пересечения двух линейных объектов возвращает нулевое расстояние и координаты.
Код
#include "mapapi.h"   

int CallApplication(HMAP hMap, const TASKPARMEX * parm)
{
  TEMPHOBJ hobj1 = mapCreateSiteObject(hMap, hMap);
  if (mapReadObjectByKey(hMap, hMap, hobj1, 1, 1) == 0)
    return 0;

  TEMPHOBJ hobj2 = mapCreateSiteObject(hMap, hMap);
  if (mapReadObjectByKey(hMap, hMap, hobj2, 1, 2) == 0)
    return 0;

  DOUBLEPOINT point1;
  DOUBLEPOINT point2;

  double ret = mapDistanceObjectEx(hobj1, hobj2, &point1, &point2);

  char text[128] = { 0 };

  Snprintf(text, sizeof(text), "Расстояние: %lf.1, X1 = %lf.1, Y1 = %lf.1, X2 = %lf.1, Y2 = %lf.1",
    ret, point1.X, point1.Y, point2.X, point2.Y);

  mapMessageBox(0, text, "Тест для mapDistanceObjectEx", MB_OK | MB_TASKMODAL | MB_ICONINFORMATION);

  return 0;
}

// --------------------------------------------------------------
//  Точка входа в задачу
// --------------------------------------------------------------
extern "C"
{
  __declspec(dllexport) long int WINAPI GetInterfaceVersion() { return 0; }

  __declspec(dllexport) long int WINAPI CallMapFunctionEx(HMAP hmap, const TASKPARMEX * parm)
  {
    if (hmap == 0) return 0;
    return CallApplication(hmap, parm);
  }

  __declspec(dllexport) long int WINAPI CallGisFunctionEx(HMAP hmap, const TASKPARMEX * parm)
  {
    return CallMapFunctionEx(hmap, parm);
  }
}
 
Спасибо, я уже сделал вычисление точек пересечения при нулевых координатах через mapCreateObjectsCross
Страницы: 1
Читают тему (гостей: 1)



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

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