أكثر

كيف تحسب المربع المحيط في الإحداثيات المسقطة؟

كيف تحسب المربع المحيط في الإحداثيات المسقطة؟


أنا أستخدم GDAL في Python لإعادة صياغة البيانات النقطية. أود أن أكون قادرًا على أخذ البيانات النقطية الحالية ، وإسقاطها في صورة نقطية جديدة لإسقاطي وحجم بكسل الإخراج الذي اخترته.

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

هل يكفي تحويل رؤوس الصندوق المحيط الأصلي إلى نظام الإحداثيات المسقط ثم تحويل هذا المربع بطريقة ما إلى مربع؟ (أنا متأكد من أن الصندوق سيتم تشويهه.)


الطريقة الآمنة للحصول على المدى الجديد بالضبط هي

  1. قم بإنشاء مضلع من مدى البيانات النقطية باستخدام gdaltindex
  2. تكثيف هندسة المضلع
  3. إعادة إسقاط المضلع إلى CRS الهدف باستخدام ogr2ogr
  4. حساب المدى في CRS الجديد

لقد مرت بضعة أشهر منذ أن نشرت هذا. اقترح @ michael-miles-stimson أن الطريقة الصحيحة للقيام بذلك هي أخذ عينات من النقاط على طول كل حافة من الصندوق المحيط ، وعرضها ، ثم بناء مربع محيط شامل على تلك النقاط. يقوم رمز Python / GDAL أدناه بهذا ويسمح لك بتحديد عدد نقاط الاستيفاء التي ترغب في أخذ عينات منها على طول الحافة.

استيراد numpy من osgeo استيراد osr def convert_bounding_box (محيط_صندوق ، base_epsg ، new_epsg ، edge_samples = 11): "" "تحويل مربع إحاطة الإدخال إلى إسقاط الإخراج. يراعي هذا التحويل حقيقة أن مربع إحاطة المربع المعاد إسقاطه قد يكون مشوهًا في الإحداثي الجديد النظام. لحساب ذلك ، تشير عينات الوظيفة على طول حواف الصندوق المحيط الأصلي وتحاول إنشاء أكبر مربع محيط حول أي نقطة محولة على الحافة سواء كانت زوايا أو حواف ملتوية. المعلمات: bounding_box (list): قائمة من 4 إحداثيات في نظام إحداثيات 'base_epsg' يصف الحد بالترتيب [xmin، ymin، xmax، ymax] base_epsg (int): كود EPSG لنظام إحداثيات الإدخال new_epsg (int): كود EPSG لنظام إحداثيات الإخراج المطلوب edge_samples ( int): عدد النقاط المحرفة على طول كل حافة مربع محيط لأخذ عينة على طولها. ستأخذ القيمة 2 عينة من الزوايا فقط بينما ستأخذ القيمة 3 أيضًا عينة من الزوايا ونقطة المنتصف. العوائد: A قائمة بالشكل [xmin، ymin، xmax، ymax] الذي يصف أكبر مربع محيط ملائم حول الصندوق المحيط الملتوي الأصلي في نظام الإحداثيات "new_epsg". "" "base_ref = osr.SpatialReference () base_ref.ImportFromEPSG (base_epsg) new_ref = osr.SpatialReference () new_ref.ImportFromEPSG (new_epsg) محول = osr.CoordinateTransformation (base_ref، new_ref) p_array = (numpy. ، bounding_box [3])) p_1 = numpy.array ((bounding_box [0]، bounding_box [1])) p_2 = numpy.array ((bounding_box [2]، bounding_box [1])) p_3 = numpy.array (( bounding_box [2]، bounding_box [3])) def _transform_point (نقطة): trans_x، trans_y، _ = (transformer.TransformPoint (* point)) return (trans_x، trans_y) # تتكرر هذه القائمة في الفهم على كل حافة من الصندوق المحيط ، # يقسم كل حافة إلى عدد من النقاط 'edge_samples' ، ثم يقلل # تلك القائمة إلى 'bounding_fn' مناسب نظرًا للحافة. النقاط بين أعلى اليسار والنقطة اليسرى السفلية # ، قم بتحويلها جميعًا إلى نظام الإحداثيات الجديد # ثم احصل على الحد الأدنى من إحداثيات x "min (p [0]…)" لـ b atch. converted_bounding_box = [bounding_fn ([_transform_point (p_a * v + p_b * (1 - v)) لـ v في numpy.linspace (0، 1، edge_samples)]) لـ p_a، p_b، bounding_fn in [(p_0، p_1، lambda p_list : min ([p [0] for p in p_list]))، (p_1، p_2، lambda p_list: min ([p [1] for p in p_list]))، (p_2، p_3، lambda p_list: max ([ p [0] لـ p في p_list]))، (p_3، p_0، lambda p_list: max ([p [1] for p in p_list]))]] return transformed_bounding_box

شاهد الفيديو: الفرق بين محيط المربع و مساحة المربع عمليا