一括表示

何時もお世話になります。
Hamlog ユーザーからの依頼なのですが
メニューの「オプション」「環境設定」「設定3」にての
緯度経度 「方位と距離を表示する」の設定をしておいて、
データ入力ウインドウの右上に表示される「方位」データを VB.net にて取得出来る方法はありますか?
VB.net にて2点間の緯度経度から方位を取得するサンプルコードは未発見です。
有っても直ぐに利用出来るかどうかですが。

国内局の時にはユーザーリストにマッチする等でcode欄に記入されないと表示されませんが。

DX局の時にはコールサインから Entity を確定して Entity と方位を
関連つけたファイルから取得は出来ました。

2021/11/05(Fri) 16:20:23  [No.947]


WM_COPYDATA で
117 = 入力ウインドウの方位と距離の文字列を得る。
というのがありましたけど、使えますか?

入力ウインドウで適当に W6AAA と入れてEnterキーを押し、
117番を送ったら、
「方位:44度 9302km」という文字列が返ってきました。

> 何時もお世話になります。
> Hamlog ユーザーからの依頼なのですが
> メニューの「オプション」「環境設定」「設定3」にての
> 緯度経度 「方位と距離を表示する」の設定をしておいて、
> データ入力ウインドウの右上に表示される「方位」データを VB.net にて取得出来る方法はありますか?
> VB.net にて2点間の緯度経度から方位を取得するサンプルコードは未発見です。
> 有っても直ぐに利用出来るかどうかですが。
>
> 国内局の時にはユーザーリストにマッチする等でcode欄に記入されないと表示されませんが。
>
> DX局の時にはコールサインから Entity を確定して Entity と方位を
> 関連つけたファイルから取得は出来ました。

2021/11/05(Fri) 20:26:59  [No.948]


浜田さん、こんばんは。

> WM_COPYDATA で
> 117 = 入力ウインドウの方位と距離の文字列を得る。
> というのがありましたけど、使えますか?

あらら、これは見落としていました。先日までは何回か HamlogMs.txt を
見ていたのですが、注意不足でした。ありがとうございます。

それにしてもWeb上に VB.net で検索で「緯度経度 方位」のサンプルが出てこない。

2021/11/05(Fri) 20:50:03  [No.949]


>
> それにしてもWeb上に VB.net で検索で「緯度経度 方位」のサンプルが出てこない。
>
AOB 銅子です
役に立かは分かりませんが、C#のもの送りますか。
GLを使っていますが、緯度・経度に直して方位と距離を出します。Hamlogとほぼ同じの結果が得られます。

送って置きました。参照下さい。

2021/11/06(Sat) 10:48:53  [No.950]


JA9AOB 銅子さん、こんにちは。何時もありがとうございます。

> 役に立かは分かりませんが、C#のもの送りますか。
> GLを使っていますが、緯度・経度に直して方位と距離を出します。Hamlogとほぼ同じの結果が得られます。
> 送って置きました。参照下さい。

いま、受取りました。C#から VB.net への変換をこれからします。

2021/11/06(Sat) 11:46:11  [No.951]


JA9AOB 銅子さん、ありがとうございます。

> GLを使っていますが、緯度・経度に直して方位と距離を出します。
> 送って置きました。参照下さい。

C# からVB.net に変換して見ましたが数か所エラーが出ます。
調査中ですが対処出来るかどうか?

どなたか、他にも2点間の緯度経度から方位を求めるコードがありませんか?

VB.net版が良いですが、C++ や C# でも変換努力しますが。

2021/11/06(Sat) 19:02:23  [No.953]


ちょっとバタバタしてまして、明日の夕方までにはメールで送ります。
VB.netは、浮動小数点が doubleよりも大きい変数は扱えるのでしょうか。
浮動小数点演算の精度が若干落ちるのかな、と思いまして。
C#なら、long doubleとかあると思いますが。

大昔に勉強したような三角関数、ラジアンとか使ってます。
今ではさっぱり理解できません。
教えていただいた計算式を、Delphiのソースに変えただけです。
三角関数系のライブラリがVB.netにあれば使えると思います。

> どなたか、他にも2点間の緯度経度から方位を求めるコードがありませんか?
>
> VB.net版が良いですが、C++ や C# でも変換努力しますが。

2021/11/06(Sat) 22:09:55  [No.954]


JG1MOU 浜田さん、ありがとうございます。

> ちょっとバタバタしてまして、明日の夕方までにはメールで送ります。

お手数をお掛けします。浜田さんが参照したと言う Nifty フォーラムはクローズしていて中身は既に削除されていてソースにたどり着けませんでした。

> VB.netは、浮動小数点が doubleよりも大きい変数は扱えるのでしょうか。

どうでしょうか、通常は Int32 , Long 位しか使わないので。
Webで調べると下記のデータがありました。

Double System.Double 倍精度浮動小数点型 64bit 8バイト

負の値:
-1.79769313486231570×10^308 〜 -4.94065645841246544×10^-324

正の値:
4.94065645841246544×10^-324 〜 1.79769313486231570×10^308

2021/11/07(Sun) 07:28:48  [No.955]


// Pascal言語をC言語に直しました。
// Delphiでは、Double型よりも大きいExtended型を使っています。
double Ido2Radian(const int i1, i2, i3)

{// 緯度・経度をラジアン値に変換する
// i1=時、i2=分、i3=秒
double Ido1;
Ido1 = i2 * 60 + (i3 & $7f); // Max 3599, 3600秒=1度
Ido1 = Ido1 / 3600.0; // 分・秒を 0.nnnn度に直す
Ido1 = Ido1 + i1;
Ido1 = DegToRad(Ido1); // ラジアンを返す
if (i3 & $80) // 最上位ビットが立っていれば
return -Ido1; // 南緯・西経
else
return Ido1; // 東経・北緯}


int Houi_Kyori(const double Ido1, Kdo1, Ido2, Kdo2, char *sbuff)

{// Ido1〜Kdo2は、Ido2Radian()で求めた値を渡す
int FAngle;
double al, al2;
double U, V, W, U2, V2, W2, DI;
// Ido1, Kdo1 から Ido2, Kdo2 への距離、方位角を求める
if (Ido1==Ido2 && Kdo1==Kdo2)
return -1; // 同じ位置です

U = cos(Ido2) * cos(Kdo2);
V = cos(Ido2) * sin(Kdo2);
W = sin(Ido2);

U2 = U * sin(Ido1) * cos(Kdo1) +
V * sin(Ido1) * sin(Kdo1) - W * cos(Ido1);
V2 = -U * sin(Kdo1) + V * cos(Kdo1);
W2 = U * cos(Ido1) * cos(Kdo1) +
V * cos(Ido1) * sin(Kdo1) + W * sin(Ido1);

DI = 63700.0 * ( Pi / 2 - ArcSin( W2 )); // 距離を求める
DI = RoundOff(DI) / 10.0; // 小数点第2位を四捨五入する

Al = ArcTan( V2 / U2 );
if (U2 >= 0.0)
Al2 = Al;
else
{ if (Al <= 0.0)
Al2 = Al + Pi;
else
Al2 = Al - Pi;
}
FAngle = Trunc(RadToDeg(Pi - Al2)); // 方位角を求める
if (DI >= 100.0) then // 三桁以上の場合
wsprintf(sbuff, "方位:%d度%5dkm", FAngle, RoundOff(DI));
else
wsprintf(sbuff, "方位:%d度 %.1fkm", FAngle, DI);
return FAngle; // 方位を返す}

2021/11/07(Sun) 17:45:58  [No.957]


JG1MOU 浜田さん、こんばんは。

> // Pascal言語をC言語に直しました。

ソースをありがとうございます。 C から VB.net に変換してみます。
上手く動くと良いのですが。

2021/11/07(Sun) 18:13:38  [No.961]


お世話になります。

取り敢えずは VB.net に変換しました。
ソース上ではエラーが出ない状態にはしました。(表面上はかな??)

最上位ビットが立っていればとか、下記は難しい。
int Houi_Kyori(const double Ido1, Kdo1, Ido2, Kdo2, char *sbuff)


実際に動かして結果を見るにはどうすればよいでしょうか。

自分の経度を度、分、秒で入れる。 Ido2Radian(138, 14, 16)
緯度は?

相手の経度は?緯度は?  どこにセットするのでしょうか?

2021/11/07(Sun) 19:43:52  [No.962]


> 最上位ビットが立っていればとか、下記は難しい。
> int Houi_Kyori(const double Ido1, Kdo1, Ido2, Kdo2, char *sbuff)

VBだとこんな感じでしょうか。
Ido2Radian(138, 14, 16 and &H80)
南緯、西経 の場合ですので、とりあえず気にしないでやってみてください。

> 実際に動かして結果を見るにはどうすればよいでしょうか。
>
> 自分の経度を度、分、秒で入れる。 Ido2Radian(138, 14, 16)
> 緯度は?
>
> 相手の経度は?緯度は?  どこにセットするのでしょうか?

自分の緯度・経度、相手の緯度・経度 で、
Ido2Radian()を4回呼び出します。

2021/11/07(Sun) 20:00:32  [No.963]


訂正します。
Ido2Radian(138, 14, 16 or &H80)
でした。

> > 最上位ビットが立っていればとか、下記は難しい。
> > int Houi_Kyori(const double Ido1, Kdo1, Ido2, Kdo2, char *sbuff)
>
> VBだとこんな感じでしょうか。
> Ido2Radian(138, 14, 16 and &H80)

2021/11/07(Sun) 21:10:49  [No.965]


ありがとうございました。
お陰様で HAMLOG.mst をテキスト出力したデータの緯度経度から
方位を取得する事が出来ました。
JAの北海道函館や九州の久留米市などや、DXのモナコ、タスマニア等を
適当に抜き出して確認しました。

2021/11/08(Mon) 08:24:44  [No.967]


さすが早いですね。昨夜はあまり寝ていないとか。
元がDelphiなので、実数型はDouble型もありますが、Extended型を
使っています。
Extended型〜10バイト  Double型〜8バイト

また、C言語の i += 10; のような演算は、一般的な i = i + 10;
としてます。

> ありがとうございました。
> お陰様で HAMLOG.mst をテキスト出力したデータの緯度経度から
> 方位を取得する事が出来ました。
> JAの北海道函館や九州の久留米市などや、DXのモナコ、タスマニア等を
> 適当に抜き出して確認しました。

2021/11/08(Mon) 09:32:27  [No.970]


こんにちは。ありがとうございました。

> さすが早いですね。昨夜はあまり寝ていないとか。

23時に就寝し5時に起床でした。

[免許状Get's] の 方位、距離の Hamlog データ入力ウインドウへの表示と
cmmd = 117
 117 = 入力ウインドウの方位と距離の文字列を得る。
......をお願いします。

2021/11/08(Mon) 10:13:34  [No.971]


> JA9AOB 銅子さん、ありがとうございます。
>
> > GLを使っていますが、緯度・経度に直して方位と距離を出します。
> > 送って置きました。参照下さい。
>
> C# からVB.net に変換して見ましたが数か所エラーが出ます。
> 調査中ですが対処出来るかどうか?
>
> どなたか、他にも2点間の緯度経度から方位を求めるコードがありませんか?
>
> VB.net版が良いですが、C++ や C# でも変換努力しますが。

太田さん どこでエラーになりますか。
from の緯度経度
to の緯度経度
をラージアンに変換して 次の式に代入するだけです。
ラージアンとは角度180度 をπラージアン と言いますπは約3.14です Math.PI です
緯度経度をラージアンに直すのは 角度*π/180 で得られます 変数は
double で十分です
πが字が変わって読みにくいですがパイ です

const double r=6378.137; // km---- これは地球の半径
double sa = tolongitude - fromlongitude;
distance = r * Math.Acos(Math.Sin(fromlatitude) * Math.Sin(tolatitude) + Math.Cos(fromlatitude) * Math.Cos(tolatitude) * Math.Cos(sa)); // Km
origin = 180.0 * Math.Atan2(Math.Sin(sa), Math.Cos(fromlatitude) * Math.Tan(tolatitude) - Math.Sin(fromlatitude) * Math.Cos(sa)) / Math.PI; // 度
if (origin < 0)
origin = origin + 360;

2021/11/07(Sun) 17:17:09  [No.956]


JA9AOB 銅子さん、ありがとうございます。


C# から VB.net への変換ミスを修復し切れていない問題も残っています。
GlCalculate() にて


If isEast = True Then
longitude += CDbl(180)
Else
longitude = CDbl(180) - longitude
End If
....の次が

''' Input:
''' longitude /= 20;
...の様に未変換のままです。 ここは必要なのかどうか?

上記のIf文と同じコードが出て来ますが、そこにも

''' Input:
''' longitude /= 20;

-------------------------
GlToTransit() にも同じ箇所があります。


GlCalculate() 関数の呼び出しでエラー。 パラメターの与え方が悪い?
コールの仕方が悪いのか?

'エラー
BC30451 'GlCalculate' は宣言されていません。アクセスできない保護レベルになっています。

下記の様にしているのですが??
Public Class SurroundingClass

  Public Function GlCalculate(ByVal edeg As Integer, 以下省略

Class から Module に変えたら上記のエラーは出なくなりました。
デバッグで動かすと
 
'// 1文字目 経度情報の整数部 0〜17 をAからRに変換する
gl += characters(CInt(longitude))

...にて「ユーザーが処理していない例外」と言うエラー


長くなりますので、後は落ち着いたらメールっさせて頂きます。

2021/11/07(Sun) 18:03:13  [No.959]


> JA9AOB 銅子さん、ありがとうございます。
>
>
> C# から VB.net への変換ミスを修復し切れていない問題も残っています。
> GlCalculate() にて
>
>
> If isEast = True Then
> longitude += CDbl(180)
> Else
> longitude = CDbl(180) - longitude
> End If
> ....の次が
>
> ''' Input:
> ''' longitude /= 20;
> ...の様に未変換のままです。 ここは必要なのかどうか?
>
> 上記のIf文と同じコードが出て来ますが、そこにも
>
> ''' Input:
> ''' longitude /= 20;
>
> -------------------------
> GlToTransit() にも同じ箇所があります。

複合代入演算子 と言われるものです。
longitude /= 20; は longitude = longitude/20; と同じです
他に
x += y
x = x + y
x -= y
x = x - y
x *= y
x = x * y
x /= y
x = x / y
等もあります

>
>
> GlCalculate() 関数の呼び出しでエラー。 パラメターの与え方が悪い?
> コールの仕方が悪いのか?
>
> 'エラー
> BC30451 'GlCalculate' は宣言されていません。アクセスできない保護レベルになっています。
>
> 下記の様にしているのですが??
> Public Class SurroundingClass
>
>   Public Function GlCalculate(ByVal edeg As Integer, 以下省略
>
> Class から Module に変えたら上記のエラーは出なくなりました。
> デバッグで動かすと
>  
> '// 1文字目 経度情報の整数部 0〜17 をAからRに変換する
> gl += characters(CInt(longitude))

gl += ((int)longitude).ToString();
はdoubleをintに変換してstringに変換 すなわち整数部分の文字表現を取り出し gl の後ろに付け足す処理です。 

10進数に直して 整数部分を取り出しその値を文字化する方法もあります。
BigDecimal bigDecimal = new BigDecimal(String.valueOf(doubleNumber));
int intValue = bigDecimal.intValue();

その他に doubleを文字化して 小数点以前を取り出す方法でも可能です
String doubleAsString = String.valueOf(doubleNumber);
int indexOfDecimal = doubleAsString.indexOf(".");
gl += doubleAsString.substring(0, indexOfDecimal);


>
> ...にて「ユーザーが処理していない例外」と言うエラー
>
>
> 長くなりますので、後は落ち着いたらメールっさせて頂きます。

2021/11/08(Mon) 07:54:17  [No.966]


JA9AOB 銅子さん、詳しくありがとうございます。

方位が取れる様になり一段落しました。
まだユーザーから頼まれているソフトの改修や、質問が来ていたりするのですが、
銅子さんから頂いたソースをもう少し調べてみます。

2021/11/08(Mon) 08:28:28  [No.968]


> JA9AOB 銅子さん、詳しくありがとうございます。
>
> 方位が取れる様になり一段落しました。
> まだユーザーから頼まれているソフトの改修や、質問が来ていたりするのですが、
> 銅子さんから頂いたソースをもう少し調べてみます。
少しは進捗致しましたか、私は、これを使ってPICNIC を経由してANTを回しています。

2021/11/08(Mon) 09:12:20  [No.969]


JA9AOB 銅子さん、

Webで「2点間の緯度経度から方位を求める」をキーにして数日間探し回りましたが見つけられずにいました。
その間に銅子さん、浜田さんにソース・サンプルを頂き VB.net に変換し試行錯誤をして何とか形になりつつあります。

探していた中で下記のリンクがありました。
このページには直接は求める情報は無かったのですが、リンク先にFBな情報がありました。

下の方の回答者の情報、リンクに下記があります。

Java, 経度緯度から2点間の距離と方角(方向・方位)を求める
http://www.serendip.ws/archives/5281

このページ「Java, 経度緯度から2点間の距離と方角(方向・方位)を求める」の
下側のソース、Javaで書かれていますがオンラインのJavaから VB.net への変換ページで
変換して修正して動かしたところ方位を取得出来ました。


https://q.hatena.ne.jp/1375867855

2021/11/08(Mon) 11:56:43  [No.974]


なるほど。私のソースでは地球の平均半径6370kmでしたので、6371kmに
修正しておきます。誤差の範囲ですけど。

もしかしたら、日本周辺は6370kmだった、とか意図があったのかも
知れませんが。

2021/11/08(Mon) 12:14:25  [No.975]


何時もお世話になります。

確認です。ユザーリスト、オープンさせていて、「免許状gets」[ From ] で使用中に
ユザーリストにヒットすればCodeが入り、なおかつ方位も表示されます。

ユザーリストにヒットしないけど「免許状gets」から code が転記される局は方位計算はしていないのでしょうか?

2021/11/06(Sat) 18:56:59  [No.952]


これは気がつきませんでした。
今まで誰も気がつかなかった? Hi

> ユザーリストにヒットしないけど「免許状gets」から code が転記される局は方位計算はしていないのでしょうか?

2021/11/07(Sun) 17:53:03  [No.958]


こんばんは。

> これは気がつきませんでした。
> 今まで誰も気がつかなかった? Hi

出来れば計算して方位を
 117 = 入力ウインドウの方位と距離の文字列を得る。
...様にして頂けると助かります。

ユーザーリスト登録者だけが 「免許Get7s」利用時だけの表示でしょうか?
Hamlog 使用している局が全てが利用出来ると言う分けでは無いのですね。

2021/11/07(Sun) 18:11:33  [No.960]


> 出来れば計算して方位を
>  117 = 入力ウインドウの方位と距離の文字列を得る。
> ...様にして頂けると助かります。

今朝、修正しました。
免許状Get'sをコールする位置をずらしただけです。
https://hamlog.sakura.ne.jp/mou/index.html

> ユーザーリスト登録者だけが 「免許Get7s」利用時だけの表示でしょうか?
> Hamlog 使用している局が全てが利用出来ると言う分けでは無いのですね。

ユーザーリスト登録者だけが 免許状Get'sを利用できます。
最初からそうしている、というのが理由にならないような理由ですが、
ユーザーリスト登録者=協力者 と捉えています。協力者優先です。

2021/11/08(Mon) 10:49:07  [No.972]


早々とありがとうございました。
機能追加、動作確認しました。

2021/11/08(Mon) 11:41:00  [No.973]