質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

0回答

2174閲覧

緯度経度から平面直角座標を求めたい

xail2222

総合スコア1497

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/03/26 18:19

編集2022/03/28 09:28

質問内容

緯度経度から平面直角座標を求める関数を使いたい。
社内使用ではなく、ユーザ企業に配布するExcelVBAの中に組み込みたい。
どうするのがいいのでしょうか。

ネットにいろいろ関数はありそうなのですが
著作権の問題で、そのまま使えるのが見つけられません。
組み込むのが可能な関数等あれば教えてください。

pyprojというpythonのライブラリがあるので、それを使ってexeを作って
それを配布するとかいう方法もあるのかなと思ったりもしています。
これのライセンスについてもまだ調べきれていませんが…

.Netでexeを作ってそれを使用するというのでもよいです。
ただ、.Netにしてもそこで使える関数とかがわかっていません。

検証

緯度:34.68638889
経度:135.52
とした場合

平面直角座標への換算(国土地理院のHP)

X座標 -145621.6509
Y座標 -43980.6301

となります。

(1)
Excel VBAで緯度・経度を平面直角座標に変換する
の計算式を実行すると

X座標 -145621.6508537960
Y座標 -43980.6300570059

四捨五入で一致となります。

…この関数をそのまま使わせてもらえると良い気がするのですが…

(2)
[pyprojで計算]

python

1import pyproj 2transformer = pyproj.Transformer.from_crs("epsg:4326", "epsg:6674", always_xy=True) 3print(transformer.transform(135.52, 34.686388888888885))

結果
(-43980.63005700818, -145621.65085378708)

こちらも四捨五入すると、国土地理院の内容と一致すると考えられるでしょうか…
なのでこれでも良いと感じています。

MITライセンスのようなので、ライセンス表示しておけば配布もできる?

これをexe化してExcelから起動して呼び出すので良さそうな気がしているのですが何か問題ないでしょうか?

(3)
[.NetでProj.Netを使う]

VB.Net

1Imports GeoAPI.CoordinateSystems 2Imports GeoAPI.CoordinateSystems.Transformations 3Imports ProjNet.CoordinateSystems 4Imports ProjNet.CoordinateSystems.Transformations 5 6Public Class Form1 7 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 8 Dim systemfacctory As CoordinateSystemFactory = New CoordinateSystemFactory() 9 Dim transformationfactory As CoordinateTransformationFactory = New CoordinateTransformationFactory() 10 Dim wgs84geo As ICoordinateSystem = GeographicCoordinateSystem.WGS84 11 Dim jgd2000_6 As ICoordinateSystem = systemfacctory.CreateFromWkt("PROJCS[""JGD_2000_Japan_Zone_6"",GEOGCS[""GCS_JGD_2000"",DATUM[""D_JGD_2000"",SPHEROID[""GRS_1980"",6378137.0,298.257222101]],PRIMEM[""Greenwich"",0.0],UNIT[""Degree"",0.0174532925199433]],PROJECTION[""Transverse_Mercator""],PARAMETER[""False_Easting"",0.0],PARAMETER[""False_Northing"",0.0],PARAMETER[""Central_Meridian"",136.0],PARAMETER[""Scale_Factor"",0.9999],PARAMETER[""Latitude_Of_Origin"",36.0],UNIT[""Meter"",1.0]]") 12 Dim trans As ICoordinateTransformation = transformationfactory.CreateFromCoordinateSystems(wgs84geo, jgd2000_6) 13 Dim point As Double() = {135.52, 34.686388888888885} 14 Dim point2 As Double() 15 point2 = trans.MathTransform.Transform(point) 16 Debug.Print(point2(0) & "," & point2(1)) 17 End Sub 18End Class

これで取得される結果は
-43980.6300384157,-145621.646969035
です。

Yの誤差1ミリ弱、Xの誤差30cmと言ったところでしょうか。

これは、なぜ誤差が生じるのでしょうか…

質問事項まとめ

とりあえず、現状での疑問点は以下の所です。
(1)このVBA関数は、使っちゃっても良いのでしょうか。
やっぱり駄目だと思っているのですが…
(2)pyprojを使った処理をexe化して呼び出す。
何か問題あるでしょうか?
(3).NetでProj.Netを使って計算する内容で誤差が結構あるのは
どうしてなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/03/27 12:19

> 著作権の問題で、そのまま使えるのが見つけられません。 作成者に商用利用が可能かどうかを確認してNGとの回答があったということですか?
xail2222

2022/03/27 20:00

https://neverendworks.com/news/terms-of-use/ 「なおお客様自身でご利用される範囲内での改編は問題ありませんが、改編したコンテンツを第三者(お客様以外)に提供したり、公開したりすることはお控えください。」 と記載があり、記載のあったコードは一部コメントアウトしないと動かなかったので控える必要があるかなと判断しました。 ユーザ企業側に該当コードを張り付けてもらえば問題は無い気もするのですが、そんなことをさせるのはどうかと思うので。
xail2222

2022/03/27 20:28

他のサイトの計算も検証、利用可能かの確認をしていく必要があるのでしょうか。 まぁ、アルゴリズムを参考にさせてもらって自分で書くのが良いのか、それでも模写に近いと思うし。。。
meg_

2022/03/28 00:28

> まぁ、アルゴリズムを参考にさせてもらって自分で書くのが良いのか そんな気がしてきましたね。ExcelであればVBAで完結できればそれが良いと思いますし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問