কিউজিসে জিগজ্যাগ লাইন প্রতীক


18

আমি কিউজিআইএস-এ একটি জিগজ্যাগ লাইন প্রতীক খুঁজছি। আমি মিস করছি এমন করার সম্ভবত কোনও সহজ উপায় আছে? আমি একটি সাধারণ ত্রিভুজ চিহ্নিতকারী (^) ব্যবহার করে মার্কার লাইন তৈরি করার চেষ্টা করেছি এবং ট্রেজারেলগুলি একে অপরকে স্পর্শ না করে এবং একটি সুন্দর জিগজ্যাগ লাইন উপস্থিত না হওয়া পর্যন্ত চিহ্নিতকারীর আকার এবং মার্কার স্থান নির্ধারণের ব্যবধান সামঞ্জস্য করেছি। এটি সরলরেখার জন্য কাজ করে তবে বক্ররেখার চারপাশে ত্রিভুজগুলির মধ্যে ফাঁক রয়েছে কারণ ত্রিভুজগুলি আসলে সংযুক্ত নয়। চিহ্নিতকারীদের একসাথে যোগদানের জন্য কি কোনও উপায় আছে? বা এই সম্পর্কে আরও একটি উপায়? আমি কোন পরামর্শের জন্য খুব কৃতজ্ঞ হবে! (কিউজিআইএস ২.৪.০ ব্যবহার করে) জিগজ্যাগ লাইনে আমার প্রচেষ্টা

উত্তর:


11

দেখে মনে হচ্ছে কেবল জিগজ্যাগ হিসাবে লাইনটি প্রতীকী করার কোনও উপায় নেই: দুর্ভাগ্যক্রমে, আপনাকে অন্তর্নিহিত ডেটা পরিবর্তন করতে হবে।

আপনি প্রথমে মূল লাইনটিকে অনেকগুলি সামঞ্জস্যপূর্ণ লাইন বিভাগে বিভক্ত করে যুক্তিসঙ্গতভাবে ভাল জিগজ্যাগ লাইন পেতে পারেন এবং তারপরে একটি নির্দিষ্ট পরিমাণে প্রতিটি অন্য পয়েন্ট অফসেট করে।

এখানে পাইথন স্ক্রিপ্ট রয়েছে যা এটি করে নাথানডাব্লুয়ের উত্তর নিয়ে আমি কিউজিআইএস-তে একটি পললাইন বরাবর এলোমেলো পয়েন্টগুলি কীভাবে তৈরি করতে পারি? একটি সূচনা পয়েন্ট হিসাবে। zigzag.pyআপনার ~/.qgis/pythonডিরেক্টরিতে (বা {User Directory}\.qgis\python\উইন্ডোজে) ডাকা একটি ফাইলে কোড অংশটি সংরক্ষণ করুন এবং তারপরে QGIS পাইথন কনসোলে টাইপ করে আমদানি করুন import zigzag। তারপর আপনি যে আপনার zigzagify করতে চান এক বা একাধিক লাইন নির্বাচন করুন, এবং টাইপ করতে পারেন zigzag.createZigzag(<wavelength>, <amplitude>)QGIS পাইথন কনসোল, যেখানে <wavelength>এবং <amplitude>আঁকাবাঁকা অংশ এর "দৈর্ঘ্য" এবং "প্রস্থ" হয়, মানচিত্র ইউনিট।

এখানে একটি উদাহরণ:

আপনি দেখতে পাচ্ছেন যে, জিগজাগগুলি মূল লাইনের কোণগুলির কাছে খুব সুন্দর নয় তবে কমপক্ষে জিগজ্যাগ লাইনের কোনও ব্রেক নেই।

আপনি যদি চাইকেনের অ্যালগরিদম ব্যবহার করে প্রথমে লাইনটি মসৃণ করার জন্য জেমস কনকলিংয়ের পরামর্শ ব্যবহার করেন, ফলাফলটি খুব সুন্দর পেয়েছে:


লিপিটি এখানে:

from qgis.utils import iface
from qgis.core import *
import numpy as np
from cmath import rect, phase


# Function for calculating the mean of two angles.
# Based on http://rosettacode.org/wiki/Averages/Mean_angle#Python
def meanAngle(a1, a2):
    return phase((rect(1, a1) + rect(1, a2)) / 2.0)


def createZigzag(wavelength, amplitude):
    # Create a new memory layer to store the zigzag line.
    vl = QgsVectorLayer("LineString", "Zigzag", "memory")
    pr = vl.dataProvider()

    # For each selected object in the current layer
    layer = iface.mapCanvas().currentLayer()
    for feature in layer.selectedFeatures():
        geom = feature.geometry()

        # Number of zigzag segments
        length = geom.length()
        segments = np.round(length / wavelength)

        # Find equally spaced points that approximate the line
        points = [geom.interpolate(distance).asPoint() for
            distance in np.linspace(0, length, segments)]

        # Calculate the azimuths of the approximating line segments
        azimuths = np.radians(
            [points[i].azimuth(points[i + 1]) for i in range(len(points) - 1)])

        # Average consecutive azimuths and rotate 90 deg counterclockwise
        zigzagazimuths = [azimuths[0] - np.pi / 2]
        zigzagazimuths.extend([meanAngle(azimuths[i],
            azimuths[i - 1]) - np.pi / 2 for i in range(len(points) - 1)]
        )
        zigzagazimuths.append(azimuths[-1] - np.pi / 2)

        # Offset the points along the zigzagazimuths
        zigzagpoints = []
        for i in range(len(points)):
            # Alternate the sign
            dst = amplitude * (1 - 2 * np.mod(i, 2))
            zigzagpoints.append(
                QgsPoint(points[i][0] + np.sin(zigzagazimuths[i]) * dst,
                    points[i][1] + np.cos(zigzagazimuths[i]) * dst
                )
            )

        # Create new feature from the list of zigzag points
        fet = QgsFeature()
        fet.setGeometry(QgsGeometry.fromPolyline(zigzagpoints))

        pr.addFeatures([fet])
        vl.updateExtents()

    QgsMapLayerRegistry.instance().addMapLayer(vl)

অসামান্য সমাধান! আমার একমাত্র প্রশ্ন বাকি যদি এই অ্যালগরিদমটি পলিনগুলিতে প্রয়োগ করা যায়।
গ্যাবোর ফারকাস 21

1
@ গ্যাবরফারকাস: উদাহরণটিতে একটি পললাইন ব্যবহার করা হয়েছে। আপনি সম্ভবত বোঝাতে পারেন যে কয়েকটি স্তর বহনকারী পলিনাইন (একটি বহু-পললাইন) রয়েছে? এটি পাশাপাশি কাজ করে।
জেক

3

আমি আগে এটি করার চেষ্টা করেছি এবং খুব ভাগ্যও পাইনি।

qGIS একটি রেফারেন্স পয়েন্টের ভিত্তিতে একটি রেখায় পুনরাবৃত্ত প্রতীকগুলি রাখে (ডিফল্টরূপে, কেন্দ্রটি, আপনি এটি শীর্ষ / মাঝের / নীচে x বাম / কেন্দ্র / ডানদিকে সেট করতে পারেন) এবং রেখার opeালের ভিত্তিতে সেই চিহ্নটি ঘোরান ates যে বিন্দু। একটি সরলরেখায়, যেখানে opeাল এক প্রতীকের স্থান থেকে পরবর্তীটিতে পরিবর্তিত হয় না, প্রতিটি প্রতীক পূর্বের সাথে পুরোপুরি সীমাবদ্ধ থাকবে। একটি বক্ররেখায়, যদিও, একটি চিহ্নের কোনও বিন্দু সঠিকভাবে পরবর্তী চিহ্নের সাথে সম্পর্কিত পয়েন্টটির সাথে মেলে না।

কিউজিআইএস-এ পুনরাবৃত্ত চিহ্নিতকারী প্রতীক

সুতরাং, যদি লাল রেখাটি নিজেই লাইন হয় তবে সেই রেখার সাথে একটি প্রতীক পুনরাবৃত্তি করলে বাঁকরের বাইরের অংশে চিহ্নগুলির মধ্যে ফাঁক দেখা দেয় এবং একটি বক্ররেখার অভ্যন্তরে ওভারল্যাপ হয়।

শূন্যস্থান এবং ওভারল্যাপগুলি সম্পূর্ণরূপে মুছে ফেলার জন্য, প্রতিটি প্রতীক বর্গক্ষেত্রকে বিভিন্ন আকারের রম্বস হিসাবে পুনরায় আকার দেওয়া দরকার - যেমন একটি খিলানের পাথরটি বক্ররেখার সাথে মিলানোর জন্য কীভাবে বেঁধে দেওয়া হয় similar আমি যতদূর জানি, এর মতো কিছু অনুকরণ করা সম্ভব নয়। তবে, আপনি আপনার লাইন জ্যামিতিকে ঘনকরণ এবং মসৃণ করে বিকৃতি হ্রাস করতে পারেন যাতে কোণে পরিবর্তন কম চরম হয়। Generalizer প্লাগইন (Chaiken এর এলগরিদম সঙ্গে এটি ব্যবহার করার চেষ্টা করুন) যে সাহায্য করতে পারে।

কিউজিআইএস-এ স্মুথড রিপিটার চিহ্নিতকারী symbol

এছাড়াও, আপনার চিহ্নকে ছোট ছোট ভাগে বিভক্ত করা এবং প্রতিটি একের পর এক স্থাপন করা, যাতে আপনি প্রতিটি পরবর্তী চিহ্নিতকারীর মধ্যে কোণটি হ্রাস করতে সহায়তা করেন। উদাহরণস্বরূপ, আপনার Vপ্রতীকটিকে একটি \এবং এ ভাঙ্গা /করুন, মার্কার লাইনে এবং প্রতিটিের জন্য উভয়ই লোড করুন, তাদের অর্ধেক প্রস্থের সমান একটি এক্স-অফসেট সেট করুন, একটির জন্য ইতিবাচক এবং অন্যটির জন্য নেতিবাচক।

শেষ অবধি, গোলাকার প্রান্তগুলির সাথে একটি সামান্য ঘন প্রতীক স্ট্রোক সামান্য বিকৃতিটি মাস্ক করতে সহায়তা করবে।

এটি এখনও কিছুটা হ্যাক - শুনতে শুনতে যদি কারও কাছে আরও নির্ভরযোগ্য পন্থা থাকে তবে তা পছন্দ করবে।

সম্পাদনা:

অন্য একটি ধারণা: বক্ররেখার সাথে প্রতীকের আবর্তনের ফলে এক প্রতীক থেকে অন্য প্রতীককে ভুলের চিহ্ন চিহ্নের উপরের / নীচে সবচেয়ে বড়, তবে মাঝখানে কম উচ্চারণ করা হয়। সুতরাং প্রতীক কেন্দ্রে শুরু হওয়া এবং শেষ হওয়া একটি প্যাটার্নের উপরে / নীচে শুরু / সমাপ্ত হওয়া একটি প্যাটার্নের চেয়ে ছোট ফাঁক থাকবে। যেমন

আঁকাবাঁকা

... এখনও একটি হ্যাক - এখনও নির্বোধ নয়


1

আমি মনে করি না এটি কিউজিআইএস-এর একটি বৈশিষ্ট্য। তবে আমি এটি এইভাবে করার চেষ্টা করব:

  1. অ্যাফাইন সরঞ্জাম প্লাগইন ব্যবহার করে স্তরটির দুটি অনুলিপি করুন। কিছুটা বৃহত্তর স্কেল সহ একটি স্তর এবং কিছুটা ছোট স্কেল সহ।

  2. স্তরগুলির জ্যামিতিটি ঘনকরণ করুন। তার মানে আরও নোড যুক্ত করুন।

  3. বৈশিষ্ট্য সারণীতে যান এবং প্রতিটি বৈশিষ্ট্য নোডকে ফলস্বরূপ 1,2,3, ... একটি স্তরে এবং 1 বি, 2 বি, 3 বি, ... দ্বিতীয় স্তরে নামকরণ করুন।

  4. উভয় স্তর একত্রিত করুন এবং বৈশিষ্ট্য স্তরটি বাছাই করুন -> এটি আপনাকে একটি জিগজ্যাগ লাইন দেয়।

সম্ভবত এটি কাজ করে।


1
উত্তরের জন্য ধন্যবাদ! যাইহোক, আমি মনে করি না যে এটি ন্যায়সঙ্গত প্রান্তের সাথে একটি বিজ্ঞপ্তি চাপ হিসাবে খুব নির্দিষ্ট ক্ষেত্রে ব্যতীত কাজ করবে, অন্যথায় আপনি অসম জিগজ্যাগ লাইনটি শেষ করবেন (স্কেলিংয়ের কারণে এবং ঘনত্বের কারণে)।
জেক 16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.