تقليل حجم ملفات LAS/LAZ بكفاءة باستخدام Laspy: دليل خطوة بخطوة

Temp mail SuperHeros
تقليل حجم ملفات LAS/LAZ بكفاءة باستخدام Laspy: دليل خطوة بخطوة
تقليل حجم ملفات LAS/LAZ بكفاءة باستخدام Laspy: دليل خطوة بخطوة

فهم عملية اختزال بيانات LAS باستخدام Laspy

عند العمل مع ملفات LAS أو LAZ الكبيرة في Python، يعد الاختزال ضروريًا للمعالجة والتحليل الفعالين. لاسبي، وهي حزمة Python لقراءة بيانات LAS وكتابتها وتعديلها، توفر طرقًا عديدة لمعالجة البيانات السحابية النقطية، مثل إنشاء رؤوس LAS وتحريرها.

يوضح هذا المثال كيفية اختزال مجموعة بيانات عن طريق استخراج كل نقطة عاشرة من ملف لاز ملف وإعادة استخدام موجود لاسهيدر. يتطلب هذا فهمًا لكيفية تفاعل الرؤوس مع البيانات، خاصة عند العمل بأعداد نقاط مختلفة.

عند تأسيس جديد LasData كائن من رأس موجود، يواجه المستخدمون في كثير من الأحيان حجم صفيف غير متطابق. يحدث هذا التباين بسبب ملف header's point_count قد لا تتم محاذاتها تلقائيًا مع البيانات الجديدة.

ويتمثل التحدي في تقييم ما إذا كان مطلوبًا تعديل سمات الرأس يدويًا مثل الإزاحات والمقاييس وpoint_count، أو ما إذا كان هناك حل أكثر تلقائية. يشرح هذا المنشور كيفية تحديث هذه القيم بشكل صحيح عند استخدام الاختزال لاسبي، مما أدى إلى عملية فعالة.

يأمر مثال للاستخدام
laspy.read() يقوم هذا الأمر بتحويل ملف LAS أو LAZ إلى كائن LasData. فهو يستخرج بيانات السحابة النقطية ومعلومات الرأس من الملف، مما يسمح بالتعديل والمعالجة في بايثون.
np.arange() إنشاء مجموعة من المؤشرات متباعدة على فترات منتظمة. في هذا السيناريو، np.arange(0, لين(las.points), 10) يختار كل نقطة عاشرة من بيانات السحابة النقطية المحملة، وهو أمر ضروري للاختزال.
laspy.LasHeader() يقوم هذا الأمر بإنشاء رأس جديد لبيانات LAS وLAZ. يوفر الرأس بيانات التعريف الرئيسية بما في ذلك تنسيق النقطة، والإصدار، والإزاحات، والمقاييس، والتي تعتبر بالغة الأهمية عند إنشاء أو تحرير LasData.
header.offsets يحدد الحد الأدنى من إحداثيات x وy وz لبيانات السحابة النقطية. ويساعد هذا في تغيير النقطة المرجعية لسحابة النقاط، مما يؤدي إلى تمثيل البيانات بشكل صحيح بعد الاختزال.
header.scales يحدد دقة قيم x وy وz من خلال تحديد عوامل القياس. بعد الاختزال، يمكن أن تكون إعادة حساب عوامل القياس وتعديلها أمرًا بالغ الأهمية للحفاظ على سلامة البيانات.
copy() لعمل نسخة ضحلة من الكائن. في هذه الحالة، يتم استخدامه لنقل الرأس الحالي من السحابة النقطية الأصلية، مما يضمن أن أي تغييرات في مجموعة البيانات الجديدة لا تؤدي إلى إتلاف البيانات الأصلية.
downsampled_las.write() يحفظ هذا الأمر السحابة النقطية المختزلة كملف LAS أو LAZ جديد عن طريق كتابة النسخة المحدثة أو المشكلة حديثًا LasData الاعتراض على ملف.
unittest.TestCase هذه هي الفئة الأساسية لإطار عمل Unittest في Python، والذي يُستخدم لإنشاء حالات الاختبار. تستخدمه هذه المقالة لاختبار عملية الاختزال من خلال ضمان الحفاظ على المقدار الصحيح من النقاط.
self.assertEqual() يقارن اختبار الوحدة بين قيمتين ويعيد خطأ إذا لم تكونا متساويتين. في المثال، يضمن أن عدد النقاط المختزلة يتوافق مع العدد المتوقع.

تحسين عملية الاختزال لسحابة النقاط باستخدام Laspy

يركز البرنامج النصي الأول في هذا المنشور على الاختزال أ لاز وهو أمر ضروري لإدارة مجموعات البيانات السحابية ذات النقاط الكبيرة. عن طريق استيراد الملف الأصلي باستخدام لاسبي.قراءة () وظيفة، يمكننا الوصول إلى بيانات النقطة والرأس الذي يحتوي على البيانات الوصفية حول سحابة النقطة. تتضمن تقنية الاختزال انتقاء كل نقطة عاشرة، مما يقلل من حجم مجموعة البيانات مع الاحتفاظ بالخصائص الجغرافية المهمة. ويتم ذلك باستخدام np.arange() لبناء مجموعة من المؤشرات. بعد اختيار النقاط، انسخ الرأس من الملف الأصلي لضمان التوافق في البيانات الوصفية، مثل point_format والنسخة.

ومع ذلك، تحدث مشكلة شائعة عندما لا يتوافق عدد النقاط في الرأس الأصلي مع البيانات المختزلة. لإصلاح هذا، نستخدم ينسخ() وظيفة لإنشاء نسخة سطحية من الرأس الأصلي وتعديل الملف يدويًا point_count الحقل ليعكس عدد النقاط المختزلة. بعد إنشاء رأس جديد، يتم تخصيص النقاط المختزلة إلى رأس جديد LasData كائن يحتوي على إحداثيات x وy وz الحقيقية. وأخيرا، LasData يتم حفظه كملف LAZ جديد باستخدام الملف يكتب() طريقة. يعد هذا البرنامج النصي فعالاً للمستخدمين الذين يحتاجون إلى استخراج مجموعات بيانات أصغر من السحب النقطية الأكبر.

يقوم البرنامج النصي الثاني بتوسيع الأول عن طريق إعادة حساب الإزاحات والمقاييس تلقائيًا للبيانات المختزلة. عند العمل مع السحب النقطية، يعد الحصول على إزاحات دقيقة أمرًا بالغ الأهمية لأنها تشير إلى أصل البيانات في مساحة ثلاثية الأبعاد. ال header.offsets يتم تحديث السمة بالحد الأدنى من إحداثيات x وy وz من النقاط المختزلة. وبالمثل، يتم تعيين عوامل القياس التي تؤثر على دقة البيانات النقطية باستخدام header.scales يصف. لا يقلل هذا البرنامج النصي من حجم السحابة النقطية فحسب، بل يضمن أيضًا دقة البيانات ومواءمتها، مما يجعلها أكثر ملاءمة للاستخدام العملي.

وأخيرًا، يوضح النص النهائي اختبار الوحدة باستخدام لغة بايثون com.unittest نطاق. في هذا البرنامج النصي، تحدد حالة الاختبار ما إذا كان عدد النقاط المختزلة يتوافق مع القيمة المتوقعة. يعد هذا أمرًا بالغ الأهمية لضمان تنفيذ إجراء الاختزال بشكل متسق عبر السياقات ومجموعات البيانات. يتم تعريف حالة الاختبار باستخدام TestCase الطبقة، ويتم إجراء المقارنة باستخدام تأكيد الذات () طريقة. ومن خلال تضمين الاختبار في سير العمل، يمكننا التأكد من أن إجراء الاختزال يعمل بشكل صحيح قبل نشره في مشاريع أو خطوط أنابيب أكبر. يساعد هذا البرنامج النصي المستخدمين على تجنب المشكلات والتناقضات عند العمل مع عدة ملفات سحابية.

اختزال ملفات LAZ باستخدام Laspy: التعامل مع بيانات Point Cloud

تستخدم هذه الطريقة Python وحزمة Laspy لاستخراج كل نقطة عاشرة من ملف LAZ قديم وإدارة تغييرات الرأس لمجموعة البيانات الجديدة.

import laspy
import numpy as np
from copy import copy
# Load the existing LAZ file
las = laspy.read("input_file.laz")
# Downsample by taking every 10th point
indices = np.arange(0, len(las.points), 10)
downsampled_points = las.points[indices]
# Copy the header and adjust the point count
header = copy(las.header)
header.point_count = len(downsampled_points)
# Create new LasData with downsampled points
d_las = laspy.LasData(header)
d_las.points = downsampled_points
# Write to a new LAZ file
d_las.write("downsampled_output.laz")

أتمتة ضبط الإزاحة والقياس عند اختزال ملفات LAZ

يقوم هذا الإصدار من Python تلقائيًا بإعادة حساب الإزاحات والمقاييس بناءً على البيانات المختزلة.

import laspy
import numpy as np
# Load the original LAZ file
las = laspy.read("input_file.laz")
# Downsample by taking every 10th point
indices = np.arange(0, len(las.points), 10)
downsampled_points = las.points[indices]
# Create new header and adjust offsets/scales
header = laspy.LasHeader(point_format=las.header.point_format, version=las.header.version)
header.offsets = np.min([las.x[indices], las.y[indices], las.z[indices]], axis=1)
header.scales = np.array([0.01, 0.01, 0.01])  # Set new scales
# Create new LasData and write to file
downsampled_las = laspy.LasData(header)
downsampled_las.points = downsampled_points
downsampled_las.write("downsampled_with_scales.laz")

اختبار الوحدة لاختزال ملفات LAS/LAZ

يتضمن برنامج Python النصي هذا اختبارًا للوحدة للتأكد من أن إجراء الاختزال يعمل بشكل صحيح عبر سياقات متعددة.

import unittest
import laspy
import numpy as np
class TestDownsampling(unittest.TestCase):
    def test_downsample_point_count(self):
        las = laspy.read("input_file.laz")
        indices = np.arange(0, len(las.points), 10)
        downsampled_points = las.points[indices]
        self.assertEqual(len(downsampled_points), len(indices))
if __name__ == "__main__":
    unittest.main()

التعامل مع البيانات الوصفية لملفات LAS وتقنيات الاختزال المتقدمة

عند العمل مع مجموعات البيانات الضخمة مع لاسبي، تعد إدارة البيانات الوصفية أمرًا بالغ الأهمية مثل إدارة البيانات السحابية الفعلية. الحفاظ على دقة لاسهيدر القيم بعد الاختزال يمثل صعوبة كبيرة. نظرًا لتغير إحداثيات بيانات السحابة النقطية (x وy وz)، يجب أن يعكس الرأس هذه التغييرات. إعادة الحساب تعويضات يتطلب إعادة حساب الحد الأدنى من القيم لكل بعد، في حين أن المقاييس تحديد دقة البيانات النقطية، خاصة للتخزين.

هناك عامل آخر يجب تقييمه وهو سلامة الأبعاد الإضافية في ملف LAS. تُستخدم البايتات الإضافية بشكل شائع للاحتفاظ بمعلومات بخلاف إحداثيات x وy وz العادية، مثل الكثافة أو وقت GPS. إذا كانت مجموعة البيانات تحتوي على هذه الأبعاد الإضافية، فيجب معالجتها عند الاختزال. يجب عليك التأكد من أن عدد النقاط في الأبعاد الإضافية يتوافق مع عدد النقاط المخفض في البيانات الأولية. ال add_extra_dim وظيفة في لاسبي يتيح إضافة أبعاد مخصصة إلى رأس LAS.

وأخيرًا، يعد تحسين السرعة عاملاً مهمًا يجب مراعاته عند تقليل حجم السحب النقطية. على الرغم من أن التعديلات البشرية على الرأس تكون مطلوبة عادةً، إلا أن أتمتة العملية من خلال الاستفادة من الفهرسة الفعالة وتطبيق عمليات المصفوفة عبر numpy يمكن تسريع العملية بشكل كبير. من خلال تسخير قوة numpy، يمكنك إدارة مجموعات البيانات الهائلة بسرعة دون التضحية بالأداء. يتيح لك ذلك توسيع الحلول لمشاريع أكبر أو حتى أتمتة خطوط الأنابيب لمعالجة ملفات LAZ المتعددة.

أسئلة شائعة حول الاختزال باستخدام Laspy

  1. كيف أتعامل مع أبعاد المصفوفة غير المتطابقة في LasData؟
  2. لعلاج هذه المشكلة، تأكد من أن point_count في الرأس يتوافق مع العدد الفعلي للنقاط في البيانات المختزلة. قم بتغيير العدد يدويًا حسب الحاجة.
  3. هل يجب علي إعادة الحساب دائمًا؟ offsets و scales بعد الاختزال؟
  4. نعم، من الضروري إعادة حساب هذه القيم، خاصة بالنسبة لمجموعات البيانات الضخمة. ال offsets يمثل القيم الدنيا الجديدة، في حين scales يضمن دقة البيانات.
  5. يستطيع laspy التعامل مع أبعاد إضافية في ملفات LAS؟
  6. نعم، يمكن إدارة المزيد من الأبعاد باستخدام add_extra_dim ميزة في LasHeader، والذي يسمح لك بتعيين أبعاد مخصصة مثل الكثافة أو وقت GPS.
  7. يكون numpy مطلوب للاختزال مع laspy؟
  8. رغم أنها ليست ضرورية بالضرورة، numpy يسهل التعامل مع مجموعات البيانات الضخمة عن طريق إنشاء المؤشرات ومعالجة المصفوفات بكفاءة.
  9. كيف يمكنني تسريع عملية الاختزال؟
  10. يستخدم numpy لتنفيذ عمليات المصفوفة وفهرستها بكفاءة. يؤدي هذا إلى تحسين الأداء عند العمل مع السحب النقطية الضخمة.

الوجبات السريعة الرئيسية للاختزال الفعال

لتجنب عدم تطابق الأبعاد عند الاختزال لاز الملفات مع لاسبي، ال point_count يجب تعديل الخاصية يدويًا في الرأس. تضمن إعادة حساب الإزاحات والمقاييس التمثيل المناسب للبيانات الجديدة.

تتطلب بعض المكونات، مثل تعديلات الرأس، تدخلاً يدويًا، بينما يمكن تشغيل البعض الآخر تلقائيًا باستخدام numpy لتعظيم السرعة وإدارة مجموعات البيانات الضخمة. يعمل اختبار الوحدة على تعزيز قوة سير عمل الاختزال، مما يجعله أكثر كفاءة في المواقف الفعلية.