2015-09-23 6 views
-1

У меня есть этот небольшой код для манипулирования лидарными точками в файле Las. Цель состоит в том, чтобы взять 1 пункт из файла 1 и искать ближайшую точку в файле 2. Затем создать новую точку, которая использует координаты точек, а затем сохранит ее. Я столкнулся с 2 проблемы до сих пор, которые описаны ниже:Сохранить Лас указывает на файл las: аргумент error и indexerror

import laspy 
import laspy.file 
import liblas 
from liblas import header 
h = header.Header() 

inFile2 = laspy.file.File("C:\\Users\\Geri\\Desktop\\Sync\\Sync\\pythonlas\\mapperclip\\2clip.las", mode = "r") 
inFile3 = laspy.file.File("C:\\Users\\Geri\\Desktop\\Sync\\Sync\\pythonlas\\mapperclip\\3clip.las", mode = "r") 
point_records = inFile2.points 
point_records = inFile3.points 

t=0 
for points in inFile3.points: 
    z=0 
    q=0 
    p=0.1 
    while z==0: 

     xmin=inFile3.x[t]-p 
     ymin=inFile3.y[t]-p 
     xmax=inFile3.x[t]+p 
     ymax=inFile3.y[t]+p 
     n=0 
     for points in inFile2.points: 
      ax=inFile2.x[n] 
      ay=inFile2.y[n] 
      if ax > xmin and ax < xmax and ay < ymax and ay > ymin:   
           f = liblas.file.File("C:\\Users\\Geri\\Desktop\\Sync\\Sync\\pythonlas\\mapperclip\\proba.las",mode='w', header= h) 
           newx = inFile3.x[t]-((inFile3.x[t]-inFile2.x[n])/2) 
           newy = inFile3.y[t]-((inFile3.y[t]-inFile2.y[n])/2) 
           newz = inFile3.z[t]-((inFile3.z[t]-inFile2.z[n])/2) 
           pt = liblas.point.Point(newx, newy, newz) 

Проблема здесь, после этой строки. Я хочу сохранить newx, y, z как координаты X Y и значение z для новых точек в новом файле las.

Получение следующее сообщение об ошибке:

ctypes.Argumenterror: argument 1: : wrong type

       f.write(pt) 
           f.close() 
           print t 
           print newx 
           print newy 
           print newz 
           print inFile2.y[n] 
           print inFile2.z[n]         
           print inFile3.z[t] 
           n+=1 
           q+=1 
           t+=1 
      else: 
       n+=1 
     if q>0:    
      z+=1 
     else: 
      p+=0.1 

Когда я вынимаю попытку записать файл с кодом, то я получил следующее: (скрипт работает 415 раз успешно)

Traceback (most recent call last): 
    File "........ 
     newx = inFile3.x[t]-((inFile3.x[t]-inFile2.x[n])/2) 

IndexError: индекс 416 выходит за пределы для оси 0 с размером 416

+0

Fun вещь о Python: 'если ах> Xmin и топор ymin', вероятно, более четко написано как 'if xmin Evert

+0

Можете ли вы показать полную трассировку, а не только однострочный? В частности, вызов функции вызывает ArgumentError? Потому что тогда вы можете посмотреть, какой тип аргумента ожидает функция, и вместо этого использовать правильный аргумент. – Evert

+0

Когда вы повторяете точки в файле ('для точки inFile3.points'), эта точка затем доступна в переменной' point'. Вместо этого, используя индексы ('n',' t'), вы можете просто сравнить значения координат этих самих переменных «point». Это исключило бы возможность «IndexErrors» в этой области. –

ответ

1

Так вот что я получил до сих пор:

Для первой проблемы я просто отказался от модуля liblas и использовал laspy для сохранения созданного нового файла.

Для второй задачи я заменил

for points in inFile3.points: 

с

while t < 415: