0

緯度を含む大きなtxtファイルと、経度を含む大きなtxtファイルを小数に変換する必要があります。

私が持っているデータは現在の形式です:

7d44'31.495"W for longitude

41d3'40.313"N for latitude

このファイルの両方を小数に変換する必要があります(できればスクリプトを使用して)。これどうやってするの?

4

1 に答える 1

3

* 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クラスを取得します

于 2012-05-25T21:56:13.270 に答える