OSGeo4w শেল স্ক্রিপ্ট চলাকালীন qgis.core এর জন্য আমদানি ত্রুটি


17

আমি এই পোস্টের সাথে , কিউআইজিআইএসের বাইরে ওএসজিও 4 ডেল শেলের স্ক্রিপ্ট চালানোর চেষ্টা করছিলাম। তবে আমি নিম্নলিখিত ত্রুটি পেয়েছি:

আমদানি ত্রুটি: Qgis.core নামে কোনও মডিউল নেই

আমি নিম্নলিখিত পোস্টগুলি পড়েছি এবং বিভিন্ন মডিউল আমদানি করার চেষ্টা করেছি কিন্তু কোনও ফলসই হয়নি:

এখানে একটি সহজ স্ক্রিপ্ট যা গ্রিড তৈরি করে এবং এতে বহুভুজ শেফফিলিটি ক্লিপ করে।

দ্রষ্টব্য: এই স্ক্রিপ্টটি পরীক্ষা করা হয়েছে এবং কিউজিআইএস-এ চলাকালীন সফলভাবে কাজ করে।

##Test=name

import os
import glob
import sys

sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):
            outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
            outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

উত্তর এবং @gcarrillo দ্বারা পোস্ট করা স্ক্রিপ্ট অনুসরণ করে আমি পরিশেষে qgis.core.সফলভাবে মডিউলগুলি আমদানি করতে পারি । @Gcarrillo দ্বারা সরবরাহিত স্ক্রিপ্টটি চলে তবে আমি একটি ট্রেসব্যাক ত্রুটি পেয়েছি:

Traceback (most recent call last):
  File "Test.py", line 55, in <module>
    run()
  File "Test.py", line 53, in run
    algClip.processAlgorithm(progress)
  File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
    layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'

1
আপনি কি পাইথনপথটি সঠিকভাবে সেট করেছেন? আমি কুইগিস আইকন দ্বারা নির্দেশিত qgis.bat তে সেট করা একই ENV ভেরিয়েবলগুলির সাথে স্ক্রিপ্টটি চালানোর পরামর্শ দিই।
লুইজি পাইরেলি

ধন্যবাদ @ লুইজিপিরেলি, আমি যাব এবং ফিরে রিপোর্ট করব।
জোসেফ

@ লুইজিপিরেলি আপনার পরামর্শের জন্য ধন্যবাদ তবে সমস্যাটি এখনও অব্যাহত রয়েছে (যদি না আমি পরিবেশগত ভেরিয়েবলগুলি ভুলভাবে যোগ না করি!)
জোসেফ

1
আমার কাছে একটি উইন্ডো PATH "সেট" এর সাথে সেট করা উচিত: সেট পথ =% OSGEO4W_ROOT% \ অ্যাপ্লিকেশনগুলি \ কিগিস \ বিন;% ওসিজিও 4 ডব্লু_আরওট% \ অ্যাপ্লিকেশনগুলি \ ঘাস \ ঘাস -6.4.3 \ লিবি;% पथ%
স্টেফান

উত্তর:


17

শেষ পর্যন্ত পাইকিউজিআইএস স্ট্যান্ডেলোন স্ক্রিপ্টগুলিতে প্রসেসিং অ্যালগরিদমগুলি চালনার উপযুক্ত উপায় খুঁজে পেয়েছে।

এই উত্তরটি আমদানি কিগিস.কমের সমস্যার সাথে উত্তরের পিআইকিজিআইএস স্ক্রিপ্ট লেখার সময় এবং ত্রুটিতে : অ্যালগরিদম খুঁজে পাওয়া যায় নি , যা ঘুরে দেখা যায় কিউগিস-ডেভেলিং মেলিং-তালিকার আলোচনার ভিত্তিতে ।

আপনার ওএসজিও 4 ডাব্লু শেলের আপনার কিউজিআইএস লাইব্রেরিগুলিকে সক্ষম করার জন্য স্ট্যান্ড-অলোন পাইকিজিআইএস স্ক্রিপ্ট লেখার সময় আমদানি কিগিস.কমের সমস্যার ক্ষেত্রে প্রবক্তাটি অনুসরণ করার পরামর্শ দিচ্ছি । আপনার কিউজিআইএস লাইব্রেরিগুলি সঠিকভাবে কাজ করার পরে আমরা আপনার প্রশ্নের দ্বিতীয় অংশে এগিয়ে যেতে পারি: স্ট্যান্ড্যালোন পাইকিজিআইএস স্ক্রিপ্টে প্রসেসিং অ্যালগরিদমগুলি চালিয়ে যাচ্ছি।

আমি আপনার মূল স্ক্রিপ্টটি কিছুটা পরিবর্তন করেছি এবং এটি উইন্ডোজ 7 এবং জিএনইউ / লিনাক্সে পরীক্ষা করেছি। আমি প্রসেসিং সংস্করণ ২.২.০-২ ব্যবহার করি এবং আপনাকে এই সংস্করণটি ব্যবহার করার পরামর্শ দিচ্ছি, যা উত্তর লেখার মুহুর্তে বর্তমান।

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)

run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

নোট করুন যে আমি গ্রিড তৈরিটি লুপের বাইরে নিয়ে এসেছি, কারণ প্রতিটি ক্লিপ সম্পাদনের জন্য আপনার সত্যিকার অর্থে কোনও নতুন গ্রিডের প্রয়োজন নেই।

এই কৌতুক করতে হবে!


সুন্দর! আমার মতে কমপক্ষে পাঠযোগ্য এবং কমপ্যাক্ট হিসাবে এই উত্তরটি গ্রহণ করবে। আপনাকে আবার অনেক ধন্যবাদ বন্ধু!
জোসেফ

সবেমাত্র লক্ষ্য করেছেন যে এই স্ক্রিপ্টটি Processingফোল্ডারে থাকা একটির মতোই ডেস্কটপে একটি ফোল্ডার তৈরি করে /qgis.2। এটা কি হওয়া উচিত?
জোসেফ

এটি একই ফোল্ডারটিও তৈরি করে যা থেকে এটি শেফফিলগুলি পড়ে এবং একটি খালি 'কিগিস' ডেটা বেস ফাইল যুক্ত করে। স্ক্রিপ্টটি যেহেতু আমি সংশোধন করছি তা বেশ বিরক্তিকর, বেশ কয়েকটি ফোল্ডার থেকে শেফফিলগুলি নেয়, যার অর্থ এই নতুন ফাইলগুলি / ফোল্ডারগুলিও পপ আপ হচ্ছে। আমি এখনও আপনার উত্তরটির অন্যটির কাছে এই উত্তরটিকে পছন্দ করি।
জোসেফ

ডান @ জোসেফ, fold ফোল্ডারগুলির তৈরি সম্পর্কে জানেন না, প্রসেসিং ফ্রেমওয়ার্কগুলি কোনও কারণেই আমি বুঝতে পারি না সেগুলি তাদের তৈরি করে। আমি আপনার সাথে একমত, এটি সঠিক উত্তর, এটি আপনাকে অতিরিক্ত পদক্ষেপগুলি এড়িয়ে যায় এবং প্রকৃতপক্ষে কাঠামোর সুবিধা গ্রহণ করে। অনুগ্রহের জন্য ধন্যবাদ!
জার্মানি ক্যারিলো

2
এটি খুব সহায়ক। কিউজিআইএসের বড় দুর্বলতা সূচনাপ্রাপ্তদের সহজ স্ক্রিপ্ট লিখতে দেয়। এটা দাঁত টানার মতো।
দামিয়েন

7

এই উত্তরটি আমদানি Qgis.core নিয়ে সমস্যার উত্তরগুলির উপর ভিত্তি করে একটি একা একা পাইকিজিআইআইএস স্ক্রিপ্ট লেখার সময় এবং পাইথনের সাথে আমি কীভাবে প্রসেসিংয়ে অ্যাক্সেস করতে পারি?

আপনার ওএসজিও 4 ডাব্লু শেলের আপনার কিউজিআইএস লাইব্রেরিগুলিকে সক্ষম করার জন্য স্ট্যান্ড-অলোন পাইকিজিআইএস স্ক্রিপ্ট লেখার সময় আমদানি কিগিস.কমের সমস্যার ক্ষেত্রে প্রবক্তাটি অনুসরণ করার পরামর্শ দিচ্ছি । আপনার কিউজিআইএস লাইব্রেরিগুলি সঠিকভাবে কাজ করার পরে আমরা আপনার প্রশ্নের দ্বিতীয় অংশে এগিয়ে যেতে পারি: স্ট্যান্ড্যালোন পাইকিজিআইএস স্ক্রিপ্টে প্রসেসিং অ্যালগরিদমগুলি চালিয়ে যাচ্ছি।

মতই আমি কিভাবে পাইথন সঙ্গে processing` অ্যাক্সেস করতে পারেন `? , যতক্ষণ না আমি নাম (যেমন, processing.runalg('provider:algorithm_name')) দ্বারা অ্যালগরিদম চালাতে সক্ষম না হয়েছি ততক্ষণে আমি আপনাকে একটি কাজের প্রস্তাব দেব । আমি প্রক্রিয়াকরণ সংস্করণ 2.2.0-2 ব্যবহার করি এবং আপনাকে এই সংস্করণটি ব্যবহার করার পরামর্শ দিচ্ছি।

প্লাগইন ফোল্ডারগুলির প্রসেসিংয়ে একটি অ্যালগরিদম স্ক্রিপ্ট কোথায় রয়েছে তা নির্ধারণ করার জন্য আমরা কিউজিআইএস পাইথন কনসোল ব্যবহার করতে পারি। উদাহরণস্বরূপ, কোথা থেকে আমদানি করবেন তা জানতে qgis:creategridQGIS পাইথন কনসোলে লিখুন:

from processing.core.Processing import Processing
Processing.getAlgorithm('qgis:creategrid')

আপনার প্রাপ্ত করা উচিত:

<processing.algs.qgis.mmqgisx.MMQGISXAlgorithms.mmqgisx_grid_algorithm instance at 0xae7382c>

মডিউল পথ ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) এবং অ্যালগরিদম শ্রেণি ( mmqgisx_grid_algorithm) উভয়ই লক্ষ্য করার জন্য এটি আমাদের পক্ষে যথেষ্ট । আপনি এই তথ্যটি নীচের স্ক্রিপ্টে ব্যবহার করবেন।

আমি আপনার স্ক্রিপ্টটি কিছুটা পরিবর্তন করেছি এবং এটি উইন্ডোজ on এ পরীক্ষা করেছি your আপনার নিজের পরিবেশে স্ক্রিপ্টটি চালানোর জন্য আপনাকে পাথগুলি সামঞ্জস্য করতে হতে পারে।

import os
import glob
import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Tell Python where you will get processing from
sys.path.append(home + "\.qgis2\python\plugins")

# Reference the algorithms you want to run
from processing.algs.qgis.mmqgisx.MMQGISXAlgorithms import *
from processing.algs.qgis.ftools.Clip import *
algGrid = mmqgisx_grid_algorithm()
algClip = Clip()

from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()

def run():
    # Create a grid 
    grid = path_dir + "Grids\grid.shp"
    algGrid.setParameterValue('HSPACING', 1000)
    algGrid.setParameterValue('VSPACING', 1000)
    algGrid.setParameterValue('WIDTH', 24108)
    algGrid.setParameterValue('HEIGHT', 18351.157175)
    algGrid.setParameterValue('CENTERX', 258293.802316)
    algGrid.setParameterValue('CENTERY', 665638.226408)
    algGrid.setParameterValue('GRIDTYPE', 1)
    algGrid.setParameterValue('CRS', 'EPSG:7405')
    algGrid.setOutputValue('SAVENAME', grid)
    algGrid.processAlgorithm(progress)

    # Set directory, search for all polygon .shp files 
    os.chdir(path_dir + "Shapefiles\\")    
    for fname in glob.glob("*.shp"):
        # Run the Clip algorithm, then output results into Results folder
        algClip.setParameterValue('INPUT', grid)
        algClip.setParameterValue('OVERLAY', fname)
        algClip.setOutputValue('OUTPUT', path_res  + "/"+ fname)
        algClip.processAlgorithm(progress)

run()
QgsApplication.exitQgis()

এই কৌতুক করতে হবে!

আপনি দেখতে পাচ্ছেন, আমি একটি টেস্ট / গ্রিড ফোল্ডার তৈরি করেছি যাতে আপনি লুপের জন্য প্রতিটিটিতে টেম্পোরাল ফাইল তৈরির পরিবর্তে একটি একক গ্রিড শেফিল সঞ্চয় করে রাখেন, যা প্রয়োজনীয় বলে মনে হয় না।


অনেক ধন্যবাদ @ জিসিআরিলো, আমি এটি পরীক্ষা করে আবার রিপোর্ট করব।
জোসেফ

সাহায্যের জন্য আপনাকে আবারও ধন্যবাদ! আমি সফলভাবে মডিউল আমদানি করতে পারি! তবে আমি যখন আপনার স্ক্রিপ্টটি চালাব, আমি একটি ট্রেসব্যাক ত্রুটি পেয়েছি। এটি অন্তর্ভুক্ত করার জন্য আমি প্রশ্নটি সম্পাদনা করেছি।
জোসেফ

আপনি Test/Grids/স্ক্রিপ্টটি চালানোর আগে ফোল্ডারটি তৈরি করতে ভুলে গেছেন ।
জার্মানি ক্যারিলো

দুঃখিত, আমি এটি উল্লেখ করতে ভুলে গেছি। আমি /Grids/ফোল্ডারটি তৈরি করেছি এবং grid.shp ফাইলটি তৈরি করা হয়েছে। এটি পুরোপুরি কাজ করে! আর কিছু সমস্যা হচ্ছে।
জোসেফ

আপনি স্ক্রিপ্টে কোনও পরিবর্তন / সমন্বয় করেছেন? আমি কোনও সমস্যা ছাড়াই এটি কেবল জিএনইউ / লিনাক্সে পরীক্ষা করেছি। আপনি যে ত্রুটিটি পেয়েছেন তা হ'ল ক্লিপ অ্যালগরিদম সেই পথে অ্যাক্সেস করতে পারে না path_dir + "Grids\grid.shp"যা হ'লC:\Users\your_username\Desktop\Test\Grids\grid.shp
জার্মানি ক্যারিলো

4

ওএসজিইও 4 ডাব্লু 64 পাথটি অন্তর্ভুক্ত করার জন্য আমাকে @gcarrillo দ্বারা সরবরাহিত স্ক্রিপ্টে সামান্য পরিবর্তন করতে হয়েছিল (প্রথমে আমি স্বতন্ত্র ইনস্টলারটি ব্যবহার করার সাথে সাথে আমাকে OSGEO4W64 ইনস্টলারটির মাধ্যমে কিউজিআইএস পুনরায় ইনস্টল করতে হয়েছিল) এবং ডাবল-স্ল্যাশ অন্তর্ভুক্ত করতে হয়েছিল। এখানে চূড়ান্ত স্ক্রিপ্ট এবং তাদের সহায়তার জন্য প্রত্যেককে অনেক ধন্যবাদ:

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QgsApplication([]) # instantiation of QgsApplication
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.