PyQGISでレイヤーCRSを定義し、CRSダイアログを回避しますか?


16

追加したい既存のシェープファイルがあります。

現在、私のコードは次のようになっています。

self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")

それはうまくいきますが、コード内でcrsを定義したいと思います。出来ますか?私はこのような似たような質問を見つけました:Pythonを使用してQGIS 2.4でプログラムでCRSを選択してください

しかし、とにかく動作しません。

回答:


8

私はこの方法で同様の問題を解決します:

from qgis.core import *
from qgis.gui import *

layer = QgsVectorLayer(self.shpFilePath, "Track", "ogr")
crs = layer.crs()
crs.createFromId(4326)
layer.setCrs(crs)
QgsMapLayerRegistry.instance().addMapLayer(layer)

4
しかし、それでもダイアログでCRSを尋ねられますか?
ムスタファウサー

CRSダイアログが表示されます!
ロベルトマルゾッキ

gis.stackexchange.com/a/325796/77806-ダイアログは表示されず、確認されました
Pavel Pereverzev

6

このブログ投稿と回答への両方に基づいてはどうすればpyqgisでのラスタレイヤのCRSを指定することができますか?、この方法で目的を達成できます。

settings = QSettings()
# Take the "CRS for new layers" config, overwrite it while loading layers and...
oldProjValue = settings.value( "/Projections/defaultBehavior", "prompt", type=str )
settings.setValue( "/Projections/defaultBehavior", "useProject" )

# YOUR CODE TO LOAD THE LAYER GOES HERE

# ... then set the "CRS for new layers" back
settings.setValue( "/Projections/defaultBehavior", oldProjValue )

注:まだQGIS v2.xを使用している場合(ところで、:Pは使用しないでください)、代わりに変数名「/ Projections / defaultBehaviour」を使用してください。


5

次のコードを使用すると、CRSポップアップウィンドウを表示せずにベクターレイヤーを追加できます(少なくとも、私には表示されません)。

from qgis import *
from qgis.utils import *

#replace "shapefile_path" with your layer's path; replace "Layer_name" with whatever name you want to give the layer in the TOC
qgis.utils.iface.addVectorLayer("shapefile_path", "Layer_name", "ogr")

#Use loaded layer as active layer to set the CRS
myLayer = qgis.utils.iface.activeLayer()
myLayer.setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId))

#Sets canvas CRS
my_crs = core.QgsCoordinateReferenceSystem(4326, core.QgsCoordinateReferenceSystem.EpsgCrsId)
iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)

4326両方の場合のCRS値を、画像に示すように、選択した機関IDに変更するだけです。

CRSオプション


1
ご回答有難うございます!しかし、主な問題は、レイヤーをロードすると、crsを選択できるダイアログが表示されることです。非表示または無効にすることはできますか?
Hinne123

投稿を編集しました。コマンドを実行すると、ダイアログウィンドウが表示されません。うまくいけば、あなたもどちらもしないでしょう!
ジョセフ

2
CRSウィンドウは、コードにCRSが設定されていない場合にのみ表示されます。あなたがそれを設定する限り、あなたは良いでしょう。
BritishSteel

@BritishSteel-それについて言及してくれてありがとう!私はそれが事実だとは知りませんでした。
ジョセフ

3

数ヶ月後、私は解決策を見つけました。@Domokos Endreからのスクリプトの前後に2行追加する必要があります。

import os

iface.mainWindow().blockSignals(True)

layer = QgsVectorLayer(path, "My Layer",  "ogr")
crs = layer.crs()
crs.createFromId(32637)  # Whatever CRS you want
layer.setCrs(crs)

QgsProject.instance().addMapLayer(layer)
iface.mainWindow().blockSignals(False)

1

私にとっては、上記のソリューションはいずれも機能しません。たぶん、csvをシェイプファイルではなくベクターレイヤーとして読み込んでいるからでしょう。私がそれを機能させることができる唯一の方法は:

crs = QgsCoordinateReferenceSystem(2180)
self.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)
vlayer = QgsVectorLayer(filePath, "layer name", "ogr")
vlayer.setCrs(QgsCoordinateReferenceSystem(2180))

0

この回答では、最初にファイルをメモリにロードするために使用されるURLでCRSを指定することにより、このダイアログを回避する方法について説明します。したがって、Shapefileパスを直接渡すのではなく、適切なURL addVectorLayer()でを作成しQgsVectorLayerてから呼び出しますaddMapLayer()

import urlparse
import urllib

baseuri = urlparse.urljoin('file:', urllib.pathname2url(self.shpFilePath))
uri = baseuri + "?crs=EPSG:4326"
vlayer = QgsVectorLayer(uri, "result", "memory")
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.