أكثر

إنشاء أضواء قطاعية في QGIS؟


أنا أستخدم QGIS 2.18. أحتاج إلى إنشاء أضواء قطاعية للأغراض الملاحية على الخريطة.

لدي بيانات قطاع الضوء مثل الحقول التي تعطي becon_id ودرجة البداية ودرجة النهاية واللون في ملف شكل يحتوي على أكثر من 500 عوامة ومنارات ومنارات يجب عرضها على الخريطة. لكل منارة ، يمكن أن يكون هناك العديد من الصفوف ، كل منها يصف قطاعًا ضوئيًا واحدًا (على سبيل المثال ، قطاع أبيض)

يجب أن تبدو النتيجة النهائية كما يلي: قطاعات الضوء بالألوان الصحيحة ، مع تمييز اللون كحرف في حقل اللون (RG W) ، والخطوط المنقطة من 100 متر إلى 1000 متر من العوامة / المنارة / المنارة.

يجب أن يتم إنشاء هذا على الأرجح كرمز قائم على مسطرة ، لكن يحتاج إلى بعض الثعبان على ما أعتقد؟

فيما يلي مثال لبيانات ملف الشكل لمنارة (للأسف ليست أعلاه) التي لها قطاع أخضر بين 114 و 154 درجة ، قطاع أبيض بين 154 و 168 درجة ، قطاع أحمر بين 168 و 237 درجة ، أخضر قطاع بين 237 و 314 درجة ، قطاع أبيض بين 314 و 320 درجة ، قطاع أحمر بين 320 و 337 درجة (لسبب ما ، 0 ليس شمالاً بل جنوباً):


تعديل لقد قمت بتحرير الإجابة لإدارة مواقف معينة (بسبب قيم زاوية محددة) وعدم عرض الخطوط المنقطة عند تحديد زاوية دائرية.


أقترح حلاً من خلال التكرار فقط للترميز القائم على القواعد ووضع العلامات.

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

علاوة على ذلك، هذا الحل يعمل فقط إذا أنت تفترض ذلك0الدرجة هي الشمال بدلاً من الجنوب (إذا0هو الجنوب ، بدلاً من ذلك ، سيكون كافياً جمع أ180قيمة في كل مرة تظهر فيها "90" في الصيغ التي تتعامل مع الزوايا ، على سبيل المثالكوس (راديان (90))قد يصبحكوس (راديان (180 + 90))). فضلت القيام بذلك فقط من أجل إعطاء حل أكثر عمومية.


التصميم

سوف نجعل النقاط بامتدادرمز واحدوبتكرار واحدعلامة بسيطةوثلاثةمولد الهندسةطبقات الرمز:

في الشرح الإضافي ، سأتبع نفس ترتيب الرموز في الصورة أعلاه.

1) علامة بسيطة

اخترت رمزًا افتراضيًا لنجمة سوداء (هذا هو الجزء الأسهل من هذا البرنامج التعليمي) ، بحجم 3 مم وعرضه 0.4 مم.

2) مولد الهندسة رقم 1

أضف طبقة رمز جديدة وحدد ملفمولد الهندسةيكتب:

أدخل هذا التعبير في ملفتعبيرمجال:

الحالة عند القيمة المطلقة ("ALKUKULMA" - "LOPPUKULMA") <360 ثم make_line ($ geometry، make_point ($ x + 1000 * cos (راديان (90 - "ALKUKULMA")) ، $ y + 1000 * sin (90 - "الكوكلما")))) النهاية

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

3) مولد الهندسة رقم 2

كما ورد أعلاه ، ولكن في هذه الخطوة ، تحتاج إلى استخدام هذا التعبير:

الحالة عند القيمة المطلقة ("ALKUKULMA" - "LOPPUKULMA") <360 ثم make_line ($ geometry، make_point ($ x + 1000 * cos (راديان (90 - "LOPPUKULMA")) ، $ y + 1000 * sin (90 - "LOPPUKULMA")))) النهاية

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

4) مولد الهندسة رقم 3

أدخل هذا التعبير في ملفتعبيرمجال:

CASE WHEN abs ("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA"> = "LOPPUKULMA" ثم الاختلاف (الحدود (المخزن المؤقت ($ geometry ، 900)) ، make_polygon (geom_from_wkt (geom_to make_wkt (make_line، $ ($ x + 2000 * cos (راديان (90 - "ALKUKULMA")) ، $ y + 2000 * sin (((90 - "ALKUKULMA")))) ، make_point ($ x + 2000 * cos (90 راديان) - ("LOPPUKULMA" + "ALKUKULMA") / 2))، $ y + 2000 * sin (((90 - ("LOPPUKULMA" + "ALKUKULMA") / 2)))، make_point ($ x + 2000 * cos (90 - "LOPPUKULMA")) ، $ y + 2000 * sin (((90 - "LOPPUKULMA")))) ، الهندسة $)))) عند القيمة المطلقة ("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" <= "LOPPUKULMA" ثم تقاطع (الحدود (المخزن المؤقت (الهندسة بالدولار ، 900)) ، make_polygon (geom_from_wkt (geom_to_wkt (make_line ($ geometry ، make_point ($ x + 2000 * cos (90 - "ALKUKULMA")) ، $ y + 2000 * sin ((90 - "ALKUKULMA"))) ، make_point ($ x + 2000 * cos (راديان (90 - ("LOPPUKULMA" + "ALKUKULMA") / 2 )) ، $ y + 2000 * sin ((90 - ("LOPPUKULMA" + "ALKUKULMA") / 2)))) ، make_point ($ x + 2000 * cos (راديان (90 - "LOPPUKULMA")) ، $ y + 2000 * sin (((90 - "LOPPUKULMA")))) ، الهندسة $)))) عند القيمة المطلقة ("ALKUKULMA" "-" LOPPUKULMA ")> 180 AND" ALKUKULMA "> =" LOPPUKULMA "ثم تقاطع (الحدود (المخزن المؤقت (هندسة $ ، 900)) ، make_polygon (geom_from_wkt (geom_to_wkt (make_line ($ cosometry ، make_point $ 2000) (90 - "ALKUKULMA")) ، $ y + 2000 * sin (راديان ((90 - "ALKUKULMA")))) ، make_point ($ x - 2000 * cos (راديان (90 - ("LOPPUKULMA" + ") ALKUKULMA ") / 2)) ، $ y - 2000 * sin ((90 - (" LOPPUKULMA "+" ALKUKULMA ") / 2)))) ، make_point ($ x + 2000 * cos (راديان (90 -") LOPPUKULMA ")) ، $ y + 2000 * sin (((90 -" LOPPUKULMA ")))) ، هندسة $)))) عندما abs (" ALKUKULMA "-" LOPPUKULMA ")> 180 و" ALKUKULMA "< = "LOPPUKULMA" فرق ثم (الحدود (المخزن المؤقت (الهندسة بالدولار الأمريكي ، 900)) ، make_polygon (geom_from_wkt (geom_to_wkt (make_line ($ geometry ، make_point ($ x + 2000 * cos (راديان (90 - "ALKUKULMA")) ، $ y + 2000 * sin ((90 - "ALKUKULMA")))) ، make_point ($ x - 2000 * cos (راديان (90 - ("LOPPUK) ULMA "+" ALKUKULMA ") / 2)) ، $ y - 2000 * sin (((90 - (" LOPPUKULMA "+" ALKUKULMA ") / 2))) ، make_point ($ x + 2000 * cos (راديان) (90 - "LOPPUKULMA"))، $ y + 2000 * sin (((90 - "LOPPUKULMA"))))، $ geometry))))) النهاية

لقد حددنا للتو القوس بين نقطتي البداية والنهاية لقطاع الضوء (يرجى ملاحظة ذلك2000هي قيمة عشوائية لأنني أحاول إنشاء ملف مضلع لتتقاطع مع حدود الدائرة التي يبلغ نصف قطرها 900 م).

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

ثم اكتب هذا التعبير بعد النقر فوق ملفيحرر…زر:

الحالة عند "VARIS" = 'vi' ثم color_rgb (51،160،44) عندما "VARIS" = 'v' ثم color_rgb (255،255،255) عندما "VARIS" = 'p' ثم color_rgb (227،26،28) النهاية

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


الوسم

1) ضبط الملصقات

اذهب إلىخصائص الطبقة>ملصقاتوكالعادة اتبع الأسهم الحمراء:

ثم اكتب هذا التعبير:

الحالة عند "VARIS" = 'vi' ثم 'G' عندما "VARIS" = 'v' ثم W 'عندما "VARIS" =' p 'ثم R' النهاية

لقد حددنا للتو قاعدة اللون باستخدام القيمة المخزنة في ملف"فاريس"مجال.

2) ضبط موضع الملصقات

حدد ملفتحديد مستوىالخيار فيملصقاتالقائمة وحددالإزاحة من النقطة.

ثم بالإشارة إلى الصورة أدناه:

اتبع السهم الأحمر واكتب هذا التعبير:

الحالة عند "ALKUKULMA"> "LOPPUKULMA" ثم concat (-1000 * cos (90 - ("ALKUKULMA" + "LOPPUKULMA") / 2))، '،'، 1000 * sin (90 - ("ALKUKULMA" "+" LOPPUKULMA ") / 2))) عند" ALKUKULMA "<=" LOPPUKULMA "ثم concat (1000 * cos (90 - (" ALKUKULMA "+" LOPPUKULMA ") / 2))، '،'، - 1000 * خطيئة (90 - ("ALKUKULMA" + "LOPPUKULMA") / 2))) النهاية

ثم اتبع السهم الأخضر واكتب هذا التعبير:

CASE WHEN "ALKUKULMA"> = "LOPPUKULMA" ثم 180 - (("ALKUKULMA" + "LOPPUKULMA") / 2) عندما "ALKUKULMA" <"LOPPUKULMA" ثم - (("ALKUKULMA" + "LOPPUKULMA") / 2

النتيجة النهائية

إذا قمت بتنفيذ المهام السابقة بشكل صحيح ، فيجب أن تكون قادرًا على الحصول على هذه النتيجة:

علاوة

نظرًا لأن المعلمات الثانوية كانت كثيرة جدًا بحيث لا يمكن تغطيتها بالكامل في هذه الإجابة ، فقد أرفقت النمط هنا: يمكنك فتح هذا الرمز بأي محرر نص وحفظه كملف QGIS Layer Style (أي باستخدام.qmlتمديد).

تم إنشاء النمط أعلاه باستخدام QGIS 2.18.4 (يجب أن يكون له نفس اسم ملف الشكل الذي تستخدمه).


شاهد الفيديو: QGIS: Advanced Tutorial - Mapping in GIS (شهر اكتوبر 2021).