2017-08-03 5 views
0

座標の一括変換を有効にするために既存のスクリプトを微調整しようとしています。バッチ変換座標、クラス定義エラー

はしかし、私は次のエラーが表示されます NameError:名「RDWGSConverter」が

は、私はクラスが先行定義されるべき理解定義されていません。しかし、もし私が何かを見逃していないなら、これは事実であるはずですか?

import urllib.parse 
from openpyxl import load_workbook, Workbook 


"""load datafile""" 
workbook = load_workbook('convertor.xlsx') 
worksheet = workbook.active 

Xco=[] 
Yco=[] 

Xco = [row[1].value for row in worksheet.iter_rows() ] 

Yco = [row[2].value for row in worksheet.iter_rows() ] 
coordinates = [(Xco), (Yco)] 

print(Xco[5]) 
print(range(len(Xco))) 
class RDWGSConverter: 
    for i in (range(len(Xco))): 
     X0  = Xco[i] 
     Y0  = Yco[i] 
     phi0 = 52.15517440 
     lam0 = 5.38720621 
     print(Xco[i]) 

     def fromRdToWgs(self, coords): 
      Kp = [0,2,0,2,0,2,1,4,2,4,1] 
      Kq = [1,0,2,1,3,2,0,0,3,1,1] 
      Kpq = [3235.65389,-32.58297,-0.24750,-0.84978,-0.06550,-0.01709,-0.00738,0.00530,-0.00039,0.00033,-0.00012] 

      Lp = [1,1,1,3,1,3,0,3,1,0,2,5] 
      Lq = [0,1,2,0,3,1,1,2,4,2,0,0] 
      Lpq = [5260.52916,105.94684,2.45656,-0.81885,0.05594,-0.05607,0.01199,-0.00256,0.00128,0.00022,-0.00022,0.00026] 

      dX = 1E-5 * (coords[0] - self.X0) 
      dY = 1E-5 * (coords[1] - self.Y0) 

      phi = 0 
      lam = 0 

      for k in range(len(Kpq)): 
       phi = phi + (Kpq[k] * dX**Kp[k] * dY**Kq[k]) 
      phi = self.phi0 + phi/3600 

      for l in range(len(Lpq)): 
       lam = lam + (Lpq[l] * dX**Lp[l] * dY**Lq[l]) 
      lam = self.lam0 + lam/3600 

      return [phi,lam] 

     def fromWgsToRd(self, coords): 

      Rp = [0,1,2,0,1,3,1,0,2] 
      Rq = [1,1,1,3,0,1,3,2,3] 
      Rpq = [190094.945,-11832.228,-114.221,-32.391,-0.705,-2.340,-0.608,-0.008,0.148] 

      Sp = [1,0,2,1,3,0,2,1,0,1] 
      Sq = [0,2,0,2,0,1,2,1,4,4] 
      Spq = [309056.544,3638.893,73.077,-157.984,59.788,0.433,-6.439,-0.032,0.092,-0.054] 

      dPhi = 0.36 * (coords[0] - self.phi0) 
      dLam = 0.36 * (coords[1] - self.lam0) 

      X = 0 
      Y = 0 

      for r in range(len(Rpq)): 
       X = X + (Rpq[r] * dPhi**Rp[r] * dLam**Rq[r]) 
      X = self.X0 + X 

      for s in range(len(Spq)): 
       Y = Y + (Spq[s] * dPhi**Sp[s] * dLam**Sq[s]) 
      Y = self.Y0 + Y 

      return [X,Y] 

    def main(): 
     # Rotterdam Centraal Station 
     coords = [91819, 437802] 
     conv = RDWGSConverter() 
     wgsCoords = conv.fromRdToWgs(coords) 
     newCoords = conv.fromWgsToRd(wgsCoords) 
     print(coords, newCoords, wgsCoords) 

    if __name__ == "__main__": 
     main() 

このコードの構造に間違いがないかを確認してくれてありがとう!

Grts

答えて

0

あなたのインデントが問題であるかのようにそれは私には見えます。

def main()(およびそれを呼び出す行)は内にあり、class RDWGSConverterの定義はです。クラスの定義が完了する前にクラスのインスタンスを作成することはできません。そのため、報告するエラーが発生しています。しかし、私はそれがあなたがするつもりではないと思います。

また、fromRdToWgsfromWgsToRdをループ内に定義していますが、これはおそらく意味がありません。クラス定義と同じレベルに

インデント解除

def main(): 

if __name__ == "__main__": 

、あなたのクラスの拳を定義し、機能mainでの作業を開始するように。

ループの開始for i in (range(len(Xco))):は、おそらくクラス定義の一部として実行するため、間違ったレベルにある可能性があります。その理由はわかりません。

+0

ありがとうございます! ループのアイデアは、Xco、Ycoのすべてのペアの計算を行うことができます。 おそらくもっと良い方法があります:) –

+0

私はそれを見ています。しかし、 'fromRdToWgs'と' fromWgsToRd'メソッドを 'X0'と' Y0'の異なる値で何度も定義しています。同じ名前の2つのメソッドを定義することはできません。したがって、メソッドを複数回定義すると、変数の* last *値を使用して各メソッドの* last *定義のみになります。 – BoarGules

関連する問題