কিউজিআইএস-এ বহুভুজ মুখোশ ব্যবহার করে স্টাইলিং নির্দিষ্ট স্তরটিকে?


10

কিউজিএস-এ আমার একটি লাইন স্তর এবং বহুভুজ স্তর রয়েছে:

মুখোশের আগে

আমি বহুভুজের বাইরে লাইন স্তরটির অংশটি একটি স্টাইল ব্যবহার করে এবং অভ্যন্তরের অংশটি ভিন্ন স্টাইল ব্যবহার করে স্টাইল করতে চাই:

মাস্ক পরে

আমি ডেরিভেটিভ ডেটা সেট তৈরি করতে চাই না, প্রাক্তন। লাইন স্তরটি ক্লিপ করুন এবং দুটি অংশ স্টাইল করুন।

এটি একটি সাধারণ ক্ষেত্রে তবে আমার কিউজিআইএস প্রকল্পে আমার +30 স্তর রয়েছে তাই আমি মনে করি যে কোনও স্তর মিশ্রণটি অন্তর্নিহিত স্তরগুলিকে ব্যাঘাত ঘটাবে।

এরকম কিছু করা কি সম্ভব?

আমি বহুভুজ স্তরটি দেখাতে চাই না, আমি কী করতে চাই তা ভিজ্যুয়ালাইজ করার জন্য এখানেই রয়েছে।


1
দুর্দান্ত পদ্ধতি! আমি মনে করি যে প্রশ্নটিতে সম্পাদনার পরিবর্তে উত্তর হিসাবে পোস্ট করা উচিত :)
জোসেফ

@ জোসেফ, শেষ!
চৌ

উত্তর:


11

একটি নিখুঁত সমাধান নয় তবে আপনি জ্যামিতি জেনারেটরটি ব্যবহার করতে পারেন যা ছেদটি প্রতিনিধিত্ব করার জন্য একটি ভিজ্যুয়ালাইজড লাইন যুক্ত করে। তারপরে আপনি এটির মূল লাইন বৈশিষ্ট্যটি ওভারল্যাপ করতে সেট করতে পারেন।

প্লাস চিহ্নে ক্লিক করে একটি নতুন প্রতীক স্তর যুক্ত করুন এবং Geometry generatorপ্রতীক স্তর প্রকার হিসাবে নির্বাচন করুন । জিওমিট্রি টাইপটি সেট করুন LineString / MultiLineStringএবং নিম্নলিখিত এক্সপ্রেশনটি ব্যবহার করুন:

intersection($geometry, geometry(get_feature( 'polygonLayer','fieldName','value'))) 

আপনার নির্দিষ্ট বহুভুজ সম্পর্কে আপনাকে বিশদ যুক্ত করতে হবে যেখানে:

  • polygonLayer আপনার বহুভুজ স্তরটির নাম
  • fieldName ক্ষেত্রের নাম
  • value আপনার নির্দিষ্ট বহুভুজের বৈশিষ্ট্য মান

শৈলীর বৈশিষ্ট্য

নোট করুন ভিজ্যুয়াল লাইনের রঙিন করার জন্য আপনার এটিকে ড্র-এফেক্ট প্রপার্টি থেকে করতে হবে :

প্রভাব বৈশিষ্ট্য আঁকুন

এটি ফলাফল ছিল (দ্রষ্টব্য যে ভিজ্যুয়াল লাইনটি সম্পূর্ণরূপে মূল লাইনকে ওভারল্যাপ করে নি তাই আমি অফসেটটি কিছুটা পরিবর্তন করেছি):

ফলাফল

এবং বহুভুজ ছাড়া:

বহুভুজ ছাড়াই ফলাফল



সম্পাদনা:

যদি আপনি একটি বহুভুজ বৈশিষ্ট্য ছেদ করে প্রতিটি লাইন বৈশিষ্ট্যের জন্য এটি প্রয়োগ করতে চান তবে ফাংশন সম্পাদকটিতে যান এবং নীচের ফাংশনটি ব্যবহার করুন ( polygon example_2আপনার বহুভুজ স্তরটির সাথে মিলের জন্য নামটি পরিবর্তন করুন ):

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def func(feature, parent):
    polygon_layer = QgsMapLayerRegistry.instance().mapLayersByName( "polygon example_2" )[0]
    feat_list = []
    geoms = QgsGeometry.fromWkt('GEOMETRYCOLLECTION()')
    for polygon_feat in polygon_layer.getFeatures():
        if feature.geometry().intersects(polygon_feat.geometry()):
            intersection = feature.geometry().intersection(polygon_feat.geometry())
            feat_list.append(intersection)
    for x in feat_list:
        geoms = geoms.combine(x)
    return geoms

ফাংশন সম্পাদক

লোড ক্লিক করুন তারপরে এক্সপ্রেশন ট্যাবে যান এবং টাইপ করুন func()। আশা করি ফলাফলটি নীচের মত দেখতে হবে (উপরে উল্লিখিত একই শৈলীর বৈশিষ্ট্যগুলি ব্যবহার করে):

সর্বশেষ ফলাফল


আমি আসলে এটি দেখেছিলাম কিন্তু যখন আমি আবিষ্কার করি তখন বন্ধ হয়ে যায়, এর get_featureজন্য ক্ষেত্রের নাম এবং মান প্রয়োজন। আমার কাছে একটি বহুভুজ স্তর রয়েছে এবং মুখোশটি ছাপানোর জন্য সেই স্তরের সমস্ত বৈশিষ্ট্য ব্যবহার করতে চাই। এটা কি সম্ভব?
চাউ

@ চাউ - একটি সম্ভাব্য পদ্ধতি অন্তর্ভুক্ত করার জন্য সম্পাদিত পোস্ট :)
জোসেফ

1
আরেকটি বিকল্প হ'ল বহুভুজ স্তরটি দ্রবীভূত করা।
সিএসকি

1
@ জোসেফ - যখন স্টাইলিংয়ের জন্য ব্যবহৃত হয় তখন স্তরের প্রতিটি বৈশিষ্ট্যের জন্য কী Geometry Generatorপদ্ধতিটি funcবলা হয়? সুতরাং যদি আমার লাইন স্তরটিতে 3 টি বৈশিষ্ট্য থাকে, তবে func3 বার বলা হয় এবং একই ফলাফলটি 3 বার অঙ্কন করা হয়?
চাউ

1
@ চাউ - আমি মনে করি আপনি ঠিক বলেছেন, কোডটি প্রতিটি বৈশিষ্ট্যের মাধ্যমে একাধিকবার পুনরাবৃত্তি হয়েছিল। পোস্টটি সম্পাদনা করা হয়েছে যাতে funcএখন কেবল প্রতিটি লাইন বৈশিষ্ট্য অনুসারে বলা যেতে পারে এবং কেবল একবার ফলাফলটি এনে দেওয়া হবে (যা বহুবর্ণের অভ্যন্তরে ভার্টেক্স চিহ্নিতকারীদের দেখানো ক্ষেত্রে মনে হয়, এটির নীচে লুকানো ছিল যা আমি মিস করেছি)। এটি দেখানোর জন্য ধন্যবাদ :)
জোসেফ

3

জোসেফের জবাব প্রসারিত করে আমি এই ফাংশনটি নিয়ে এসেছি। এটি বিভিন্ন সমন্বিত সিস্টেমগুলির জন্য অ্যাকাউন্ট করে এবং আমার দুটি মাস্কিং স্তরগুলি অনুসন্ধান করার প্রয়োজন ছিল, সুতরাং এটি এটি পরিচালনাও করে। আরও আমি চেয়েছি যে আপনি বহুভুজের অভ্যন্তরে রেখাগুলি বা বহুভুজগুলির বাইরের রেখাগুলি মাস্ক করতে সক্ষম হতে চেয়েছিলেন।

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

@qgsfunction(args='auto', group='Custom')
def mask_line_with_polygon(mask_type, line_layer_name, polygon_layer_name_1, polygon_layer_name_2, feature, parent):
    line_layer = QgsMapLayerRegistry.instance().mapLayersByName( line_layer_name )[0]

    # This is the geometry outside the polygon mask.
    outside = QgsGeometry(feature.geometry())

    polygon_layer_names = [polygon_layer_name_1, polygon_layer_name_2]
    line_feature_extent = outside.boundingBox()

    geoms = QgsGeometry.fromWkt('MultiLineString()')

    for polygon_layer_name in polygon_layer_names:
        if polygon_layer_name is None or len(polygon_layer_name) == 0:
            continue

        # If the line and the polygon layers have different projections, handle them here.
        polygon_layer = QgsMapLayerRegistry.instance().mapLayersByName(polygon_layer_name)[0]
        trs = QgsCoordinateTransform(line_layer.crs(), polygon_layer.crs())
        polygon_extent = trs.transform(line_feature_extent)
        trs = QgsCoordinateTransform(polygon_layer.crs(), line_layer.crs())

        # Go through the features in the polygon layer, but only those within the line feature bounding box.
        for feature in polygon_layer.getFeatures(QgsFeatureRequest().setFilterRect(polygon_extent)):
            polygon_geometry = QgsGeometry(feature.geometry())

            # Transform the polygon to line space.
            polygon_geometry.transform(trs)

            if outside.intersects(polygon_geometry):
                if mask_type.lower() == 'outside':
                    inside = outside.intersection(polygon_geometry)

                    if inside.isMultipart():
                        for x in inside.asMultiPolyline():
                            geoms.addPart(x)
                    else:
                        geoms.addPart(inside.asPolyline())

                outside = outside.difference(polygon_geometry)

    if mask_type.lower() == 'inside':
        if outside.isMultipart():
            for x in outside.asMultiPolyline():
                geoms.addPart(x)
        else:
            geoms.addPart(outside.asPolyline())

    return geoms

এই অনুশীলনটি আমাকে দেখিয়েছে যে কিউজিআইএস বড় ডেটা সেটগুলির সাথে কাজ করার খুব পছন্দ করে না এবং কিজিআইআইএস সহ এই অ্যালগরিদমটি প্রায়শই আমার পথে ক্র্যাশ হয়। আমি সন্দেহ করি যে কিউজিআইএস রেন্ডারার জ্যামিতি জেনারেটরগুলি সময় সাপেক্ষে রেন্ডার করতে পছন্দ করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.