Are you getting enough sleep?

いつも眠い.これが睡眠負債というやつか.

QGISのメモ集

まずは,下記をみてみよう。

GIS実習オープン教材とは · GIS実習オープン教材

Phthon 使うなら,下記も確認。

PyQGIS 開発者用 Cookbook — QGIS Documentation ドキュメント

CRS

いつも仕事しているひとは,JGD2000 / Japan Plane Rectangular CS ? です。
JGD2011 ではないことに注意。
メッシュを作成したら,微妙にずれているので何でかな?と思っていたら,CRSの違いでした。十分に注意しましょう。

点群をTINでメッシュにしてそれぞれの面積を求める

TINで補間するのではなくて,点を結んでTINメッシュを作成する方法です。

  1. GRASS の v.delaunay で作成する。特にオプションとかはないので簡単。
  2. 点とメッシュがずれてないか確認したほうがよいです。よくわかりませんが,ずれてるときがありました。Windowsからもってきたシェープファイルだったので,localeがよくなかったと思ってます。
  3. TINのレイヤを右クリック → 属性テーブルを開く(open Attribute Table),と選択します。
  4. ツールバーのフィールド計算機を開く(open Field calculator),を選択します。このとき,メッシュの連番がふられているのを確認します。
  5. Output field name にフィールド名を入力,Output field type を選択(今回はrealにした),Expression には $area を入力。
  6. OK をクリックすると,field が追加されます。

Voronoi分割

Vector - v.voronoi でできる。
Advanced Parameters はよくわかってない。

画像のエクスポート

よく忘れる。
Project の Import/Export から,Image,PDF,DXFが選択できます。
このとき,Resolution のdefault 96 dpi から,1.5倍の144 dpi にしておいたほうが,Keynoteにいれても綺麗かもしれません。

選択したポリゴンを別レイヤにしたい

Annotations Toolbar の (Select Features by Area or Single Click) で,選択する。
そのあと,レイヤの右クリックから Export で,(Save Selected Feature As ... )で保存する。

別レイヤのポリゴンと重なっている箇所を抽出したい

Vector selection の (Extract by location) を選択。
(Select by location) だと選択するだけなので注意。

intersect は,重なっているポリゴンが選択される。
自分はよくこれを使うのでメモ。他は使うときに調べてみよう。

ラスターをポリゴンと重なっている箇所を抽出したい

Raster - Extraction - Clip by Mask Layer を選択。
Clip by Extent もあるので注意。
検索してみると,上記2つはメニューでは別れておらず,ウィンドウがでてきて選択だったみたいです。
Optional になってますが,CRSは選択しておいたほうがいいのかな?という感じで選択してます。

ラスタデータの切り抜き - QGIS [いかたこのたこつぼ]

切り抜くときに選択するとエラーがでる

点群から対象範囲を指定して選択したいときに,対象範囲としたVectorがダメと言われるときがあります。
調べてみると,何かおかしくなっているからそうなるので,Collect すればよいというのをみつけました。
確かに,してみたら直ったのでメモしておきます。
Geometry Tools - Collect Geometries で別レイヤに修正されたのができます。

ラスタデータをXYZ形式に変換する

下記の通りですけど,ひとまずメモ。 プロセッシングツールボックス で gdal2xyz と検索します。

QGISでラスタデータをXYZ形式に変換する | Crackpot

ポリゴンをつくりたい

鉛筆マークの編集モードを忘れないこと。

QGISでポリゴンを作成して形状を修正する方法:無料でGISを使ってみる - LL.me

asc ファイルの座標

asc の xllcorner と yllcorner は左下のセル座標です。
0.5mDEMをつかっているので,cellsize は0.5と記載されています。 上方向,右方向に大きくなります。いつも通りのXY座標ですね。

ArcGISと一緒です。

ラスター → ASCII (Raster to ASCII) (変換)—ArcGIS Pro | ドキュメント

QGIS Export Raster to asc - Tuflow

あるカテゴリ値だけExportする

ラインの頂点を抽出してポリゴンにする

ベクタ → ジオメトリツール → 頂点の抽出 をする。
座標が無いので,フィールド計算機で,"$x" と "$y" でフィールドを追加する。もともとのCRSなら特に計算不要。
これをCSVで出力。
ファイルを確認すると,ラインごとに連番となっている。
ラインが閉合しているかどうかのフィールドがある。
ポリゴンにしたいので,"YES" ではないラインを,連番をひとつ増やして連番0の値を持ってくる。

QGISでラインをポイントに変換してxy座標を取り出す #GIS - Qiita

ポリゴンにする方法は,検索するといくつかあるが,今回は下記を参考にプログラムを作成した。
下記の「WKTからレイヤ」を参考に,POLYGONの座標,レイヤ名を変更して,3〜10行目を必要数出力する。
なお,epsgはCRS,そのつぎがレイヤ名,"memory"はレイヤ出力の種類。
これをQGISPythonコンソールで実行する。
たくさんレイヤが作成されたら,結合して1つのシェープファイルに保存する。
ベクタ → データ管理ツール → ベクタレイヤをマージ

21. PyQGISチートシート — QGIS Documentation ドキュメント

3. レイヤをロードする — QGIS Documentation ドキュメント

そのほか

Visualising WKT geometry string in QGIS - Geographic Information Systems Stack Exchange

gis - How to use WKT to draw polygon in qgis? - Stack Overflow

QGISでテキストからポイント・ライン・ポリゴンを読み込む | Crackpot

多数のポリゴンそれぞれでclipする

点密度を数えたくて,調べてみた。

import os
import processing

def clipping(input,overlay,output):
    processing.run("native:clip",{
    "INPUT":input,
    "OVERLAY":overlay,
    "OUTPUT":output
    })

input = 'D:/AAA/BBB/Ex.shp'
overlay_path = 'D:/AAA/BBB/CCC/'
output_path = 'D:/AAA/BBB/'
files = os.listdir(overlay_path)
for f in files:
    if f.endswith(".shp"):
        name = f.split(".")[0]
        clipping(input, overlay_path+name+".shp",  output_path+"gp_"+name+".shp")

参考にしたところが,listdirs になっててちょっと悩みました。
QGIS pythonコンソール使用法など[備忘録] #Python - Qiita

上記がいまひとつだったので,もう少し考えました。
メニューのベクタ解析にあるものを,コマンドラインで使ってみることにしました。
フォルダ内のファイル名取得などは,上記を参考にしています。
上記がclipping,下記は count points in polygon なので,結果が異なることに注意が必要です。

Count points in polygon (weighted)

overlay_path='D:/AAA/BBB/CCC/'
output_path='D:/AAA/BBB/'

files=os.listdir(overlay_path)
for f in files:
    if f.endswith(".shp"):
        name=f.split(".")[0]
    processing.run("native:countpointsinpolygon", {
        'POLYGONS':overlay_path+name+".shp",
        'POINTS':'D:/AAA/CCC/ZZZ.shp',
        'WEIGHT':'',
        'CLASSFIELD':'',
        'FIELD':'NUMPOINTS',
        'OUTPUT':output_path+"p_"+name+".shp"}
)

QGISはgeopackageを推してるので,gpkgも記載。

files=os.listdir(overlay_path)
for f in files:
    if f.endswith(".gpkg"):
        name=f.split(".")[0]
    processing.run("native:countpointsinpolygon", {
        'POLYGONS':overlay_path+name+".gpkg",
        'POINTS':'D:/AAA/CCC/ZZZ.shp',
        'WEIGHT':'',
        'CLASSFIELD':'',
        'FIELD':'NUMPOINTS',
        'OUTPUT':output_path+"p_"+name+".gpkg"}
)

ユニークIDを作成する

@row_number をつかいました。

ユニークID(地物毎に固有の値)を作成する方法:QGISを使ってみる - LL.me

結合レイヤの空間インデックスが存在しません。処理が極端に悪化します。

「結合レイヤの空間インデックスが存在しません。処理が極端に悪化します。」は、メニューの「ベクタ - データ管理 - 空間インデックスを作成」で対処します。

ジオリファレンス

座標をもたない空中写真を重ねたいときに行ないます。
現在のバージョンだと,ラスタのメニュー内に,ジオリファレンサ があります。古いと別の場所にあると記載されていることがあるので,注意してください。

QGIS基礎:座標を持たない地図画像に座標を与える | SKラボ.net

【実習編】~画像を地図に重ねたい:ジオリファレンス~|はとば