определение высоты точки по карте местности

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

определение высоты точки по карте местности

Сообщение SSecurity » 06.08.2008 (Ср) 1:35

Всем привет!

Есть: растровая картинка карта с векторным отображением изогипс (см. вложение)

Нужно:
определить высоту произвольной точки.

Для точки А, в принципе можно построить треугольник по которому определить приблизительную высоту.

С точкой Б возникает проблема, дело в том, что все окружающие её линии высот - соответствуют отметке 50м, т.е. высота самой точки >= 40м, а образованный линиями высот тр-к будет лежать в плоскости 50м.

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

Прошу помочь и буду благодарен за любые рекомендации

С Уважением,
SSecurity
Вложения
glubinas.jpg
малюсенький пример карты местности
glubinas.jpg (6.38 Кб) Просмотров: 1244
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.08.2008 (Ср) 7:41

Как по мне, так находишь перпендикуляры к кривым и аппроксимируешь.
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 06.08.2008 (Ср) 8:51

Я немного не понял вопрос. Это как бы на карте выходят резкие переходы, а на самом деле они не резкие? Если да, то моя идея вот:
Находим 2 перпендикуляра до близжайших границ (проще по спирали рассматривать точки (точка рассмотрения вращается относительно заданной точки, радиус постепенно увеличивается, рассматриваем разные границы, а не одну) ), после нахождения 2х точек пересечения перпендикуляров с границами примерно так:
D - растояние1
d - растояние2
H - высота рельефа1
h - высота рельефа2
myH= (D/(D+d))*H + (d/(D+d))*h
ЗЫ. не проверял, может и криво написал.
Follow the white rabbit.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 10:52

alibek писал(а):Как по мне, так находишь перпендикуляры к кривым и аппроксимируешь.


найти 2 перпендикуляра не сложно ... я так понимаю (.) пересечения перпендикляров должна совпадает с искомой точкой.
итого у нас два расстояния например

R1 = 23
R2 = 14

а дальше чего?
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 11:01

Proxy писал(а):Я немного не понял вопрос. Это как бы на карте выходят резкие переходы, а на самом деле они не резкие?

Резкие "нерезкие" переходы - это атметки высот на местности т.е. если ты выбераешь любую точку принадлежащую линии высот, то можешь с 99% увереностью сказать что высота в этой точке соответсвет например 50 метрам (1% - на кривизну составления карты и естественное изменение рельефа)


я точки сначала в базу помещаю а потом уже запросами нужные вытаскиваю ...

хотя вот алгоритм нахождения 2 перпендикулров как-то не очень однозначно выглядит
Proxy писал(а):D - растояние1
d - растояние2
H - высота рельефа1
h - высота рельефа2
myH= (D/(D+d))*H + (d/(D+d))*h


Код: Выделить всё
D = 23
d = 17
H = h = 40
myH = (23/40)*40 + (17/40)*40

myH = 40

:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.08.2008 (Ср) 11:08

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

Что-то вроде этого. Фиолетовая линия — это линия границы, а желтая — набор значений, по которым ты будешь аппроксимировать значения.
Вложения
map.jpg
Схема переходов.
map.jpg (10.1 Кб) Просмотров: 1223
Lasciate ogni speranza, voi ch'entrate.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 11:11

alibek писал(а):
SSecurity писал(а):я так понимаю (.) пересечения перпендикляров должна совпадает с искомой точкой.

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


т.е. мягко говоря мне нужно линии в базу скинуть и потом построить дополнительную некую среднюю ...
так там туева куча (множество) перпендикуляров может быть и с одним и темже перпендикуляром может множество пересекаться с другой стороны :)
Вложения
glubinas-2.jpg
glubinas-2.jpg (8.56 Кб) Просмотров: 1219
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.08.2008 (Ср) 11:26

На самом деле определение границ между зонами — довольно стандартная задача, у меня где-то даже код был для этого. Только это было давно.
Lasciate ogni speranza, voi ch'entrate.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 11:33

в принципе можно не париться :))))
25 % местности будет задано верно если я просто через каждые 5 пикселов буду ставить контрольную точку, ещё 40% местности - с непринципиальным рельефом (для создания фона) ... а оставшиеся 35% можно в принципе откорректировать редактором. ихмо написать редактор будет наверняка более точно - в любом случае сам рельеф можно будет корректировать :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.08.2008 (Ср) 11:35

Там нечего париться, это стандартная задача по теме численных методов. Но вот название запамятовал.
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 06.08.2008 (Ср) 12:29

Т.е. значения определены изначально только на "границах", а в промежутках между границ не оределены? И мы предполагаем, что рельеф между границ имеет линейный характер. Так?
Тогда почему бы не найти сначала наиблизжайшую точку с известным значением, затем найти на прямой Искомая точка - Найденная точка ещё точку с известным значением, но лежащую по другую сторону от искомой. Ну а далее по моей же формуле. Вроде всё гладко и просто выглядит.
Вложения
MyStupidPicture.jpg
Сори за качество. Под рукой только paint(
MyStupidPicture.jpg (8.25 Кб) Просмотров: 1219
Follow the white rabbit.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 14:08

Proxy писал(а):Т.е. значения определены изначально только на "границах", а в промежутках между границ не оределены? И мы предполагаем, что рельеф между границ имеет линейный характер. Так?
Тогда почему бы не найти сначала наиблизжайшую точку с известным значением, затем найти на прямой Искомая точка - Найденная точка ещё точку с известным значением, но лежащую по другую сторону от искомой. Ну а далее по моей же формуле. Вроде всё гладко и просто выглядит.


идея интересная ... :)
в принципе у меня сейчас в базе из оригинального файла 131420 точек (это те высоты в которых доподленно известны) :)

и чуть более 1.6 млн точек вычисления
можно попробовать - :)

по поводу линейности - да, линейна.
Если обратиться к картографии то есть такое понятие как 3D-линия - т.е. при ООООчень нелинейном рельефе указываются промежуточные точки например мужду линией в 50 и 60 метров ... проходит дополнительная линия которая указывает высоту в 55 м ... и проходит далеко не по середине ... тогда возможная пошаговая обработка.
т.е. сначала 50-55, а потом 55-60 ...

предложенный алгоритм подойдет ... тем более что здесь всего лишь потребуется взять координаты, сформировать запрос к БД на поиск наиближайшей точки получить её координаты и сформировать второй запрос по уровнению прямой для поиска точек с другой стороны ..

если есть - то хорошо, если нет - то значит берем точку в которой прямая ушла за пределы карты как искомую точку и вычисляем:)

тока вот представь если точка на выступ попадет, тогда вторая точка будет тойже высоты и чего делать ... строить перпендикуляр к прямой?
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 14:51

вот уточненные данные в базе

размер карты рельефа: 1654 х 3993
точек с известной высотой: 534788
точек для расчета высот: 264176 (при сетке 5х5)
коэф. сопосоставления карты со спутниковыми данными: 4.97

т.е. сетка на итоговой карте превратится в 25 х 25 кв. пикселов
и каждый пиксель на карте ~ 98 см :)

если считать по итоговой карте то перебором поиск ближайшего выльется в 534788^2 что на мой взгляд многова-то :)

"Вляпался" называется :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.08.2008 (Ср) 16:18

SSecurity
Сколько я ни пытался понять, что тебе нужно, так и не понял. Объясни, если хочешь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.08.2008 (Ср) 17:50

Хакер писал(а):SSecurity
Сколько я ни пытался понять, что тебе нужно, так и не понял. Объясни, если хочешь.


у меня есть карта на ней есть линии с отметками высот ... мне нужно определить высоту в любой произвольной точке карты.

Proxy
ну не мешало бы проверить не лежит ли точка на линии ... а то у меня
получилось уравнение прямой

y = 0x + 365
для точки с координатами (177,365) найдена вторая точка (1,365) щас найду вторую допишу
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 07.08.2008 (Чт) 2:37

все бы хорошо, но вот встретил проблему ....
по уравнению прямой получаю "перелет" значения через нужный пиксел.

смотрим на картинку :)

в базе просто лежит значение X = 2, Y = 4
при уравнении прямой Y = 2*X + 2 = 6 при этом точка на прямой не лежит ... но очень учитывать её нужно :))))

вопрос - как?

ДОБАВЛЕНО
Как вариант - можно определить угол наклона прямой ... и потом искать точки с похожим углом относительно искомой точки и близкие по растоянию к ней
Вложения
glubinas-3.jpg
glubinas-3.jpg (16.72 Кб) Просмотров: 1217
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 58

    TopList