কিউজিআইএসে wেউয়ের wেউ, লাইনগুলি অঙ্কন?


21

উইগলি লাইন আঁকার জন্য কি কিউজিআইএস ফাংশন বা প্লাগইন রয়েছে?

আমি কিছু তরঙ্গ ম্যানুয়ালি আঁকতে স্প্লাইন সরঞ্জামটি ব্যবহার করেছি, তবে এটি সময় সাপেক্ষ। যদি সম্ভব হয় তবে আমি এর মতো কিছু আঁকতে চাই:

এখানে চিত্র বর্ণনা লিখুন

Inkscape Function Plotter ( sin(x)বক্র)।


সত্যিই আকর্ষণীয় প্রশ্ন! আপনি কীভাবে তাত্ক্ষণিকভাবে রেখাগুলি আঁকার জন্য কোনও সরঞ্জাম (যেমন আপনি যখন মাউস ব্যবহার করে কোনও সাধারণ রেখার বৈশিষ্ট্যটি আঁকেন) এর কথা ভাবছেন, বা কোনও ফলাফল স্থগিত থেকে ইনপুট হিসাবে শুরু করার উপায় আছে (অবশেষে পয়েন্ট, লাইন বা বহুভুজ থেকে)?
এমগ্রি

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

দয়া করে দেখুন আমার সমাধান সাহায্য করে কিনা। আমি এটি ব্যাপকভাবে পরীক্ষা করিনি, সুতরাং দয়া করে কিছু ভুল হয়ে থাকলে আমাকে জানান (আমি এখনই এটি করতে পারি না তবে আমি সম্ভবত আরও উত্তর দিয়ে আমার উত্তরটি সম্পাদনা করব)।
এমগ্রি

উত্তর:


18

আমি পাইকিজিআইএস ব্যবহার করে একটি সমাধান প্রস্তাব করছি। এটি লাইনস্ট্রিং এবং মাল্টলাইনস্ট্রিং স্তরগুলির জন্য উভয়ই কাজ করা উচিত।

এই সমাধানটি অর্ধবৃত্তাকার রিং তৈরির উপর ভিত্তি করে, সুতরাং আপনাকে ব্যাসের জন্য একটি মান নির্ধারণ করতে হবে (অর্থাত stepনীচের কোডে পরিবর্তনশীল)। আপনার চয়ন করা পদক্ষেপটি আসল পদক্ষেপ হিসাবে ব্যবহৃত হবে না কারণ এটি লাইনের দৈর্ঘ্যের ভিত্তিতে সামঞ্জস্য করা হয়েছে (তবে এটি প্রাথমিকভাবে সেট করা মানের সাথে সত্যই মিল থাকবে)। stepভেরিয়েবলের জন্য সর্বোত্তম মান সন্ধান করার আগে আপনাকে কিছু চেষ্টা করতে হবে ।

কোডটির জন্য একটি দ্বিতীয় (alচ্ছিক) প্যারামিটারও প্রয়োজন হয় ( crv_angleযা বলা হয় ), যা রিংগুলির জন্য বক্রতা হ্রাস বা বৃদ্ধি করতে সহায়তা করে (আমি এর জন্য কয়েকটি পরীক্ষা করেছি, তাই আমি 45 ডিগ্রি ডিফল্ট কোণ হিসাবে রেখে দেই কারণ এটি বাস্তব বিজ্ঞপ্তিতে বাড়ে would রিং)।

পাইথন কনসোল থেকে আপনার কেবল এই কোডটি চালানো দরকার:

from math import sin, cos, radians

step = 3 # choose the proper value (e.g. meters or degrees) with reference to the CRS used
crv_angle = 45 # degrees

def segment(polyline):
    for x in range(0, len(polyline) - 1):
        first_point = polyline[x]
        second_point = polyline[x +1]
        seg = QgsGeometry.fromPolyline([first_point, second_point])
        tmp_azim = first_point.azimuth(second_point)
        len_feat = seg.length()
        parts = int(len_feat/step)
        real_step = len_feat/parts # this is the real step applied

        points = []
        current = 0
        up = True

        while current < len_feat:
            if up:
                round_angle = radians(90 - (tmp_azim - crv_angle))
                up = False
            else:
                round_angle = radians(90 - (tmp_azim + crv_angle))
                up = True
            first = seg.interpolate(current)
            coord_x, coord_y = (first.asPoint().x(), first.asPoint().y())
            p1=QgsPointV2(coord_x, coord_y)
            dist_x, dist_y = ((real_step*sin(rad_crv_angle))* cos(round_angle), (real_step*sin(rad_crv_angle)) * sin(round_angle))
            p2 = QgsPointV2(coord_x + dist_x, coord_y + dist_y)
            points.extend([p1, p2])
            current += real_step

        second = seg.interpolate(current + real_step)
        p3=QgsPointV2(second.asPoint().x(), second.asPoint().y())
        points.append(p3)

        circularRing = QgsCircularStringV2()
        circularRing.setPoints(points) # set points for circular rings
        fet = QgsFeature()
        fet.setGeometry(QgsGeometry(circularRing))
        prov.addFeatures([fet])

layer = iface.activeLayer() # load the input layer as you want
crs = layer.crs().toWkt()
rad_crv_angle = radians(crv_angle)

# Create the output layer
outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'wiggly_line' , 'memory')
prov = outLayer.dataProvider()
fields = layer.pendingFields()
prov.addAttributes(fields)
outLayer.updateFields()

for feat in layer.getFeatures():
    geom = feat.geometry()
    polyline = geom.asPolyline()
    segment(polyline)

# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(outLayer)

এবং এটি প্রত্যাশিত ফলাফলের সাথে একটি নতুন লাইন মেমরি স্তর তৈরি করবে:

এখানে চিত্র বর্ণনা লিখুন


কি দারুন! আমি এই সঙ্গে খেলা বন্ধ করতে পারবেন না, খুব চমত্কার। এর উপরে আউটপুট নিজেই বাফারের মতো আরও ক্রিয়াকলাপের জন্য ব্যবহার করা যেতে পারে। আপনাকে ধন্যবাদ @ এমগ্রি। একটি শেষ কথা, আমি মাঝে মাঝে ছোট ছোট বৃত্তগুলি শীর্ষে বা কাছাকাছি উপস্থিত দেখি। এটা কি এড়ানো যায়? নোড সরঞ্জাম দ্বারা এ জাতীয় বৃত্তের কেন্দ্র নোড মুছে ফেলে আমি তাদের সরিয়ে ফেলতে পারি (সুতরাং এটি কোনও বড় বিষয় নয়)।
কাজুহিতো

1
@ কাজুহিতো দয়া করে আমার সম্পাদিত কোডটি দেখুন। মনে হয় বিবেচনার সাথে কিছু ভুল হয়েছে এবং আমি আশা করি এটি এতক্ষণে ঠিক হয়ে গেছে। আমি বেশ কয়েকটি পরীক্ষা করেছিলাম এবং এটি ভালভাবে কাজ করছে বলে মনে হচ্ছে (কোডটি আরও বেশি পঠনযোগ্য)।
এমগ্রি

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

1
ধন্যবাদ, @ কাজুহিতো। আমি একটি নিখুঁত সমাধান না তৈরি করার জন্য দুঃখিত। তবে, আমি আশা করি আপনি এটি উপভোগ করবেন (অন্যথায়, আপনি আমাকে একটি নমুনা শেফফিলও প্রেরণ করতে পারেন এবং আমি সমস্যাটি সমাধান করার চেষ্টা করব)। আমি যদি আরও দক্ষ উপায় খুঁজে পাই তবে আমি এটি পোস্ট করব!
এমগ্রি

1
অনেক ধন্যবাদ @ এমগ্রি। আমি যদি চেনাশোনাগুলির উপস্থিতিতে কোনও স্বতন্ত্র প্যাটার্নটি পাই তবে আমি আপনাকে পুনরায় উত্পাদনযোগ্য উদাহরণ দিয়ে আপডেট করব। এটি এত উপভোগযোগ্য (এবং এর আউটপুটটি সুন্দর)!
কাজুহিতো

20

সংক্ষিপ্ত উত্তর: আপনি এটি একটি কাস্টম এসভিজি ব্যবহার করে পেতে পারেন। একজনের জন্য এই পোস্টের নীচে দেখুন।

দীর্ঘ উত্তর:

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

আপনি স্টাইল মার্কার লাইনের সাথে খেলতে পারেন। আপনার যা প্রয়োজন তা সহজেই কাছে আসার একটি উপায় রয়েছে এবং আরও কিছু প্রচেষ্টা সহ এটি সঠিকভাবে পাওয়া সম্ভব। এখানে চিত্র বর্ণনা লিখুন

এটি পেতে, আপনি দুটি চিহ্নিতকারী লাইন দিয়ে রেখাটি স্টাইল করবেন। প্রতিটি চিহ্নিতকারী লাইন একটি সরল চিহ্নিতকারী, অর্ধবৃত্ত দ্বারা তৈরি। প্রথমটি 180 দ্বারা আবর্তিত হয় Both উভয়ই স্বচ্ছতে সেট করা আছে।

মার্কার লাইনে আপনি তাদের একটিকে অফসেট হওয়ার নির্দেশ দেন যাতে দুটি চিহ্ন দুটি একে অপরের সামনে টানা না হয়, পাশাপাশি পাশাপাশি থাকে। আপনি অফেস্ট = 1/2 * ইন্টারভাল আকার ব্যবহার করলে আউটপুটটি সাইনোসয়েডাল বক্ররেখা হবে। আমি আপনাকে বিরতি আকার, অফসেট এবং প্রতীক মাপের সাথে খেলতে পরামর্শ দিই।

এই পদ্ধতির সাথে প্রধান সীমাবদ্ধতা হল অর্ধ বৃত্তের ব্যাস লাইন, যা মূল লাইনের সমান। যদি আপনার ব্যাকগ্রাউন্ড সাদা হয় (বা কোনও সরল রঙ), আপনি ব্যাকগ্রাউন্ডের রঙটি ব্যবহার করে একটি তৃতীয় সাধারণ লাইন যুক্ত করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

** সম্পাদনা করুন **

কেন্দ্র লাইন থেকে মুক্তি পাওয়ার জন্য আরেকটি বিকল্প হ'ল একটি নতুন এসভিজি প্রতীক তৈরি করা। আমি অর্ধ-বক্ররেখা পরিবর্তন করেছি, কেবল বৃত্তাকার অংশে বাস করছি। এটি কাজ করে, যদিও ১/২ উপবৃত্তটি আরও আকর্ষণীয় হতে পারে। স্ক্রিনশটটি প্রতীক আকার 10, অন্তর 4, অফসেট 2 ব্যবহার করে করা হয়েছিল।

এখানে চিত্র বর্ণনা লিখুন

অর্ধ_সার্কেল_লাইন.এসভিগিতে একটি ফাইলের নীচে কোডটি সংরক্ষণ করুন এবং নিশ্চিত করুন যে এসভিজি যাওয়ার পথটি সেট করা আছে QGIS // Settings / Options / System / SVG Paths

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="11.2889mm" height="11.2889mm"
 viewBox="0 0 32 32"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.2" baseProfile="tiny">
<title>Qt Svg Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >

<g fill="#ffffff" fill-opacity="0" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal" 
>
<path vector-effect="non-scaling-stroke" fill-rule="evenodd" d="M19.1181,16 C19.1181,16 19.1181,14.2779 17.7221,12.8819 16,12.8819 C14.2779,12.8819 12.8819,14.2779 12.8819,16"/>
</g>
</g>
</svg>

ভাল যুক্তি. বর্তমানে অবিচ্ছিন্ন "সেন্টার লাইন" নিয়ে লড়াই করা হচ্ছে ...: \
কাজুহিতো

আমার কাছ থেকেও +1। এরই মধ্যে, আমি একটি পাইকিজিআইএস সমাধানের জন্য চিন্তা করার চেষ্টা করছি। @ কাজুহিতো, দয়া করে আমাকে জানান যে এটি আপনার পক্ষে যথেষ্ট হবে বা আপনি যদি কোনও শারীরিক সমাধান পছন্দ করেন ।
এমগ্রি

@ এমগ্রি এই উত্তরটির সাথে আমার এখন একটি "চেইন" রয়েছে "তরঙ্গ" নয় (এটি সংশোধন করার চেষ্টা করছে)। একটি শারীরিক সমাধান আছে সত্যিই প্রশংসা করবে।
কাজুহিতো

জেজিএইচ সাদা লাইনের দ্বারা মাস্কিং ব্যতীত "সেন্টার লাইন" মুছে ফেলার (আপনার নীচের চিত্রটি) বাদ দেওয়ার কোনও সম্ভাবনা আছে কি? দেখে মনে হচ্ছে যেন খণ্ডিত।
কাজুহিতো

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