3

*.lasPythonでファイルを読み取るコードを作成しました。*lasfileは、各行がx,y,zポイントの値である特殊なASCIIファイルです。

私の関数は読んだN。ポイントの数を確認し、それらが。を使用してポリゴン内にあるかどうかを確認しpoints_inside_polyます。

次の質問があります。

  1. ファイルの最後に到達すると、次のメッセージが表示されます。LASException: LASError in "LASReader_GetPointAt": point subscript out of rangeポイントの数がチャンク次元の下にあるためです。この問題を解決する方法がわかりません。
  2. a = [file_out.write(c[m]) for m in xrange(len(c))]a =私はビデオ印刷を避けるために使用します。それが正しいか?
  3. 新しいチャンクを置き換えることが賢明な解決策であるかどうかわからないためc = [chunk[l] for l in index]、新しいリストを作成します(例:) 。cchunk = [chunk[l] for l in index]
  4. ステートメントでは、if else...elseを使用しますpass。これは正しい選択ですか?

本当に助けてくれてありがとう。専門知識からのリスニング提案を改善することが重要です!!!!

import shapefile
import numpy
import numpy as np
from numpy import nonzero
from liblas import file as lasfile
from shapely.geometry import Polygon
from matplotlib.nxutils import points_inside_poly  


# open shapefile (polygon)
sf = shapefile.Reader(poly)
shapes = sf.shapes()
# extract vertices
verts = np.array(shapes[0].points,float)

# open las file
f = lasfile.File(inFile,None,'r') # open LAS
# read "header"
h = f.header

# create a file where store the points
file_out = lasfile.File(outFile,mode='w',header= h)


chunkSize = 100000
for i in xrange(0,len(f), chunkSize):
    chunk = f[i:i+chunkSize]

    x,y = [],[]

    # extraxt x and y value for each points
    for p in xrange(len(chunk)):
        x.append(chunk[p].x)
        y.append(chunk[p].y)

    # zip all points 
    points = np.array(zip(x,y))
    # create an index where are present the points inside the polygon
    index = nonzero(points_inside_poly(points, verts))[0]

    # if index is not empty do this otherwise "pass"
    if len(index) != 0:
        c = [chunk[l] for l in index] #Is It correct to create a new list or i can replace chunck?
        # save points
        a = [file_out.write(c[m]) for m in xrange(len(c))] #use a = in order to avoid video print. Is it correct?
    else:
        pass #Is It correct to use pass?

f.close()
file_out.close()

@Roland Smithによって提案され、Gianniによって変更されたコード

f = lasfile.File(inFile,None,'r') # open LAS
h = f.header
# change the software id to libLAS
h.software_id = "Gianni"
file_out = lasfile.File(outFile,mode='w',header= h)
f.close()
sf = shapefile.Reader(poly) #open shpfile
shapes = sf.shapes()
for i in xrange(len(shapes)):
    verts = np.array(shapes[i].points,float)
    inside_points = [p for p in lasfile.File(inFile,None,'r') if pnpoly(p.x, p.y, verts)]
    for p in inside_points:
        file_out.write(p)
f.close()
file_out.close()

私はこれらのソリューションを使用しました:1)f = lasfile.File(inFile、None、'r')を読み取り、*。las出力ファイルで必要なため読み取りヘッドの後に2)ファイルを閉じます3)inside_points=[pを使用しましたfor p in lasfile.File(inFile、None、'r')if pnpoly(px、py、verts)]の代わりに

with lasfile.File(inFile, None, 'r') as f:
...     inside_points = [p for p in f if pnpoly(p.x, p.y, verts)]
...     

私はいつもこのエラーメッセージを受け取るので

トレースバック(最後の最後の呼び出し):ファイル ""、1行目、AttributeError:_ exit _

4

1 に答える 1

3

(1)について:

まず、なぜチャンクを使用しているのですか?lasfileをイテレータとして使用し(チュートリアルに示されているように)、ポイントを1つずつ処理します。pnpoly以下は、の代わりにリスト内包の関数を使用して、ポリゴン内のすべてのポイントを出力ファイルに書き込む必要がありますpoints_inside_poly

from liblas import file as lasfile
import numpy as np
from matplotlib.nxutils import pnpoly

with lasfile.File(inFile, None, 'r') as f:
    inside_points = (p for p in f if pnpoly(p.x, p.y, verts))
    with lasfile.File(outFile,mode='w',header= h) as file_out:
        for p in inside_points:
            file_out.write(p)

真上の5行は、大きなforループ全体を置き換える必要があります。それらを1つずつ見ていきましょう。

  • with lasfile.File(inFilewith...:この構造を使用すると、ブロックが終了したときにファイルが自動的に閉じられます。
  • ここで、すべての作業を実行するジェネレータ式という良い部分があります(間の部分())。入力ファイル()を繰り返し処理しますfor p in f。ポリゴン()の内側にあるすべてのポイントがif pnpoly(p.x, p.y, verts)ジェネレータに追加されます。
  • 出力ファイルに別のwithブロックを使用します
  • そしてすべてのポイント(for p in inside_points、これはジェネレーターが使用されたものです)
  • 出力ファイルに書き込まれます(file_out.write(p)

この方法では、ポリゴン内のポイントのみがリストに追加されるため、不要なポイントのメモリを無駄にすることはありません。

上記の方法が機能しない場合にのみ、チャンクを使用する必要があります。チャンクを使用する場合は、例外を適切に処理する必要があります。例えば:

from liblas import LASException

chunkSize = 100000
for i in xrange(0,len(f), chunkSize):
    try:
        chunk = f[i:i+chunkSize]
    except LASException:
        rem = len(f)-i
        chunk = f[i:i+rem]

(2)について:申し訳ありませんが、ここで何を達成しようとしているのか理解できません。「ビデオプリント」とはどういう意味ですか?

(3)について:元のチャンクを使用しなくなったため、名前を再利用できます。Pythonでは、「変数」は単なる名札であることを認識してください。

(4)について:使用していないelseので、完全に省略してください。

于 2012-10-07T14:31:27.737 に答える