উইগলি লাইন আঁকার জন্য কি কিউজিআইএস ফাংশন বা প্লাগইন রয়েছে?
আমি কিছু তরঙ্গ ম্যানুয়ালি আঁকতে স্প্লাইন সরঞ্জামটি ব্যবহার করেছি, তবে এটি সময় সাপেক্ষ। যদি সম্ভব হয় তবে আমি এর মতো কিছু আঁকতে চাই:
Inkscape Function Plotter
( sin(x)
বক্র)।
উইগলি লাইন আঁকার জন্য কি কিউজিআইএস ফাংশন বা প্লাগইন রয়েছে?
আমি কিছু তরঙ্গ ম্যানুয়ালি আঁকতে স্প্লাইন সরঞ্জামটি ব্যবহার করেছি, তবে এটি সময় সাপেক্ষ। যদি সম্ভব হয় তবে আমি এর মতো কিছু আঁকতে চাই:
Inkscape Function Plotter
( sin(x)
বক্র)।
উত্তর:
আমি পাইকিজিআইএস ব্যবহার করে একটি সমাধান প্রস্তাব করছি। এটি লাইনস্ট্রিং এবং মাল্টলাইনস্ট্রিং স্তরগুলির জন্য উভয়ই কাজ করা উচিত।
এই সমাধানটি অর্ধবৃত্তাকার রিং তৈরির উপর ভিত্তি করে, সুতরাং আপনাকে ব্যাসের জন্য একটি মান নির্ধারণ করতে হবে (অর্থাত 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)
এবং এটি প্রত্যাশিত ফলাফলের সাথে একটি নতুন লাইন মেমরি স্তর তৈরি করবে:
সংক্ষিপ্ত উত্তর: আপনি এটি একটি কাস্টম এসভিজি ব্যবহার করে পেতে পারেন। একজনের জন্য এই পোস্টের নীচে দেখুন।
দীর্ঘ উত্তর:
আমি বিশ্বাস করি লাইনের জ্যামিতি সংশোধন করার চেয়ে প্রতিনিধিত্ব করা ভাল 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>
Pen style
থেকে কোন পেন :)