LAS फ़ाइल को संकरी सरणी में बदलना?


15

मैंने सीखना शुरू कर दिया है कि अजगर में एलएएस डेटा में हेरफेर कैसे करना है और यह देखना चाहता है कि अन्य लोग एलएएस फ़ाइलों को कैसे संभालते हैं। मैं अंक पढ़ना चाहता हूं (मैं एक संख्यात्मक सरणी का उपयोग कर रहा हूं), और एक अलग सरणी के लिए कक्षा 1 और 2 (अवर्गीकृत और जमीन) को फ़िल्टर करता हूं। मेरे पास निम्नलिखित कोड है, लेकिन अंक फ़िल्टर किए गए प्रतीत नहीं हो सकते।

# Import modules
from liblas import file
import numpy as np

if __name__=="__main__":
    '''Read LAS file and create an array to hold X, Y, Z values'''
    # Get file
    las_file = r"E:\Testing\ground_filtered.las"
    # Read file
    f = file.File(las_file, mode='r')
    # Get number of points from header
    num_points = int(f.__len__())
    # Create empty numpy array
    PointsXYZIC = np.empty(shape=(num_points, 5))
    # Load all LAS points into numpy array
    counter = 0
    for p in f:
        newrow = [p.x, p.y, p.z, p.intensity, p.classification]
        PointsXYZIC[counter] = newrow
        counter += 1

मैंने arcpy.da.featureClassToNumpyArray देखा है, लेकिन मैं आर्कपी आयात नहीं करना चाहता था और न ही इसे आकार में बदलना है।

मैं कैसे LAS डेटा को एक सुन्न सरणी में फ़िल्टर / पढ़ सकता हूं?


त्रुटि संदेश (यदि कोई हो) क्या है?
til_b

कोई त्रुटि नहीं। मुझे नहीं पता था कि कैसे फ़िल्टर करना है, और अनिश्चित था अगर एलएएस को सरणी में प्राप्त करने का एक बेहतर तरीका था।
Barbarossa

जवाबों:


14

आपका PointsXYZICअब एक संख्यात्मक सरणी है। जिसका अर्थ है कि आप रुचि रखने वाले डेटा को फ़िल्टर करने के लिए संख्यात्मक अनुक्रमित का उपयोग कर सकते हैं । उदाहरण के लिए, आप यह निर्धारित करने के लिए कि किन बिंदुओं को पकड़ने के लिए बूलियन का एक सूचकांक का उपयोग कर सकते हैं।

#the values we're classifying against
unclassified = 1
ground = 2

#create an array of booleans
filter_array = np.any(
    [
        PointsXYZIC[:, 4] == unclassified, #The final column to index against
        PointsXYZIC[:, 4] == ground,
    ],
    axis=0
)

#use the booleans to index the original array
filtered_rows = PointsXYZIC[filter_array]

अब आपके पास उन सभी मानों के साथ एक सुस्पष्ट सरणी होनी चाहिए जहां डेटा अवर्गीकृत या जमीन है। उन मूल्यों को प्राप्त करने के लिए जिन्हें आपने वर्गीकृत किया है:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)

फ़िल्टर काम करने लगता है लेकिन केवल 5 रिकॉर्ड लिखता है। मैंने केवल कक्षा 1 और 2 को फ़िल्टर करने का प्रयास किया, और फिर सभी 1 और 2 को फ़िल्टर करने का प्रयास किया, दोनों ने मुझे केवल 5 परिणाम दिए। कोई विचार?
Barbarossa

ये 5 रिकॉर्ड 1-डी सरणी में हैं।
बारब्रोसा

क्षमा करें, ऊपर दिए गए कोड को अपडेट किया गया है क्योंकि इसके साथ किसी भी गणना को करने के लिए अक्ष के विनिर्देशन की आवश्यकता होती है (इसके बिना यह सरणी के सभी आयामों के साथ या उसके पार प्रदर्शन करता है)।
om_henners

5

LAS फ़ाइलों को पढ़ने के लिए Laspy का उपयोग करें और आसानी से डेटा को वापस लौटाएं क्योंकि आपके साथ बातचीत कर सकते हैं। Laspy शुद्ध अजगर है, लगभग उतना ही तेज है जितना कि libLAS, libLAS पायथन बाइंडिंग की तुलना में अधिक विशेषताएं हैं, और तैनात करने के लिए बहुत आसान है।


0

यदि आप पहले से ही इस बारे में जानते हैं, तो मैं माफी मांगता हूं, लेकिन LASTools एक शानदार ओपन सोर्स टूल है, जो अब ArcGIS और QGIS 2.0 दोनों के साथ एकीकृत है - इसमें आपके द्वारा देखे जा रहे तरीके के डेटा को फ़िल्टर करने के विकल्प हैं।


धन्यवाद @Nicholas, मैं liblas अजगर पुस्तकालय है, जो है का उपयोग कर रहा बारीकी LASTools से बंधा
Barbarossa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.