回答:
はい、できます。通常、部分的に透明なバッファーをお勧めしますが、なぜこれを地図作成的に行うのかを理解しています。
これは遅くなる可能性があり、ラベルの移動先を手動で決定する必要がありますが、地図製作的に言えば、それは悪いことではありません!
これがスクリーンショットです...
ご覧のとおり、バッファはありません。下のラスターは影響を受けません。細い中間輪郭線を含めて、ELEV%50 <> 0の場合にのみ表示されるようにスタイルを設定しました
私はこれをQGIS 2.12で行いました...あなたの走行距離は以前のバージョンによって異なる場合があります。
ここでは、各等高線に「ELEV」フィールドがあると仮定しています。
等高線をセグメント化する
処理とGRASSアルゴリズムv.split.lengthを使用して、等長線を等長のセグメントに分割します。メートルを使用している場合、マップ単位でラベルのサイズに近い長さを選択する必要があります。ここでは200mを使用しました。
これにより、ファイルがはるかに大きくなります(スクリーンショットの機能カウントに注意してください)。
これを回避するには、スタイル設定したい等高線のみ(50または100メートルごと)を生成して、すべての中間等高線を処理しないようにすることができます。
このレイヤーに、showLabelという1桁の整数フィールドを追加します。デフォルトは0またはNULLです。
このフィールドが1に設定されているセグメントにのみ表示されるようにラベルを変更します。これをラベルテキスト式に使用します...
if ( "showlabel" is not null, "ELEV", "")
if(expression、true-value、false-value)はかなり新しいと思います。古いバージョンを使用している場合は、CASE-ELSEを使用できます
ラベルが表示されているセグメントを除き、固定長セグメントがすべて描画されるように線のスタイルを変更します。したがって、2つのルールでルールベースのレンダリングを使用します
Rule 1: "showLabel" is null
Black, 0% transparent
Rule 2: "showLabel" is not null
Any colour, 100% transparent
現在、デフォルトではすべての輪郭が表示されますが、ラベルは表示されません。
ラベルを表示するセグメントを手動で編集します
編集モードに入り、輪郭値を表示するセグメントを手動で選択showLabel
し、選択したフィーチャの値を1に設定します。あなたは使用することができますCtrl(Ubuntuの/ Winの上、選択+ Cmd+ Ctrl高速なものに複数選択セグメントに+ Mac上/クリックして?)まで。
これで、ラベルを表示したい輪郭を「クリップ」し、ギャップにラベルが表示されます。
この場合、ラベル設定は次のとおりです。
CRS: EPSG 27700 (Local UTM for UK, in meters)
Text size: 50 map units
Placement: Parallel, On Line
お役に立てば幸いです!
「ラベル設定」タブの「バッファ」オプションを使用します。(レイヤープロパティダイアログの古いラベルオプションではなく、ラベルボタンを使用します。)これは、あなたがしたいと思うように等高線を消しませんが、ラベルを読みやすくします。
現在のQGISの機能で最も近いのは、基になるグリッドに使用されるのと同じ標高値と配色に基づくテーブルからの色でハロー(または背景)効果を使用することです。もちろん、これは陰影起伏およびマップ内のハローの下にある他のすべてを考慮しません。ランダムカラーの例: いくつかのコードを使用して、グリッドカラーを反映する関数としてこれを書き換えることができます。
理論的には、カスタムラインパターンとラベルリピート+オフセットを使用できるはずです。残念ながら、ラベルオフセットの設定はありません。
最近同じ問題に遭遇した後、私はQGIS Pythonスクリプトを作成して、重い作業を実行しました。一部の(英国)テストデータ、Readme(ガイド)、および使用されるスタイルシートを含むスクリプトは、https://github.com/pjgeng/Contour-Labelsにあります。
要するに、スクリプトは、注釈付きの輪郭レイヤーと「ガイド」レイヤーという2つのベクターレイヤーを入力として使用します。後者は、目的のラベル位置で輪郭と交差するポリラインで構成されます。
次に、スクリプトは、輪郭間の距離と適用するラベルのインデックス輪郭間隔に基づいて機能し、ラベルポイントに回転値を追加し、最終的に元の輪郭レイヤーをクリップしてギャップを生成します。
ユーザーが同じ領域内で異なる間隔で等高線図を作成する必要がある場合(つまり、ガイドが変更されない場合)、このアプローチは特にうまく機能します。欠点は、スクリプトの終了後にラベルの位置を変更できないことです。このため、ユーザーはガイドラインを調整し、元の入力に対してスクリプトを再実行する必要があります。以前はラベルの周りのバッファーで多くの作業を行い、中断された効果を作成しましたが、これはベクターデータドリブンマップでは審美的に不快であることが判明しました。
残念ながら、この時点でこれ以上写真を追加してプロセスを文書化または説明することはできません。
PS:リポジトリで提供されるスタイルレイヤーを使用する場合、ユーザーは、ラベリングメニューで「回転」、「ラベルを表示」、「常に表示」のカスタムフィールドを「アクティブ化」する必要があります。QGISの一部のインストールでは、これらはスタイルシートから自動的に適用されます-これを引き起こす原因はまだわかりません。
QGISコンターラベルマスキング問題の別のソリューションを次に示します。ここでは、QGISのSpatialite機能(現在はQGIS 3.x)と、ラベル配置用のジオメトリジェネレーターを利用しています。
この非常に動的なソリューションにより、すべてのラベルテキストのサイズとラベルの位置をすぐに変更でき、PDFベクターのエクスポートにも耐えられます。
これを可能にするには、次の部品が必要です。
ルールベースのスタイリングを備えた「contours_with_labels」と呼ばれる仮想レイヤー:
ルール2:ELSE…単純な行
ルール1の条件付きラベルテキスト:
label = 1 THEN elev ELSE '' ENDの場合
make_line(start_point($ geometry)、end_point($ geometry))
属性(get_feature( 'settings'、 'variable'、 'contourlabel_size')、 'value')
最後に大事なことを言い忘れましたが、仮想レイヤーのSQLクエリを次に示します。
------------------------------------------------------------------------
-- 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)
それでおしまい。
これを可能にしてくれた熱狂的な人々に感謝します!
ESRIブログエントリ:http : //blogs.esri.com/esri/arcgis/2011/11/28/variable-depth-masking-contour-label-example/
等高線ラベルの可変深度マスキングには、3つのステップが含まれます。
1ラベルから注釈を作成、2フィーチャアウトラインマスクツールを使用してマスクを作成、3 [高度な描画オプション]> [マスキング設定]を使用してマスクがマスクするレイヤーを指定します。
ラベルをより完璧にするために、仮想レイヤーのSQLクエリを変更して、等高線と平行に走るスクラッチラインを考慮しました(以下の解決策を参照)。
そして、これが仮想レイヤーの新しいSQLです。
------------------------------------------------------------------------
-- 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)