2

この関数は、 Lasファイルを読み取ってシェープファイルを保存するために作成しました。この関数は、8つのフィールドを持つシェープファイルを作成します。保存したいフィールドを選択するために、関数に解析要素を挿入したいものLAS2SHP(inFile、outFile = None、parse = None)。Noneの場合、すべてのフィールドが保存されます。parseがparse="irn"の場合、フィールドintensity、return_number、およびnumber_of_returnsが保存されます。伝説に従う

"i": p.intensity,
"r": p.return_number,
"n": p.number_of_returns,
"s": p.scan_direction,
"e": p.flightline_edge,
"c": p.classification,
"a": p.scan_angle, 

もし....ifelse.... elseが本当にコードを消費する(そしてエレガントではない)場合、私は解決策を書きました。コードを保存するためのすべてのヘルプと提案に感謝します

よろしくお願いしますジャンニ

ここでPythonの元の関数

import shapefile
from liblas import file as lasfile

def LAS2SHP(inFile,outFile=None):
    w = shapefile.Writer(shapefile.POINT)
    w.field('Z','C','10')
    w.field('Intensity','C','10')
    w.field('Return','C','10')
    w.field('NumberRet','C','10')
    w.field('ScanDir','C','10')
    w.field('FlightEdge','C','10')
    w.field('Class','C','10')
    w.field('ScanAngle','C','10')
    for p in lasfile.File(inFile,None,'r'):
        w.point(p.x,p.y)
        w.record(float(p.z),float(p.intensity),float(p.return_number),float(p.number_of_returns),float(p.scan_direction),float(p.flightline_edge),float(p.classification),float(p.scan_angle))
    if outFile == None:
        inFile_path, inFile_name_ext = os.path.split(os.path.abspath(inFile))
        inFile_name = os.path.splitext(inFile_name_ext)[0]
        w.save("{0}\\{1}.shp".format(inFile_path,inFile_name))
    else:
        w.save(outFile)
4

1 に答える 1

1

おそらく次のようなことを試してください:

    pdata = [p.z] + [getattr(p, pattr[key]) for key in parse]
    pdata = map(float, pdata)
    w.record(*pdata)
  • for key in parseの文字をループしますparse。たとえば、if then key は値, ,parse = 'irn'をループします。irn
  • pattr辞書です。pattr[key]関連する属性の名前です。たとえば、pattr['i']です"intensity"
  • getattr(p, pattr[key])pattr[key]の属性の値ですp。たとえば、getattr(p, "intensity")ですp.intensity。これは、属性の名前が文字列としてわかっている場合に属性値を取得する方法です (例: pattr[key])。のは、 に引数を送信する前*w.record(*pdata)アンパックします。たとえば、は と同等です。これは、任意の数の引数を関数に送信する方法です。pdataw.recordw.record(*[1,2,3])w.record(1,2,3)

例えば、

import shapefile
from liblas import file as lasfile

pattr = {
    "i": 'intensity',
    "r": 'return_number',
    "n": 'number_of_returns',
    "s": 'scan_direction',
    "e": 'flightline_edge',
    "c": 'classification',
    "a": 'scan_angle',
    }

wattr = {
    "i": 'Intensity',
    "r": 'Return',
    "n": 'NumberRet',
    "s": 'ScanDir',
    "e": 'FlightEdge',
    "c": 'Class',
    "a": 'ScanAngle',
    }

def LAS2SHP(inFile, outFile=None, parse = 'irnseca'):
    w = shapefile.Writer(shapefile.POINT)
    w.field('Z','C','10')
    for key in parse:
        w.field(wattr[key],'C','10')
    for p in lasfile.File(inFile,None,'r'):
        w.point(p.x,p.y)
        pdata = [p.z] + [getattr(p, pattr[key]) for key in parse]
        pdata = map(float, pdata)
        w.record(*pdata)       
    if outFile == None:
        inFile_path, inFile_name_ext = os.path.split(os.path.abspath(inFile))
        inFile_name = os.path.splitext(inFile_name_ext)[0]
        w.save("{0}\\{1}.shp".format(inFile_path,inFile_name))
    else:
        w.save(outFile)
于 2012-10-25T17:21:52.103 に答える