কোনও উচ্চতা লেবেলের নীচে একটি কনট্যুর লাইনে বাধা দেওয়ার কোনও উপায় আছে কি?
কোনও উচ্চতা লেবেলের নীচে একটি কনট্যুর লাইনে বাধা দেওয়ার কোনও উপায় আছে কি?
উত্তর:
হ্যাঁ, করণীয়। সাধারণত আমি আংশিক স্বচ্ছ বাফারের পরামর্শ দিই, তবে কেন আপনি এই কার্টোগ্রাফিকভাবে করতে চান তা আমি দেখতে পাচ্ছি।
এটি ধীর হতে পারে এবং আপনি লেবেলগুলি কোথায় যেতে চান সে সম্পর্কে আপনাকে ম্যানুয়ালি সিদ্ধান্ত নেওয়া দরকার - তবে কার্টোগ্রাফিকভাবে বলতে গেলে, এটি কোনও খারাপ জিনিস নয়!
এখানে একটি স্ক্রিনশট ...
আপনি দেখতে পাচ্ছেন, কোনও বাফার নেই। নীচে রাস্টার প্রভাবিত হয় না। আমি পাতলা অন্তর্বর্তী কনট্যুর লাইনগুলি অন্তর্ভুক্ত করেছি এবং সেগুলি স্টাইল করেছি যাতে তারা কেবল তখনই প্রদর্শিত হয় যখন ELEV% 50 <> 0 হয়
আমি কিউজিআইএস ২.১২ এ এটি করেছি ... আপনার মাইলেজটি পূর্ববর্তী সংস্করণগুলির সাথে পৃথক হতে পারে।
আমি ধরে নিলাম এখানে প্রতিটি কনট্যুর লাইনে আপনার একটি "ELEV" ক্ষেত্র রয়েছে।
কনট্যুর লাইনগুলি সেগমেন্টাইজ করুন
আপনার রূপগুলি সমান দৈর্ঘ্যের অংশগুলিতে বিভক্ত করতে প্রসেসিং এবং জিআরএসএস অ্যালগরিদম v.split.length ব্যবহার করুন । আপনি এমন একটি দৈর্ঘ্য চয়ন করতে হবে যা মানচিত্র ইউনিটগুলিতে আপনার লেবেলের আকারের কাছাকাছি হবে, ধরে নিবেন আপনি মিটার ব্যবহার করছেন। এখানে আমি 200 মি।
এটি আপনার ফাইলটিকে আরও অনেক বড় করে তুলবে বলে খুব সাবধানতা অবলম্বন করুন (স্ক্রিনশটের বৈশিষ্ট্যটি গণনা করুন)।
এটিকে পেতে, আপনি অন্তর্বর্তী সমস্ত কনট্যুর লাইন প্রক্রিয়াজাতকরণ এড়াতে কেবল স্টাইল করতে চান কেবল সেই কনট্যুর লাইনগুলি তৈরি করতে চাইতে পারেন (যেমন প্রতি 50 বা 100 মিটার)।
এই স্তরে, শোএলবেল নামে একটি 1 ডিজিটের পূর্ণসংখ্যার ক্ষেত্র যুক্ত করুন । 0 বা NULL এ ডিফল্ট।
এই ক্ষেত্রটি ১ এ সেট করা আছে কেবলমাত্র সেই বিভাগে প্রদর্শিত লেবেলটি পরিবর্তন করুন this
if ( "showlabel" is not null, "ELEV", "")
আমি মনে করি যদি (এক্সপ্রেশন, সত্য-মান, মিথ্যা-মান) মোটামুটি নতুন হয়; যদি কোনও পুরানো সংস্করণ ব্যবহার করা হয় তবে আপনি CASE-ELSE ব্যবহার করতে পারেন
লাইন শৈলীর পরিবর্তন করুন যাতে লেবেল প্রদর্শিত হয় সেই অংশগুলি বাদে স্থির দৈর্ঘ্যের খণ্ডগুলি সমস্ত আঁকুন । সুতরাং দুটি নিয়মের সাথে বিধি-ভিত্তিক রেন্ডারিং ব্যবহার করুন
Rule 1: "showLabel" is null
Black, 0% transparent
Rule 2: "showLabel" is not null
Any colour, 100% transparent
এখন, সমস্ত রূপটি ডিফল্টরূপে প্রদর্শিত হবে, তবে কোনও লেবেল নেই।
ম্যানুয়ালি বিভাগগুলি সম্পাদনা করুন যেখানে আপনি লেবেল দেখাতে চান
সম্পাদনা মোডে যান এবং ম্যানুয়ালি সেগমেন্টগুলি নির্বাচন করুন যেখানে আপনি কনট্যুর মানগুলি প্রদর্শন করতে চান এবং showLabel
নির্বাচিত বৈশিষ্ট্যগুলির জন্য 1 এর মান নির্ধারণ করুন । জিনিসগুলিকে গতি বাড়ানোর জন্য মাল্টি-সিলেক্ট বিভাগগুলিতে আপনি Ctrl+ সিলেক্ট (উবুন্টু / উইনে, Cmd+ Ctrl+ ক্লিক / ম্যাক?) ব্যবহার করতে পারেন ।
আপনি এখন যেখানে লেবেলগুলি প্রদর্শন করতে চান সেই কনট্যুরগুলি এখন 'ক্লিপ' করা উচিত এবং লেবেল ফাঁক ফাঁকে প্রদর্শিত হবে।
এই ক্ষেত্রে, আমার লেবেল সেটিংসটি ছিল:
CRS: EPSG 27700 (Local UTM for UK, in meters)
Text size: 50 map units
Placement: Parallel, On Line
আশা করি এইটি কাজ করবে!
আমি "লেবেল সেটিং" ট্যাবে "বাফার" বিকল্পটি ব্যবহার করি। (লেবেল বোতামটি ব্যবহার করে, স্তর বৈশিষ্ট্যের কথোপকথনে পুরাতন লেবেলগুলির বিকল্প নয়)) এটি কনট্যুর লাইনটি মুছে ফেলবে না, যেমনটি আমি ধারণা করি যে আপনি করতে চাইছেন তবে এটি লেবেলটিকে সুস্পষ্ট করে তুলবে।
আমি মনে করি এটি বর্তমান কিউজিআইএস সক্ষমতার সাথে সবচেয়ে নিকটতম হ'ল হল (বা ব্যাকগ্রাউন্ড) প্রভাবটি টেবিল থেকে উত্সাহিত রঙের সাথে ব্যবহার করা যা অন্তর্নিহিত গ্রিডের জন্য ব্যবহৃত উচ্চতা মান এবং রঙের স্কিমের উপর ভিত্তি করে তৈরি হবে। অবশ্যই এটি হিলশ্যাড এবং মানচিত্রের হলোর নীচে থাকা সমস্ত কিছু বিবেচনায় নেবে না । এলোমেলো রঙের উদাহরণ: কিছুটা কোডের সাথে গ্রিডের রঙ প্রতিফলিত করার জন্য এটি ফাংশন হিসাবে আবার লেখা যেতে পারে।
তত্ত্ব অনুসারে কাস্টম লাইন প্যাটার্ন এবং লেবেল পুনরাবৃত্তি + অফসেট ব্যবহার করা উচিত । দুর্ভাগ্যক্রমে কোনও লেবেল অফসেট সেটিং নেই।
একই সমস্যায় পড়ার পরে সম্প্রতি ভারী উত্তোলন চালানোর জন্য আমি কিউজিআইএস পাইথন স্ক্রিপ্ট একসাথে রেখেছি। কিছু (ইউকে) পরীক্ষার ডেটা, রেডমি (গাইড) এবং ব্যবহৃত স্টাইল শীট সহ স্ক্রিপ্টটি https://github.com/pjgeng/Contour- Labels এ পাওয়া যাবে
সংক্ষেপে স্ক্রিপ্টটি দুটি ভেক্টর স্তর ইনপুট হিসাবে ব্যবহার করে - এনোটেটেড কনট্যুর স্তর এবং একটি "গাইড" স্তর। পরেরটিগুলিতে পছন্দসই লেবেল অবস্থানগুলিতে রূপককে ছেদ করে পলাইনগুলি সমন্বিত।
স্ক্রিপ্টটি সূচিপত্র এবং সূচক কনট্যুর ব্যবধানের মধ্যবর্তী দূরত্বের ভিত্তিতে কাজ করে যা লেবেল প্রয়োগ করতে পারে, লেবেল পয়েন্টগুলিতে একটি ঘূর্ণন মান যুক্ত করে এবং অবশেষে ফাঁকগুলি তৈরি করতে মূল কনট্যুর স্তরটি ক্লিপ করে।
ব্যবহারকারীর একই ক্ষেত্রের বিভিন্ন ব্যবধানে (যেমন গাইড পরিবর্তন হয় না) কনট্যুর মানচিত্র তৈরি করা উচিত বিশেষত কার্যকর হয়। একটি ত্রুটি হ'ল একবার স্ক্রিপ্ট শেষ হয়ে গেলে লেবেল অবস্থান পরিবর্তন করতে না পারা। এর জন্য ব্যবহারকারীকে গাইড লাইনগুলি সামঞ্জস্য করতে হবে এবং মূল ইনপুটটির বিপরীতে স্ক্রিপ্টটি পুনরায় চালু করতে হবে। আমি এর আগে বাধার সাথে বাফারগুলির সাথে বাধা প্রভাব তৈরি করতে প্রচুর লেবেল ব্যবহার করেছি, তবে এটি ভেক্টর ডেটাচালিত মানচিত্রে নান্দনিকভাবে অপ্রীতিকর হতে দেখা গেল।
দুর্ভাগ্যক্রমে আমি প্রক্রিয়াটি ডকুমেন্ট করতে বা চিত্রিত করতে এই সময়ে আর কোনও ছবি যুক্ত করতে পারি না can't
PS: রিপোজিটরিতে প্রদত্ত স্টাইল স্তরগুলি ব্যবহার করে ব্যবহারকারীরা লেবেলিং মেনুতে "রোটেশন", "লেবেল দেখান" এবং "সর্বদা দেখান" এর জন্য কাস্টম ক্ষেত্রগুলিকে "সক্রিয়" করতে হতে পারে। কিউজিআইএস-এর কয়েকটি স্থাপনায় স্টাইলশীট থেকে স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয় - এটি এখনও কী কারণে ঘটেছে তা আমি খুঁজে পাইনি।
কিউজিআইএস কনট্যুর-লেবেল-মাস্কিং সমস্যার জন্য এখানে আরও একটি সমাধান রয়েছে, যেখানে আমি লেবিলে অবস্থান নির্ধারণের জন্য জ্যামিতি জেনারেটরের সাথে কিউজিআইএসের স্প্যাটিয়ালাইট কার্যকারিতা (বর্তমানে কিউজিআইএস 3.x) উপার্জন করি।
এই খুব গতিশীল সমাধানটি আমাদের সমস্ত লেবেল পাঠ্যের মাপ এবং লেবেল অবস্থান অবিলম্বে পরিবর্তন করতে দেয় এবং এমনকি একটি পিডিএফ ভেক্টর রফতানি থেকে বেঁচে থাকে!
এটি সম্ভব করার জন্য আমাদের নিম্নলিখিত অংশগুলির প্রয়োজন:
নিয়ম ভিত্তিক স্টাইলিং সহ একটি "ভার্চুয়াল_বিহীন_লবেলস" নামে একটি ভার্চুয়াল স্তর:
বিধি 2: ELSE… সরল রেখা
এবং বিধি 1 এর জন্য শর্তসাপেক্ষ লেবেল পাঠ্য:
কেস WHEN লেবেল = 1 তারপর ELSE '' শেষ করুন
Make_line (start_Point (point জ্যামিতি), শেষ_পয়েন্ট ($ জ্যামিতি))
বৈশিষ্ট্য (get_feature ('সেটিংস', 'ভেরিয়েবল', 'কনট্যুরবেল_সাইজ'), 'মান')
এবং সর্বশেষে তবে সর্বনিম্ন নয়, এখানে ভার্চুয়াল স্তরটির জন্য এসকিউএল কোয়েরি রয়েছে:
------------------------------------------------------------------------
-- select all contour lines that do not intersect any scratch lines
------------------------------------------------------------------------
select c.geometry,c.elev,0 as label
from contours c,
(select st_union(geometry) as geom from scratch_lines) as scr
where not st_intersects(c.geometry,scr.geom)
------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all scratch lines (bufferwidth = length(elevation_text) * txtsize/3),
-- get st_difference between contour lines and buffers
-- and set attribute "label" to 0
--------------------------------------------------------------------------------------------------------
select st_difference(c.geometry,buf.geom) as geom,c.elev,0 as label
from
(select c.fid,st_union(st_buffer(scr.geometry,length(c.elev) * txtsize.value / 3)) as geom
from scratch_lines scr,
contours c,
(select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(scr.geometry,c.geometry)
group by c.fid) as buf,
contours c
where c.fid = buf.fid
group by c.fid
--------------------------------------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all scratch lines (bufferwidth = length(elevation_text) * txtsize/3),
-- get st_intersection between contour lines and buffers
-- and set attribute "label" to 1
--------------------------------------------------------------------------------------------------------
select st_intersection(st_buffer(scr.geometry,length(c.elev) * txtsize.value / 3),c.geometry) as geom,c.elev,1 as label
from scratch_lines scr,
contours c,
(select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(c.geometry,scr.geometry)
এটাই.
এই সমস্ত উত্সাহী মানুষ যারা এই সম্ভব করে তোলে তাদের অনেক ধন্যবাদ!
আপনি এই থ্রেড মনে আছে মার্টিন? আপনার সমস্যার সমাধানের কাছাকাছি যাওয়ার একমাত্র উপায়টি হ'ল হ'ল একটি ক্লিপড কনট্যুর স্তর আপনার কনট্যুর স্তরটি ওভারলে করা, লেবেলিংয়ের জন্য এটি ব্যবহার করুন এবং লাইনের রঙটি নিরপেক্ষ কিছুতে পরিবর্তন করুন যা লেবেলের নীচে কনট্যুরগুলি মাস্ক করবে, কেউ খুব অনুপ্রবেশকারী না হয়ে আশাবাদী। এন
পরে যুক্ত করা হয়েছে: এটি সম্ভবত এই থ্রেডটিও দেখার উপযুক্ত, দ্বিতীয় উত্তর। সম্ভবত কনট্যুর লাইনগুলি ভাঙ্গা একটি উত্তর হতে পারে, সম্ভবত বাছা স্তরটি ব্যবহার করে কনট্যুরগুলি ক্লিপ করতে ব্যবহৃত হয়?
ইএসআরআই ব্লগ এন্ট্রি: http://blogs.esri.com/esri/arcgis/2011/11/28/variable-depth-masking-contour-label-example/
কনট্যুর লেবেলের জন্য পরিবর্তনশীল-গভীরতার মুখোশটি তিনটি পদক্ষেপ জড়িত:
1 লেবেলগুলি থেকে টীকা তৈরি করা, মুখোশ তৈরির জন্য বৈশিষ্ট্যরেখার মুখোশ সরঞ্জামটি 2 ব্যবহার করে এবং অ্যাডভান্সড ড্রয়িং বিকল্পগুলি> মাস্কিং সেটিংসকে 3 স্তরগুলি মুখোশগুলি আটকানো হবে তা নির্দিষ্ট করে using
লেবেলগুলিকে আরও নিখুঁত করতে, আমি কনট্যুর লাইনের সমান্তরালে চলমান স্ক্র্যাচ লাইনগুলিকে সম্মান করতে ভার্চুয়াল স্তরটির এসকিউএল কোয়েরি পরিবর্তন করেছি (নীচের সমাধান দেখুন):
এবং ভার্চুয়াল স্তরটির জন্য এখানে নতুন এসকিউএল রয়েছে:
------------------------------------------------------------------------
-- select all contour lines that do not intersect any scratch lines
------------------------------------------------------------------------
select c.geometry,c.elev,0 as label
from contours c,
(select st_union(geometry) as geom from scratch_lines) as scr
where not st_intersects(c.geometry,scr.geom)
------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all intersection points (bufferwidth = length(elevation_text) * txtsize/2.5),
-- get st_difference between contour lines and buffers
-- and set attribute "label" to 0
--------------------------------------------------------------------------------------------------------
select st_difference(c.geometry,buf.geom) as geom,c.elev,0 as label
from contours c,
(select c.fid,st_union(st_buffer(st_intersection(c.geometry,scr.geometry),length(c.elev) * txtsize.value / 3)) as geom
from contours c, scratch_lines scr, (select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(c.geometry,scr.geometry)
group by c.fid) as buf
where c.fid = buf.fid
--------------------------------------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all intersection points (bufferwidth = length(elevation_text) * txtsize/2.5),
-- get st_intersection between contour lines and buffers
-- and set attribute "label" to 1
--------------------------------------------------------------------------------------------------------
select st_intersection(c.geometry,st_buffer(st_intersection(c.geometry,scr.geometry),length(c.elev) * txtsize.value / 3)) as geom,c.elev,1 as label
from contours c,
scratch_lines scr,
(select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(c.geometry,scr.geometry)