*.las
Pythonでファイルを読み取るコードを作成しました。*las
fileは、各行がx,y,z
ポイントの値である特殊なASCIIファイルです。
私の関数は読んだN
。ポイントの数を確認し、それらが。を使用してポリゴン内にあるかどうかを確認しpoints_inside_poly
ます。
次の質問があります。
- ファイルの最後に到達すると、次のメッセージが表示されます。
LASException: LASError in "LASReader_GetPointAt": point subscript out of range
ポイントの数がチャンク次元の下にあるためです。この問題を解決する方法がわかりません。 a = [file_out.write(c[m]) for m in xrange(len(c))]
a =
私はビデオ印刷を避けるために使用します。それが正しいか?- 新しいチャンクを置き換えることが賢明な解決策であるかどうかわからないため
c = [chunk[l] for l in index]
、新しいリストを作成します(例:) 。c
chunk = [chunk[l] for l in index]
- ステートメントでは、
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 _