緯度を含む大きなtxtファイルと、経度を含む大きなtxtファイルを小数に変換する必要があります。
私が持っているデータは現在の形式です:
7d44'31.495"W for longitude
と
41d3'40.313"N for latitude
このファイルの両方を小数に変換する必要があります(できればスクリプトを使用して)。これどうやってするの?
緯度を含む大きなtxtファイルと、経度を含む大きなtxtファイルを小数に変換する必要があります。
私が持っているデータは現在の形式です:
7d44'31.495"W for longitude
と
41d3'40.313"N for latitude
このファイルの両方を小数に変換する必要があります(できればスクリプトを使用して)。これどうやってするの?
* itudesについては何も知らないので、問題を解決する方法についての一般的なアイデアしか提供できません。
RegExpを使用してデータから数値を切り取り、信頼できる数式でフィードします
私の提案にある程度の自信を与えるために、私があなたのタスクの2つのサブ問題にどのように取り組むかを示します。
(1)入力文字列に正規表現を適用して計算します。
このセクションに基づく
DMSから10進角への変換
W87°43'41"などのDMS(Degrees、Minutes、Seconds)座標が与えられた場合、次の方法を使用してそれを小数度に変換します。
Calculate the total number of seconds: 43'41" = (43*60 + 41) = 2621 seconds. The fractional part is total number of seconds divided by 3600: 2621 / 3600 = ~0.728056 Add fractional degrees to whole degrees to produce the final result: 87 + 0.728056 = 87.728056 Since it is a West longitude coordinate, negate the result. The final result is -87.728056.
ここで見つかりました
コード:
Dim oFmt : Set oFmt = New cFormat
Dim oRE : Set oRE = New RegExp
' 0 1 2 3
oRE.Pattern = "^([W])(\d+)°(\d+)'(\d+)""$"
Dim aTests : aTests = Array( _
Array("W87°43'41""", -87.728056) _
)
Dim aTest
For Each aTest In aTests
Dim sInp : sInp = aTest(0)
Dim nExp : nExp = aTest(1)
Dim oMTS : Set oMTS = oRE.Execute(sInp)
Dim sMsg
If 1 <> oMTS.Count Then
sMsg = oFmt.formatTwo("|{0}| didn't match /{1}/", sInp, oRE.Pattern)
Else
Dim sLoLa : sLoLa = oMTS(0).SubMatches(0)
Dim nDegrees : nDegrees = CDbl(oMTS(0).SubMatches(1))
Dim nMinutes : nMinutes = CDbl(oMTS(0).SubMatches(2))
Dim nSeconds : nSeconds = CDbl(oMTS(0).SubMatches(3))
Dim nRes
' Calculate the total number of seconds:
' 43'41" = (43*60 + 41) = 2621 seconds.
nRes = nMinutes * 60 + nSeconds
' WScript.Echo "***", nRes
' The fractional part is total number of seconds divided by 3600:
' 2621 / 3600 = ~0.728056
nRes = nRes / 3600
' WScript.Echo "***", nRes
' Add fractional degrees to whole degrees to produce the final result:
' 87 + 0.728056 = 87.728056
nRes = nDegrees + nRes
' WScript.Echo "***", nRes
' Since it is a West longitude coordinate, negate the result.
' The final result is -87.728056.
Select Case sLoLa
Case "W"
nRes = -nRes
End Select
sMsg = oFmt.formatArray(_
"{0,-12}: R: {1,12:N6} E: {2,12:N6} D: {3,12:N6}" _
, Array(sInp, nRes, nExp, nRes - nExp) _
)
End If
WScript.Echo sMsg
Next
出力:
Step00 - conversion a la wikipedia
================================================================
W87°43'41" : R: -87,728056 E: -87,728056 D: 0,000000
================================================================
xpl.vbs: Erfolgreich beendet. (0) [0.08594 secs]
入力サンプルから始めて、正規表現パターンを導き出します(最初の試み)
" W 87 ° 43 ' 41 "" "
' 0 1 2 3
oRE.Pattern = "^([W])(\d+)°(\d+)'(\d+)""$"
あなたのデータについては、このようなもの
" 7 d 44 ' 31.495 "" W "
" 41 d 3 ' 40.313 "" N "
' 0 1 2 3
oRE.Pattern = "^(\d+)d(\d+)'(\d+\.\d+)""([WN])$"
適切かもしれません。
RegExpsグループ()によってキャプチャされたパーツを取得するために、マッチのサブマッチにアクセスして変換します
Dim sLoLa : sLoLa = oMTS(0).SubMatches(0)
Dim nDegrees : nDegrees = CDbl(oMTS(0).SubMatches(1))
Dim nMinutes : nMinutes = CDbl(oMTS(0).SubMatches(2))
Dim nSeconds : nSeconds = CDbl(oMTS(0).SubMatches(3))
次に、ウィキペディアから盗まれたアルゴリズム/式に従って計算します(コード/コメントを参照)。
(2)ファイルからデータを取得します
ファイルがそれほど大きくない場合は、それらをメモリに.ReadAll()して、複数行モードでRegExpを適用できます。
Dim oFmt : Set oFmt = New cFormat
Dim oRE : Set oRE = New RegExp
oRE.Global = True
oRE.Multiline = True
' 0 1 2 3
oRE.Pattern = "^(\d+)d(\d+)'(\d+\.\d+)""([WN])$"
Dim sAll : sAll = goFS.OpenTextFile("..\data\f00.txt").ReadAll()
WScript.Echo sAll
WScript.Echo oFmt.formatArray( _
"|{0,-5}|{1,-11}|{2,-11}|{3,-15}|" _
, Array("LoLa", "Degrees", "Minutes", "Seconds") _
)
Dim oMTS : Set oMTS = oRE.Execute(sAll)
Dim oMT
For Each oMT In oMTS
Dim sLoLa : sLoLa = oMT.SubMatches(3)
Dim nDegrees : nDegrees = CDbl(oMT.SubMatches(0))
Dim nMinutes : nMinutes = CDbl(oMT.SubMatches(1))
Dim nSeconds : nSeconds = CDbl(oMT.SubMatches(2))
WScript.Echo oFmt.formatArray( _
"|{0,-5}|{1,11:N2}|{2,11:N2}|{3,15:N6}|" _
, Array(sLoLa, nDegrees, nMinutes, nSeconds) _
)
Next
出力:
======================================================
7d44'31.495"W
41d3'40.313"N
|LoLa |Degrees |Minutes |Seconds |
|W | 7,00| 44,00| 31,495000|
|N | 41,00| 3,00| 40,313000|
======================================================
ここからcFormatクラスを取得します