PyQGIS का उपयोग करके बड़ी संख्या में नक्शे बनाना?


10

मुझे प्रजातियों के वितरण मानचित्रों की एक बड़ी संख्या (सैकड़ों) बनानी होगी। मेरे पास एक आकृति है जिसमें प्रत्येक प्रजाति के लिए वितरण शामिल हैं, और प्रत्येक के लिए, मैं एक छवि (jpg, png या अन्यथा) के रूप में एक मानचित्र प्राप्त करना चाहता हूं जिसमें संबंधित प्रजातियों का नाम शामिल है, किंवदंती (क्षेत्रों को अलग करने के लिए) वार्षिक वितरण, प्रजनन, गैर-प्रजनन, आदि ...)।

मैं ऐसा करने के लिए QGIS का उपयोग करना चाहूंगा।


1
क्या आप नक्शे की बारीकियों के बारे में कुछ और बता सकते हैं? उदाहरण के लिए, क्या आप चाहते हैं कि ये सभी नक्शे एक ही क्षेत्र, जैसे कि एक विशिष्ट महाद्वीप या देश को दिखाए, या क्या आप चाहते हैं कि मानचित्र गतिशील रूप से बदल जाए? इसके अलावा, क्या आप चाहते हैं कि सभी रेंज एक मैप पर सबटाइप करें या वे कई मैप्स पर हैं? इन उत्तरों के आधार पर, आपकी समस्या काफी सरल हो सकती है या इसके लिए परिष्कृत दृष्टिकोण की थोड़ी अधिक आवश्यकता हो सकती है। तलाश शुरू करने के लिए एक अच्छी जगह जीआईएस के लिए एटलस प्लगइन है, या यदि आपके पास आर्कगिस 10 या अधिक उपलब्ध है, तो ईएसआरआई की मैपबुक भी मदद करेगी।
जे ग्वारनेरी

1
विवरण की कमी के लिए क्षमा करें। सभी मानचित्रों के लिए हां, यह एक ही क्षेत्र (यूरोप) होगा। मेरे पास सभी प्रजातियों के साथ एक आकृति है, और विशेषताओं में, इसी वितरण। यह आकार-प्रकार, मैं इसे आसानी से विभिन्न आकार-प्रकार (प्रत्येक प्रजाति के लिए) में विभाजित कर सकता हूं। अंत में, मैं प्रत्येक प्रजाति के लिए एक चित्र, हर समय, बिल्कुल एक ही क्षेत्र (यूरोप), एक ही रंग (उदाहरण के लिए, गहरे हरे रंग में वार्षिक वितरण, हल्के हरे रंग में प्रजनन, गैर-प्रजनन) में लेना चाहूंगा। नीला, आदि ...), एक ही किंवदंती है, और विशेष के नाम के शीर्षक के रूप में।
Onesime

मुझे लगता है कि आपको प्रत्येक नक्शे को बनाने के लिए प्रत्येक चरण की योजना बनाने की आवश्यकता है, फिर Pyon में चयन और मानचित्र निर्यात को कोड करें। मुझे पता है कि यह आर्कजीस पायथन में आसानी से किया जा सकता है, लेकिन मैं बहुत मार्गदर्शन देने के लिए क्यूजीआईएस पायथन इंटरफ़ेस के बारे में पर्याप्त नहीं जानता। हालाँकि, मुझे पूरा विश्वास है कि आप एक आकार-प्रकार के साथ यह काम कर सकते हैं।
Jay Guarneri

मैंने पायथन प्लगइन का उपयोग करते हुए QGIS के साथ कुछ ऐसा ही किया है। मेरे मामले में, मेरी परतें पोस्टजीआईएस में संग्रहीत की गई थीं, लेकिन मुझे लगता है कि आप शेपफाइल का उपयोग करके कुछ ऐसा कर सकते हैं। मुझे अपना कोड साझा करने में खुशी हो रही है। मुझे निजी संदेश भेजो।
ब्रायन एडमंड

1
क्या आप हमारे साथ खेलने के लिए अपने डेटा का एक नमूना अपलोड कर सकते हैं।
नाथन डब्ल्यू

जवाबों:


4

मेरे पास एक समान आवश्यकता थी और सभी प्रजातियों के लिए बिंदु इलाकों के साथ आकृति के आधार पर मैप्स उत्पन्न करने के लिए QGIS प्लगइन को एक साथ रखा गया था (यह सामान्य पहचानकर्ता के रूप में विशेषता तालिका में एक अद्वितीय टैक्सन नाम मानता है)। मेरी आवश्यकताएं उतनी जटिल नहीं थीं - मुझे मौसमी जानकारी, शीर्षक या किंवदंती की आवश्यकता नहीं थी, लेकिन यह आपके लिए एक उपयोगी शुरुआती बिंदु हो सकता है। अधिक जटिल पहलुओं के लिए, आपको मानचित्र संगीतकार का उपयोग करने की आवश्यकता होगी। उस पर अधिक के लिए PyQGIS कुकबुक देखें ।

लगाना

प्लगइन नक्शे के निर्माण को स्वचालित करता है, और आपको विलुप्त होने, रिज़ॉल्यूशन और अन्य पहलुओं को कॉन्फ़िगर करने की अनुमति देता है। यह आपके ग्रिड ओवरले के रूप में आउटपुट के लिए एक ही शैली लागू करता है। वर्तमान में यह केवल QGIS (1.9 या बाद के) के विकास संस्करण पर चलता है।

Sextante लिपि

प्लगइन बनाने से पहले मैंने SEXTANTE का उपयोग करके तर्क को काम किया। यह उपयोगकर्ता स्क्रिप्ट 1.8 में भी काम करना चाहिए (इसका परीक्षण नहीं किया है)। वितरण शैली फ़ाइल (.qml) आउटपुट वितरण की शैली है (यह वितरण ओवरले की शैली को अनदेखा करता है)। वर्तमान में यह आपके ऑपरेटिंग सिस्टम डिफॉल्ट्स (लिनक्स में tmp, और विंडोज में विभिन्न स्थानों पर आधारित - TEMP पर्यावरण चर द्वारा परिभाषित) के आधार पर टेंप डायरेक्टरी में आउटपुट मैप देता है। आप कोड में हालांकि खुद को आसानी से परिभाषित कर सकते हैं। आपको कोड में सीमा और आउटपुट रिज़ॉल्यूशन (और यदि आप समुद्र के लिए एक अलग रंग चाहते हैं तो पृष्ठभूमि रंग) को संपादित करने की आवश्यकता होगी।

#Definition of inputs and outputs
#==================================
##[Scratch]=group
##all_localities=vector
##taxon_field=field all_localities
##africa_map=vector
##sa_map=vector
##grid_layer=vector
##distribution_style_file=file

#Algorithm body
#==================================
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from sextante.core.QGisLayers import QGisLayers
from sextante.core.SextanteVectorWriter import SextanteVectorWriter
import tempfile
import os

def print_map(taxon,taxon_shp):
    #load taxon layer (necessary?)
    #QGisLayers.load(taxon_shp,name = "taxon",style = distribution_style_file)
    taxon_layer = QgsVectorLayer(taxon_shp,"taxon","ogr")
    QgsMapLayerRegistry.instance().addMapLayer(taxon_layer)
    taxon_layer.loadNamedStyle(distribution_style_file)

    # create image (dimensions 325x299)
    img = QImage(QSize(325,299), QImage.Format_ARGB32_Premultiplied)

    # set image's background color
    color = QColor(192,192,255)   # blue sea
    img.fill(color.rgb())

    # create painter
    p = QPainter()
    p.begin(img)
    p.setRenderHint(QPainter.Antialiasing)

    render = QgsMapRenderer()

    # create layer set
    africa_layer = QGisLayers.getObjectFromUri(africa_map)
    sa_layer = QGisLayers.getObjectFromUri(sa_map)
    #taxon_layer = QGisLayers.getObjectFromUri(taxon_shp)

    lst = []
    lst.append(taxon_layer.id())    
    lst.append(sa_layer.id())
    lst.append(africa_layer.id())

    render.setLayerSet(lst)

    # set extent (xmin,ymin,xmax,ymax)
    rect = QgsRectangle(14.75,-36.00,34.00,-21.00)
    render.setExtent(rect)

    # set output size
    render.setOutputSize(img.size(), img.logicalDpiX())

    # do the rendering
    render.render(p)
    p.end()

    # save image
    #outdir = os.path.dirname(os.path.abspath(output))
    tempdir = tempfile.gettempdir()
    img.save(os.path.join(tempdir,taxon+".png"),"png")

    # remove taxon layer from project
    QgsMapLayerRegistry.instance().removeMapLayers([taxon_layer.id()])

tempdir = tempfile.gettempdir()   
taxa = sextante.runalg('qgis:listuniquevalues', all_localities, taxon_field, None)['UNIQUE_VALUES'].split(";")
for taxon in taxa:
    sextante.runalg('qgis:selectbyattribute', all_localities, taxon_field, 0, taxon)
    sextante.runalg('qgis:selectbylocation', grid_layer, all_localities, 0)
    filename = os.path.join(tempdir,"taxon.shp")    #memory file better?
    sextante.runalg('qgis:saveselectedfeatures', grid_layer, filename)
    print_map(taxon,filename)

हाय सब, आपके सभी उत्तरों के लिए धन्यवाद। आपको कुछ और तत्व देने के लिए, यह बर्डलाइफ से आने वाला डेटा है (उदाहरण के लिए एक उदाहरण: बर्डलाइफ़ ..org /datazone/speciesfactsheet.php?id=2794 )। संक्षेप में, सभी प्रजातियों के लिए सभी पॉलीगॉन के साथ एक आकार आकृति होती है (इसलिए, उनमें से कुछ के लिए, एक एकल नमूने के लिए कई लाइन), और एक विशेषता है जो मौसमी वितरण के अनुरूप है (1 से 5 के मूल्यों के साथ अलग-अलग उपयोगों के अनुरूप) ), मूल आदि के लिए एक दूसरे के साथ। किंवदंती और शीर्षक अपरिहार्य नहीं है।
ओनेसिम

- मैं एक आसान स्थान के लिए, पृष्ठभूमि में एक देश परत का उपयोग करता हूं। - विशेषता "मौसमी" से अलग मूल्य के लिए अलग रंग के लिए, मुझे लगता है कि इसके लिए, एक .qml फ़ाइल उपयुक्त है। - वैकल्पिक रूप से, शीर्षक और किंवदंती के लिए, मुझे लगता है कि मुझे संगीतकार से एक फ़ाइल का उपयोग करना होगा, अगर यह बहुत कठिन है, तो मैं इसे अन्य सॉफ़्टवेयर के साथ जोड़ सकता हूं। - ऑपरेशन को सभी प्रजातियों के लिए दोहराया जाना है, इसलिए, यह विशेषता द्वारा चयन से मेल खाती है, जिसे अंतिम चित्र का नाम दिया जाएगा।
ओनेसिम

मैंने प्लगइन "एटलस" की कोशिश की, लेकिन यह विभिन्न स्थानों के लिए अधिक उपयुक्त लगता है, मेरे मामले में, यह एक ही क्षेत्र के लिए हर समय है: यूरोप। मैंने प्लगइन "डिस्ट्रीब्यूशन मैप मैनेजर" की कोशिश की, जो इस बिंदु पर मेल खाता है क्योंकि यह कवरेज क्षेत्र को ठीक करना संभव है, लेकिन मुझे उस प्रक्रिया की आवश्यकता नहीं है जो ग्रिड परत के साथ बिंदुओं को काटती है क्योंकि मेरे पास पहले से ही बहुभुज परत है। मैंने आर्कगिस में कोशिश की, लेकिन यह क्यूजीस एटलस प्लगइन के लिए काफी समान है, समाधान के लिए एक पायथन स्क्रिप्ट लिखी गई लगती है ...
ऑनसेम

इसलिए मुझे लगता है कि मैं "रुडिवोनस्टैडेन" स्क्रिप्ट पर आधारित (इसके लिए धन्यवाद!) और इसे अपने मामले में ढालने के लिए, सेक्स्टांटे का उपयोग करूंगा। अंत में, इन विभिन्न टिप्पणियों के लिए क्षमा करें, लेकिन एक वर्ण संख्या सीमा है ...
Onesime

@ टैग, शीर्षक और किंवदंती को छोड़कर, मुझे लगता है कि आप ऊपर की sextante स्क्रिप्ट को वही कर पाएंगे जो आपको चाहिए। आप शायद हटाने की आवश्यकता होगी selectbylocationकदम है, और एक अतिरिक्त जोड़ने selectbyattributeऔर saveselectedfeaturesप्रत्येक मौसम (बदलाव के लिए कदम grid_layerकरने के लिए all_localities)। फिर अधिक .qml फ़ाइलों को लोड करें और अपने मौसमी आकार के आकार को जोड़ें (शीर्ष परत पहले जोड़ा गया)। यदि आप सुनिश्चित नहीं हैं कि कैसे, मैं संभवतः अधिक-या-कम काम करने के लिए उपरोक्त स्क्रिप्ट को संपादित करने का प्रयास कर सकता हूं।
रुदिवोनेस्टेन

2

मुझे आज इस पर काम करने में कुछ समय लगा। इसलिए मैंने आपकी स्क्रिप्ट में कुछ बदलाव किए। जैसा कि मैं .qml फ़ाइलों का उपयोग करता हूं और सीज़नल फ़ील्ड एक ही आकार में है, मुझे एक अतिरिक्त selectbyattribute और saveselectedfeatures चरण जोड़ने की आवश्यकता नहीं है। नीचे, आप देख सकते हैं कि मैंने क्या किया है:

#Definition of inputs and outputs
#==================================
##[Scratch]=group
##all_localities=vector
##taxon_field=field all_localities
##seasonal_field=field all_localities
##countries_map=vector
##distribution_style_file=file
##output_folder=folder

#Algorithm body
#==================================
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from sextante.core.QGisLayers import QGisLayers
from sextante.core.SextanteVectorWriter import SextanteVectorWriter
import tempfile
import os

def print_map(taxon,taxon_shp):
#load taxon layer (necessary?)
#QGisLayers.load(taxon_shp,name = "taxon",style = distribution_style_file)
taxon_layer = QgsVectorLayer(taxon_shp,"taxon","ogr")
QgsMapLayerRegistry.instance().addMapLayer(taxon_layer)
taxon_layer.loadNamedStyle(distribution_style_file)

# create image (dimensions 325x299)
img = QImage(QSize(325,299), QImage.Format_ARGB32_Premultiplied)

# set image's background color
color = QColor(221,249,254)   # blue sea
img.fill(color.rgb())

# create painter
p = QPainter()
p.begin(img)
p.setRenderHint(QPainter.Antialiasing)

render = QgsMapRenderer()

# create layer set
countries_layer = QGisLayers.getObjectFromUri(countries_map)
taxon_layer = QGisLayers.getObjectFromUri(taxon_shp)

lst = []
lst.append(taxon_layer.id())    
lst.append(countries_layer.id())
render.setLayerSet(lst)

# set extent (xmin,ymin,xmax,ymax)
rect = QgsRectangle(-11,32,39,71)
render.setExtent(rect)
# set output size
render.setOutputSize(img.size(), img.logicalDpiX())

# do the rendering
render.render(p)
p.end()

#save image
#outdir = os.path.dirname(os.path.abspath(output))
tempdir = output_folder
img.save(os.path.join(tempdir,taxon+".png"),"png")

# remove taxon layer from project
QgsMapLayerRegistry.instance().removeMapLayers([taxon_layer.id()])

tempdir = tempfile.gettempdir()  

taxa = sextante.runalg('qgis:listuniquevalues', all_localities, taxon_field, None)        ['UNIQUE_VALUES'].split(";")

for taxon in taxa:
sextante.runalg('qgis:selectbyattribute', all_localities, taxon_field, 0, taxon)
filename = os.path.join(tempdir,"taxon.shp")    #memory file better?
sextante.runalg('qgis:saveselectedfeatures', all_localities, filename)
print_map(taxon,filename)

यदि आपके पास इसे सुधारने के लिए कोई टिप्पणी या सलाह है, तो संकोच न करें।

इसे सुधारने के लिए, सबसे अच्छा तब होगा जब हम सीमा का चयन करेंगे (यूरोप के लिए छूट), यह इस सीमा का उपयोग केवल इस सीमा के अंदर शामिल प्रजातियों का चयन करने के लिए करता है। यह, क्योंकि मैं सभी प्रजातियों के लिए नक्शे प्राप्त करता हूं, यहां तक ​​कि वे जो उदाहरण के लिए यूरोप के बाहर हैं (इसलिए मेरे पास कई खाली नक्शे हैं)। क्या आपको लगता है कि यह संभव है?

चीयर्स,

Onesime

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.