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

Координаты по пеленгам

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Координаты по пеленгам
 
Здравствуйте! Помогите советом.

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

Вот три функции, манипулирую которыми можно найти (или не найти) пересечение двух Пеленгов
п.с подробности знает В.В.Беленков (бомбер)

Код
 // Прямая геодезическая задача на эллипсоиде                       // 03/04/12
 // Для расстояния не более 250 км координаты определяются с ошибкой до 0,0001",
 // а обратный азимут - до 0,001", что соответствует триангуляции 1 класса
 // Способ вспомогательной точки по методу Красовского
 // Метод предназначен для расстояний меньше радиуса Земли
 // Вычисления выполняются на текущем эллипсоиде, установленном
 // в документе - mapSetDocProjection
 // hmap     - идентификатор открытых данных
 // b1,l1    - геодезические координаты исходной точки
 // angle1   - азимут на вторую точку
 // distance - расстояние до второй точки
 // b2,l2    - рассчитанные координаты второй точки
 // angle2   - рассчитанный азимут со второй точки на первую
 //            (если angle2, то обратный азимут не вычисляется)
 // При ошибке в параметрах возвращает 0

_MAPIMP  long int _MAPAPI mapDirectPositionComputation(HMAP hmap,
double b1, double l1, double angle1,
double distance,
double * b2, double * l2, double * angle2);

 //  Преобразование из геодезических координат в радианах
 // (общеземной эллипсоид WGS84)
 //  в метры на местности в проекции карты
 // (поддерживается не для всех карт !)
 // hmap - идентификатор открытых данных
 // Bx,Ly,H  - преобразуемые координаты
 // на входе радианы, на выходе - метры
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGeoWGS84ToPlane3D(HMAP hmap, double *Bx, double *Ly,
double * H);
// Найти точку пересечения двух отрезков
//   a1, a2    - точки первого отрезка (A)
//   b1, b2    - точки второго отрезка (B)
//   cp1       - первая точка пересечения
//   cp2       - вторая точка пересечения
//   precision - точность, используемая для проверки равенства точек
//               (рекомендуется DOUBLENULL)
//   force     - флаг выполнения дополнительного поиска
//               (если равно 1, то учесть наличие отрезков нулевой длины)
// Возвращает CROSS-коды (code: CROSS_0, CROSS_1, CROSS_2 и др.).
// Число пересечений = (code & CROSS_GETCOUNT) = 0,1,2
// При ошибке параметров возвращает 0


_MAPIMP long int _MAPAPI ovlGetCrossPoint(DOUBLEPOINT* a1, DOUBLEPOINT* a2,
DOUBLEPOINT* b1, DOUBLEPOINT* b2,
DOUBLEPOINT* cp1, DOUBLEPOINT *cp2,
double precision, long int force);



Технология:
Наблюдатель 1 (точка А) и пеленг 1 (П1)
Наблюдатель 2 (точка Б) и пеленг 2 (П2)
----------------------------------------
1. От наблюдателя проводите виртуальную линию на расстояние соизмеримую с замерами пеленгов (например точка бомбометания)... то есть, пусть мы наблюдаем на полигоне 20*20 км, то линию проводим на 100 км
Вычисляем точки по функции 1

mapDirectPositionComputation(КАРТА, A.X, A.Y, П1, 100000, рез1.X, рез1.Y, рез1.Z)
mapDirectPositionComputation(КАРТА, Б.X, Б.Y, П2, 100000, рез2.X, рез2.Y, рез1.Z)

2. используя функцию 2 mapGeoWGS84ToPlane3D переводите точки в плановую систему координат

mapGeoWGS84ToPlane3D(КАРТА, A.X, A.Y);  mapGeoWGS84ToPlane3D(КАРТА, рез1.X, рез1.Y)   --первый отрезок
mapGeoWGS84ToPlane3D(КАРТА, Б.X, Б.Y);  mapGeoWGS84ToPlane3D(КАРТА, рез2.X, рез2.Y)   --второй отрезок

3. функцией номер 3 ovlGetCrossPoint ищем возможное пересечение

ovlGetCrossPoint(A,рез1,Б,рез2,пересечение1,пересечение2, точность, 1)
если результат функции равен единице - у вас в точке "пересечение1" будет нужная координата в плане

функцией mapToPlaneToGeoWGS84 можно найти координаты в геодезической СК
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Добрый день.
Решаю задачу по описанной выше технологии, те есть два направления и координаты обзора первой и второй точки
Наблюдатель 1 (точка А) и пеленг 1 (П1)
Наблюдатель 2 (точка Б) и пеленг 2 (П2)

для точек
широта 1=25.3370934
долгота 1=60.6495057
угол на источник 1=135.0

и

широта 2=25.3017776
долгота 2=63.4324302
угол на источник2=225.0


mapDirectPositionComputation(КАРТА, A.X, A.Y, П1, 100000, рез1.X, рез1.Y, рез1.Z)
mapDirectPositionComputation(КАРТА, Б.X, Б.Y, П2, 100000, рез2.X, рез2.Y, рез1.Z)
mapGeoWGS84ToPlane3D(КАРТА, A.X, A.Y);  mapGeoWGS84ToPlane3D(КАРТА, рез1.X, рез1.Y)
mapGeoWGS84ToPlane3D(КАРТА, Б.X, Б.Y);  mapGeoWGS84ToPlane3D(КАРТА, рез2.X, рез2.Y)
ovlGetCrossPoint(A,рез1,Б,рез2,пересечение1,пересечение2, точность, 1)
mapPlaneToGeoWGS84(hmap, &Bx, &Ly);

функция ovl.. возвращает 1 просчитываю х и у перевожу в широту долготу ура.

Далее хочу проверть решение по обратной геодезической задаче те
беру точку 1

широта 1=25.3370934
долгота 1=60.6495057

беру результирующую точку которая получилась
cp=2720892.0562890 | 6896904.7991061
geo  =24.0198497712 62.0599876357
mapInversePositionComputation(hmap, lat1, ln1, lat2, ln2, &angle)

и получаю угол angle=135.331 вместо угла на источник 1=135.0
Вопрос откуда такая погрешность?
 
Делаю предположение.
Геодезическая задача ищет точку по кратчайшему расстоянию на дуге.
Далее заменяем дугу прямыми линиями и берем пересечение.

Я бы предложил строить ортодромию с набором точек с шагом в 1 км, например.
И уже искать пересечение для полученных объектов.
Точность будет выше (в пределах 1 км, соответственно).
Код
// Построение ортодромии
 // first - координаты первой точки в радианах
 // second - координаты второй точки в радианах
 // array - адрес массива координат построенной ортодромии,
 //         размер массива равен count
 // count - количество точек для построения ортодромии (если точки размещены ближе 10-6 радиан, заполняет 2 точки)
 // Возвращает заполненное число точек в массиве
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapOrthodrome(DOUBLEPOINT * first, DOUBLEPOINT * second, DOUBLEPOINT * array, long int count);
Страницы: 1
Читают тему (гостей: 1)



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

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