Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите перевести с VisualBasic в Delphi, очень нужна ваша помощь. 
:(
    Опции темы
VirtualHouse
  Дата 19.8.2005, 23:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Это умная програмка перевода с координат системы GPS в наши метровые координаты. Очень полезная вещь. Только написана она не на делфи.




1 Функции рабочей книги для преобразования
1 геодезических координат из координатной системы Пулково 1942
' в координатную систему WGS84
' Все угловые значения передаются и возвращаются в градусах, ' высоты передаются и возвращаются в метрах
1 Сделано на основании ГОСТ Р 51794-2001 Российской Федерации
Const Pi As Double = 3.14159265358979 ' Число, Пи
Const ro As Double = 206264.8062 ' Число угловых секунд в радиане
1 Эллипсоид Красовского (Пулково 1942)
Const aP As Double = 6378245 ' Большая полуось
Const alP As Double = 1 / 298.3 ' Сжатие
Const e2P As Double = 2 * alP - alP A 2 ' Квадрат эксцентриситета
1 Эллипсоид GRS80 (WGS84)
Const aW As Double = 6378137 ' Большая полуось
Const alW As Double = 1 / 298.257223563 ' Сжатие
Const e2W As Double = 2 * alW - alW x 2 ' Квадрат эксцентриситета
1 Вспомогательные значения для преобразования эллипсоидов Const a As Double = (aP + aW) /2 Const e2 As Double = (e2P + e2W) / 2 Const da As Double = aW - aP Const de2 As Double = e2W - e2P
1 Линейные элементы трансформирования, в метрах
Const dx As Double =23.92
Const dy As Double = -141.27
Const dz As Double = -80.9
1 Угловые элементы трансформирования, в секундах
Const wx As Double = 0
Const wy As Double = 0
Const wz AS Double = 0
' Дифференциальное различие масштабов
Const ms As Double = 0
Function WGS84_SK42_Lat(Bd, Ld, H As Double) As Double
WGS84_SK42_Lat = Bd - dB(Bd, Ld, H) / 3600
End Function
Function SK42_WGS84_Lat(Bd, Ld, H As Double) As Double
SK42__WGS84__Lat = Bd + dB(Bd, Ld, H) / 3600
End Function
Function WGS84_SK42__Long(Bd, Ld, H As Double) As Double
WGS84_SK42__Long = Ld - dL(Bd, Ld, H) / 3600
End Function
Function SK42_WGS84_Long(Bd, Ld, H As Double) As Double
SK42_WGS84_Long = Ld + dL(Bd, Ld, H) / 3600
End Function
Function dB(Bd, Ld, H As Double) As Double
Dim B, L, M, N- As Double
В = Bd * Pi / 180
L * Ld * Pi / 180
M = a * (1 - e2) / (1 - e2 * Sin(B) A 2) A 1.5
N = a * (1 - e2 * Sin(B) A 2) л -0.5
dB = ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da _ + (NA2/aA2+l) *N* Sin(B) * Cos(B) * de2 / 2
- (dx * Cos(L) + dy * Sin(L)) * Sin(B) + dz * Cos(B)) _
- wx * Sin(L) * (1 + e2 * Cos ,(2 * B) ) _
+ wy * Cos(L) * (1 + e2 * Cos(2 * B)) _
- ro * ms * e2 * Sin(B) * Cos(B)




End Function
Function dL(Bd, Lid, H As Double) As Double
Dim B, L, N As Double
В = Bd * Pi / 180 L = Ld * Pi / 180 N = a * (1 - e2 * Sin(B) л 2) A -0.5
dL = ro / ((N + H) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L))
+ Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz
End Function
Function WGS84Alt(Bd, Ld, H As Double) As Double
Dim B, L, N, dH As Double
В = Bd * Pi / 180 L = Ld * Pi / 180 N = a * (1 - e2 * Sin(B) A 2) x -0.5
dH = -a / N * da + N * Sin(B) A 2 * de2 / 2
+ (dx * Cos(L) + dy * Sin(L)) * Cos(B) + dz * Sin(B) _
- N * e2 * Sin(B) * Cos(B) * (wx / ro * Sin(L) - wy / ro * Cos(L)) _
+ (a A 2 / N + H) * ms
WGS84Alt = H + dH End Function

  Вверх
VirtualHouse
Дата 19.8.2005, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.8.2005

Репутация: нет
Всего: нет



ПОПРАВОЧКА


Вместо л и А ставится ^ это в квадрате просто фаин ридер плохо раскидал символы
PM MAIL   Вверх
Fedor
Дата 20.8.2005, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32




Модератор: друзья! Если у вас назрел вопрос по Бэйсику или по Делфи или по этим обоим языкам вместе взятым, то зачем же постить вопрос в раздел Паскаля? В общем, перенесено из Паскаля в Центр помощи.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
VirtualHouse
Дата 20.8.2005, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.8.2005

Репутация: нет
Всего: нет



Спасибо что пернесли туда куда надо. но мне надо решить этот вопрос. с переводом с системы измерения GPS в нашё метровую систему координат
PM MAIL   Вверх
Mayk
Дата 20.8.2005, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Ну и в чем собсно проблема? Инструкции вида
Цитата(VirtualHouse @ 20.8.2005, 03:04)
Function WGS84_SK42_Lat(Bd, Ld, H As Double) As Double

Заменяешь на
Код

Function WGS84_SK42_Lat(Bd, Ld, H: Double) : Double; begin

Цитата(VirtualHouse @ 20.8.2005, 03:04)
WGS84_SK42_Lat = Bd - dB(Bd, Ld, H) / 3600

на
Код

WGS84_SK42_Lat := Bd - dB(Bd, Ld, H) / 3600;


Цитата(VirtualHouse @ 20.8.2005, 03:04)
Const aW As Double = 6378137 ' Большая полуось

на
Код

Const aW : Double = 6378137; //Большая полуось

(или как там в пасе консты объявляются?)




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Pakshin A. S.
Дата 20.8.2005, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 5
Всего: 61



Цитата(Mayk @ 20.8.2005, 09:31)
или как там в пасе консты объявляются?)

Верно.. так...
PM   Вверх
VirtualHouse
Дата 20.8.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.8.2005

Репутация: нет
Всего: нет



Спасибо но он мне тут даёт ошибку В = Bd * Pi / 180

PM MAIL   Вверх
Fedor
Дата 20.8.2005, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Цитата(VirtualHouse @ 20.8.2005, 11:37)
В = Bd * Pi / 180


Код

В := Bd * Pi / 180



--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
rsm
Дата 20.8.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Вроде накатал нечто похожее на этот код. Только перед работой нужно будет вызвать процедуру InitVariables, т.к. Дельфи не понимает объявлений вида "da As Double = aW - aP" ни для констант, ни для переменных.

Код

unit gps;

interface

uses Math;

   procedure InitVariables;
   function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
   function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
   function dB(Bd, Ld, H :Double) :Double;
   function dL(Bd, Ld, H :Double) :Double;
   function WGS84Alt(Bd, Ld, H :Double) :Double;

const
   Pi   :Double = 3.14159265358979;
   ro   :Double = 206264.8062;
   aP   :Double = 6378245;
   alP  :Double = 1 / 298.3;
   aW   :Double = 6378137;
   alW  :Double = 1 / 298.257223563;
   dx   :Double = 23.92;
   dy   :Double = -141.27;
   dz   :Double = -80.9;
   wx   :Double = 0;
   wy   :Double = 0;
   wz   :Double = 0;
   ms   :Double = 0;

var
   e2W, a, e2P, de2, e2, da :Double;

implementation

procedure InitVariables;
begin
   e2W:= 2 * alW - Sqr(alW);
   a:= (aP + aW) / 2;
   e2P:= 2 * alP - Sqr(alP);
   de2:= e2W - e2P;
   e2:= (e2P + e2W) / 2;
   da:= aW - aP;
end;

function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd - dB(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd + dB(Bd, Ld, H) / 3600;
end;

function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld - dL(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld + dL(Bd, Ld, H) / 3600;
end;

function dB(Bd, Ld, H :Double) :Double;
var
   B, L, M, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   M:= a * (1 - e2) / Power(1 - e2 * Sqr(Sin(B)), 1.5);
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da +
      (Sqr(N) / Sqr(a)+l) * N * Sin(B) * Cos(B) * de2 / 2 -
      (dx * Cos(L) + dy * Sin(L)) * Sin(B) + dz * Cos(B)) -
      wx * Sin(L) * (1 + e2 * Cos(2 * B)) + wy * Cos(L) *
      (1 + e2 * Cos(2 * B)) -  ro * ms * e2 * Sin(B) * Cos(B);
end;

function dL(Bd, Ld, H :Double) :Double;
var
   B, L, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / ((N + H) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L)) +
      Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz;
end;

function WGS84Alt(Bd, Ld, H :Double) :Double;
var
   B, L, N, dH :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   dH:= -a / N * da + N * Sqr(Sin(B)) * de2 / 2 +
      (dx * Cos(L) + dy * Sin(L)) * Cos(B) + dz * Sin(B) -
      N * e2 * Sin(B) * Cos(B) * (wx / ro * Sin(L) - wy / ro * Cos(L)) +
      (Sqr(a) / N + H) * ms;
   Result:= H + dH;
end;

end.


Это сообщение отредактировал(а) rsm - 20.8.2005, 12:29
PM MAIL   Вверх
Alex
Дата 20.8.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



Цитата(rsm @ 20.8.2005, 13:15)
Только перед работой нужно будет вызвать процедуру InitVariables

Не нужно:
Код

unit gps;

interface

uses Math;

   function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
   function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
   function dB(Bd, Ld, H :Double) :Double;
   function dL(Bd, Ld, H :Double) :Double;
   function WGS84Alt(Bd, Ld, H :Double) :Double;

const
   Pi   :Double = 3.14159265358979;
   ro   :Double = 206264.8062;
   aP   :Double = 6378245;
   alP  :Double = 1 / 298.3;
   aW   :Double = 6378137;
   alW  :Double = 1 / 298.257223563;
   dx   :Double = 23.92;
   dy   :Double = -141.27;
   dz   :Double = -80.9;
   wx   :Double = 0;
   wy   :Double = 0;
   wz   :Double = 0;
   ms   :Double = 0;

var
   e2W, a, e2P, de2, e2, da :Double;

implementation

procedure InitVariables;
begin
   e2W:= 2 * alW - Sqr(alW);
   a:= (aP + aW) / 2;
   e2P:= 2 * alP - Sqr(alP);
   de2:= e2W - e2P;
   e2:= (e2P + e2W) / 2;
   da:= aW - aP;
end;

function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd - dB(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd + dB(Bd, Ld, H) / 3600;
end;

function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld - dL(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld + dL(Bd, Ld, H) / 3600;
end;

function dB(Bd, Ld, H :Double) :Double;
var
   B, L, M, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   M:= a * (1 - e2) / Power(1 - e2 * Sqr(Sin(B)), 1.5);
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da +
      (Sqr(N) / Sqr(a)+l) * N * Sin(B) * Cos(B) * de2 / 2 -
      (dx * Cos(L) + dy * Sin(L)) * Sin(B) + dz * Cos(B)) -
      wx * Sin(L) * (1 + e2 * Cos(2 * B)) + wy * Cos(L) *
      (1 + e2 * Cos(2 * B)) -  ro * ms * e2 * Sin(B) * Cos(B);
end;

function dL(Bd, Ld, H :Double) :Double;
var
   B, L, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / ((N + H) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L)) +
      Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz;
end;

function WGS84Alt(Bd, Ld, H :Double) :Double;
var
   B, L, N, dH :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   dH:= -a / N * da + N * Sqr(Sin(B)) * de2 / 2 +
      (dx * Cos(L) + dy * Sin(L)) * Cos(B) + dz * Sin(B) -
      N * e2 * Sin(B) * Cos(B) * (wx / ro * Sin(L) - wy / ro * Cos(L)) +
      (Sqr(a) / N + H) * ms;
   Result:= H + dH;
end;

initialization
  InitVariables;

end.



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
VirtualHouse
Дата 20.8.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.8.2005

Репутация: нет
Всего: нет



Спрасибо большое. Кстати эта нужная прога для всех кто пользуется GPS
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1086 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.