كيف يمكنني تحويل مجموعة من المضلعات إلى صورة نقطية
-
09-06-2019 - |
سؤال
كيف يمكنني أخذ مجموعة من المضلعات التي تحتوي على قيم عشوائية وإنشاء صورة نقطية مقابلة حيث يحتوي كل بكسل على قيمة المضلع في ذلك الموقع؟
لوضع السؤال في سياقه، تحتوي المضلعات الخاصة بي على معلومات حول متوسط عدد الأشخاص لكل كيلومتر مربع داخل المضلع.أحتاج إلى إنشاء صورة نقطية/نقطية تحتوي على وحدات بكسل تمثل السكان في صناديق بحجم 200 متر.
لقد فعلت شيئًا مشابهًا في الماضي حيث استخدمت مضلعًا لإنشاء قناع عن طريق الرسم في صورة نقطية وملء القيم، ثم تحويل الصورة النقطية إلى مصفوفة يمكنني معالجتها.أنا متأكد من أن هناك طريقة أفضل للقيام بذلك!
أقوم بتوضيح السؤال أكثر قليلاً كما هو مطلوب.
- هناك مضلعات متعددة، كل مضلع عبارة عن مجموعة من المتجهات
- سيكون لكل مضلع قيمة فريدة واحدة
- المضلعات لا تتداخل
شكرًا
نيك
المحلول
@ نيك ر
كنت أستخدم ArcGIS 9.2 في الأصل، لكن هذا لا يعمل بشكل جيد مع C# و64 بت، لذلك أستخدم الآن GDAL (http://www.gdal.org).
لا gdal_rasterize افعل ما تريد بالضبط؟
نصائح أخرى
ما هي برامج نظم المعلومات الجغرافية التي تستخدمها؟يقدم ArcGIS أداة Polygon to Raster في ArcGIS 9.2 أو الإصدارات الأحدث، والتي يمكن كتابتها كوظيفة PolygonToRaster_conversion.
PolygonToRaster_conversion (in_features, value_field, out_raster_dataset, cell_assignment, priority_field, cellsize)
ربما لا يكون هذا هو ما تحتاجه، ولكن إذا كنت تريد رسم مضلع (أو على العكس من ذلك قراءة وحدات بكسل صورة المضلع على أساس مضلع) فإن أحد الحلول هو أن ترسم بكسلك الخاص أداة تعبئة المضلع.بصراحة تامة، هذا ممتع للغاية، ومن الرائع حقًا التعرف عليه.
لكن سؤالك ليس واضحا جدا بالنسبة لي.هل يمكنك إعطاء وصف أفضل؟
- هل مجموعتك من المضلعات العشوائية هي صور فعلية، أم نقاط متجهة (أي قائمة النقاط)، أم ؟؟؟
- هل يحتوي كل مضلع على قيمة واحدة، أم أن كل مضلع يحتوي على مجموعة من القيم التي تحاول رسمها؟
- إذن، يحتوي كل مضلع على مجموعة مرتبطة من القيم السكانية التي تريد نسيج المضلع بها بشكل أساسي؟
-آدم
إنه مشروع ممتع.إليك ما سأفعله، بافتراض أن المضلعات محدبة:
have a NY * 2 array of x positions: int x[NY][2]
foreach polygon
clear the array to -1
for each edge line
foreach horizontal raster line iy intersecting the line
generate ix, the x position where the raster intersects the line
if x[iy][0] == -1, set it to ix, else set x[iy][1] to ix
end foreach iy
end foreach edge
foreach iy
fill the pixels between x[iy][0] and x[iy][1] with the polygons label
end foreach iy
end foreach polygon
هذا الأمر أكثر صعوبة مما يبدو، لأنك تحتاج إلى الانضباط العقلي للتفكير في الإحداثيات النقطية ليس باعتبارها وحدات البكسل التي سيتم تصنيفها، ولكن كخطوط غير مرئية بينها.وإلا فإنك سترتبك بسبب قضايا الحدود.
الاختبار الجيد لذلك هو أنه إذا كان لديك مضلع مساحته صفر، مثل أنه يتكون من حواف من النقطة A إلى النقطة B والعودة إلى النقطة A، فيجب ألا يضيء أي بكسل.اختبار آخر هو أنه إذا كان لديك متوازي أضلاع يبلغ ارتفاعه وحدتين، وحوافه العلوية والسفلية بعرض وحدتين، فيجب أن يضيء بدقة 4 بكسل.
إذا لم تكن المضلعات محدبة، فالأمر مختلف قليلاً.أينما تعبر الحافة خطًا نقطيًا، قم بتبديل جميع وحدات البكسل من هناك إلى إحداثيات X مختارة بشكل عشوائي، مثل الحافة اليسرى من "الشاشة".عند الانتهاء من جميع الحواف، سيتم تبديل وحدات البكسل الداخلية فقط لعدد فردي من المرات.
يمكن لـ ImageMagick التحويل من svg إلى png، ربما يمكنك إلقاء نظرة على الكود، أو ببساطة إنشاء svg واستخدام المراسلة الفورية للتحويل؟ قذر يفعل ذلك.