परत CRS को परिभाषित करना और PyQGIS में CRS संवाद से बचना?


16

एक मौजूदा शेपफाइल है, जिसे मैं जोड़ना चाहता हूं।

फिलहाल मेरा कोड ऐसा दिखता है:

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

यह ठीक काम करता है, लेकिन मैं कोड के भीतर सीआरएस को परिभाषित करना चाहता हूं। क्या यह संभव है? मुझे इस तरह के कुछ प्रश्न मिलते हैं: पायथन का उपयोग करके 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 पूछता है?
मुस्तफा उकर

सीआरएस संवाद दिखाई देता है!
रॉबर्टो मरज़ोची

gis.stackexchange.com/a/325796/77806 - संवाद प्रकट नहीं होगा, पुष्टि
पावेल

6

इस ब्लॉग पोस्ट और उत्तर दोनों के आधार पर मैं पाइकगिस में एक रेखापुंज परत के सीआरएस को कैसे निर्दिष्ट कर सकता हूं? , आप इस तरह से प्राप्त कर सकते हैं जो आप चाहते हैं:

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 (BTW, का उपयोग नहीं कर रहे हैं, तो आपको: P) नहीं करना चाहिए, इसके बजाय चर नाम "/ अनुमान / डिफ़ॉल्टबाहरौर" का उपयोग करें।


5

निम्नलिखित कोड आपको सीआरएस पॉपअप विंडो के बिना एक वेक्टर परत जोड़ने की अनुमति देनी चाहिए (कम से कम यह मेरे लिए प्रकट नहीं होता है):

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की प्राधिकरण आईडी के लिए दोनों मामलों में सीआरएस मान बदलें :

सीआरएस विकल्प


1
आपके उत्तर के लिए धन्यवाद! लेकिन मुख्य समस्या यह है कि जब मैं परत को लोड करता हूं तो एक संवाद दिखाई देता है जहां मैं सीआरएस चुन सकता हूं। क्या इसे छिपाना या अक्षम करना संभव है?
हिंन्नी १३

अपनी पोस्ट को संपादित किया, जब मैं कमांड चलाता हूं तो मुझे संवाद विंडो नहीं मिलती है। उम्मीद है कि आप भी नहीं करेंगे!
जोसेफ

2
सीआरएस विंडो केवल तभी दिखाई देती है जब सीआरएस कोड में सेट नहीं किया गया हो। जब तक आप इसे सेट करेंगे आप अच्छे होंगे।
ब्रिटिशसैट

@BritishSteel - उल्लेख करने के लिए धन्यवाद! मुझे नहीं पता था कि यह मामला था।
जोसेफ

3

महीनों बाद मुझे एक उपाय सूझा। आपको स्क्रिप्ट के पहले और अंत में दो लाइनें मिलानी चाहिए जो @Domokos Endre से है:

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

मेरे लिए कोई भी उपरोक्त समाधान काम नहीं करता है। शायद इसलिए कि मैं सीएसवी को वेक्टर लेयर के रूप में लोड कर रहा हूं, न कि किसी आकृति की फाइल के रूप में। एकमात्र तरीका है कि मैं इसे काम कर सकता हूं:

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

0

यह उत्तर बताता है कि पहली बार मेमोरी में फ़ाइल लोड करने के लिए उपयोग किए गए URL में सीआरएस को निर्दिष्ट करके इस संवाद से कैसे बचा जाए। इसलिए शेपफाइल पथ को सीधे पास करने के बजाय addVectorLayer(), QgsVectorLayerउपयुक्त URL से बनाएं और फिर कॉल करें 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.