質問内容
緯度経度から平面直角座標を求める関数を使いたい。
社内使用ではなく、ユーザ企業に配布するExcelVBAの中に組み込みたい。
どうするのがいいのでしょうか。
ネットにいろいろ関数はありそうなのですが
著作権の問題で、そのまま使えるのが見つけられません。
組み込むのが可能な関数等あれば教えてください。
pyprojというpythonのライブラリがあるので、それを使ってexeを作って
それを配布するとかいう方法もあるのかなと思ったりもしています。
これのライセンスについてもまだ調べきれていませんが…
.Netでexeを作ってそれを使用するというのでもよいです。
ただ、.Netにしてもそこで使える関数とかがわかっていません。
検証
緯度:34.68638889
経度:135.52
とした場合
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を使って計算する内容で誤差が結構あるのは
どうしてなのでしょうか?

あなたの回答
tips
プレビュー