追加したい既存のシェープファイルがあります。
現在、私のコードは次のようになっています。
self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")
それはうまくいきますが、コード内でcrsを定義したいと思います。出来ますか?私はこのような似たような質問を見つけました:Pythonを使用してQGIS 2.4でプログラムでCRSを選択してください
しかし、とにかく動作しません。
追加したい既存のシェープファイルがあります。
現在、私のコードは次のようになっています。
self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")
それはうまくいきますが、コード内でcrsを定義したいと思います。出来ますか?私はこのような似たような質問を見つけました:Pythonを使用してQGIS 2.4でプログラムでCRSを選択してください
しかし、とにかく動作しません。
回答:
私はこの方法で同様の問題を解決します:
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)
このブログ投稿と回答への両方に基づいてはどうすれば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」を使用してください。
次のコードを使用すると、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に変更するだけです。
数ヶ月後、私は解決策を見つけました。@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)
私にとっては、上記のソリューションはいずれも機能しません。たぶん、csvをシェイプファイルではなくベクターレイヤーとして読み込んでいるからでしょう。私がそれを機能させることができる唯一の方法は:
crs = QgsCoordinateReferenceSystem(2180)
self.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)
vlayer = QgsVectorLayer(filePath, "layer name", "ogr")
vlayer.setCrs(QgsCoordinateReferenceSystem(2180))
この回答では、最初にファイルをメモリにロードするために使用される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)