যেমনটি আন্দ্রে বলেছিলেন, এটি কাজ করার জন্য আপনাকে আপনার স্তরটি প্রজেক্ট করার আগে ক্রপ করতে হবে। আন্দ্রে একটি ম্যানুয়াল পদ্ধতি বর্ণনা করেছেন , যা প্রচুর ক্ষেত্রে ভাল কাজ করে: আপনার শেপফিলটি অরজিওথাল প্রবর্তনের মতো একই পরামিতিগুলির সাথে একটি আজিমুথাল সমতুল্য প্রক্ষেপণে প্রজেক্ট করুন, একটি ক্লিপিং বৃত্ত তৈরি করুন যা অর্থোগ্রাফিক প্রোজেকশনে দৃশ্যমান হবে এমন গোলার্ধকে কভার করে এবং এটি দিয়ে শেফফিলিটি ক্লিপ করুন। যাইহোক, এই পদ্ধতিটি মোটামুটি ম্যানুয়াল প্রচেষ্টা দরকার, এবং সমস্ত প্রক্ষেপণ প্যারামিটারের জন্য কাজ করে না, যেহেতু একটি অজিমুথাল ইক্যুইডিসিটিভ প্রজেকশনকে প্রকল্প করার জন্য অর্থোগ্রাফিক প্রজেকশন হিসাবে প্রজেক্ট করার অনুরূপ সমস্যা দেখা দিতে পারে।
এখানে একটি স্ক্রিপ্ট (এখন ক্লিপ টু হেমিস্ফিয়ার কিউজিআইএস প্লাগইন হিসাবেও পাওয়া যায় ) যা কিছুটা ভিন্ন পদ্ধতির গ্রহণ করে: মূল শেপফিলের স্থানাংকী রেফারেন্স সিস্টেমে একটি ক্লিপিং স্তর তৈরি করা হয়েছে অর্থোগ্রাফিক থেকে উত্স সিআরএসে একটি বৃত্ত প্রজেক্টের মাধ্যমে, তবে অতিরিক্তভাবে দৃশ্যমান মেরু সহ পুরো দৃশ্যমান গোলার্ধকে coverেকে দেওয়ার বিষয়টি নিশ্চিত করা।
ক্লিপিং স্তরটি 30 ° N, 110 ° E কেন্দ্রে একটি অর্থোগ্রাফিক প্রজেকশনটির মতো দেখায়:
স্ক্রিপ্টটি বর্তমানে নির্বাচিত স্তরটি ক্লিপিং স্তর দিয়ে ক্লিপ করে এবং ফলস্বরূপ স্তরটি প্রকল্পে যুক্ত করে। এর পরে স্তরটি orthographic প্রক্ষেপণে বাড়ে, বা উড়োজাহাজের সিআরএস-এ সংরক্ষণ করে অর্থোগ্রাফিক প্রজেকশনে প্রজেক্ট করা যেতে পারে:
এখানে স্ক্রিপ্ট। এটি আপনার পাইথন পথে সংরক্ষণের বিষয়ে নিশ্চিত হন, উদাহরণস্বরূপ 'cliportho.py' হিসাবে। তারপরে আপনি কিউজিআইএস পাইথন কনসোল ব্যবহার করে এটি আমদানি করতে পারেন import cliportho
। একটি স্তর ক্লিপ করতে, কল করুন cliportho.doClip(iface, lat=30, lon=110, filename='A.shp')
।
import numpy as np
from qgis.core import *
import qgis.utils
import sys, os, imp
def doClip(iface, lat=30, lon=110, filename='result.shp'):
sourceLayer = iface.activeLayer()
sourceCrs = sourceLayer.dataProvider().crs()
targetProjString = "+proj=ortho +lat_0=" + str(lat) + " +lon_0=" + str(lon) + "+x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs"
targetCrs = QgsCoordinateReferenceSystem()
targetCrs.createFromProj4(targetProjString)
transformTargetToSrc = QgsCoordinateTransform(targetCrs, sourceCrs).transform
def circlePolygon(nPoints=20, radius=6370000, center=[0,0]):
clipdisc = QgsVectorLayer("Polygon?crs=epsg:4326", "Clip disc", "memory")
angles = np.linspace(0, 2*np.pi, nPoints, endpoint=False)
circlePoints = np.array([ transformTargetToSrc(QgsPoint(center[0]+np.cos(angle)*radius, center[1]+np.sin(angle)*radius)) for angle in angles ])
sortIdx = np.argsort(circlePoints[:,0])
circlePoints = circlePoints[sortIdx,:]
circlePoints = [ QgsPoint(point[0], point[1]) for point in circlePoints ]
circlePoints.extend([QgsPoint(180,circlePoints[-1][1]), QgsPoint(180,np.sign(lat)*90), QgsPoint(-180,np.sign(lat)*90), QgsPoint(-180,circlePoints[0][1])])
circle = QgsFeature()
circle.setGeometry(QgsGeometry.fromPolygon( [circlePoints] ) )
clipdisc.dataProvider().addFeatures([circle])
QgsMapLayerRegistry.instance().addMapLayer(clipdisc)
return clipdisc
auxDisc = circlePolygon(nPoints = 3600)
###### The clipping stuff
## Code taken from the fTools plugin
vproviderA = sourceLayer.dataProvider()
vproviderB = auxDisc.dataProvider()
inFeatA = QgsFeature()
inFeatB = QgsFeature()
outFeat = QgsFeature()
fitA = vproviderA.getFeatures()
nElement = 0
writer = QgsVectorFileWriter( filename, 'UTF8', vproviderA.fields(),
vproviderA.geometryType(), vproviderA.crs() )
index = QgsSpatialIndex()
feat = QgsFeature()
index = QgsSpatialIndex()
fit = vproviderB.getFeatures()
while fit.nextFeature( feat ):
index.insertFeature( feat )
while fitA.nextFeature( inFeatA ):
nElement += 1
geom = QgsGeometry( inFeatA.geometry() )
atMap = inFeatA.attributes()
intersects = index.intersects( geom.boundingBox() )
first = True
found = False
if len( intersects ) > 0:
for id in intersects:
vproviderB.getFeatures( QgsFeatureRequest().setFilterFid( int( id ) ) ).nextFeature( inFeatB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
if tmpGeom.intersects( geom ):
found = True
if first:
outFeat.setGeometry( QgsGeometry( tmpGeom ) )
first = False
else:
try:
cur_geom = QgsGeometry( outFeat.geometry() )
new_geom = QgsGeometry( cur_geom.combine( tmpGeom ) )
outFeat.setGeometry( QgsGeometry( new_geom ) )
except:
GEOS_EXCEPT = False
break
if found:
try:
cur_geom = QgsGeometry( outFeat.geometry() )
new_geom = QgsGeometry( geom.intersection( cur_geom ) )
if new_geom.wkbType() == 0:
int_com = QgsGeometry( geom.combine( cur_geom ) )
int_sym = QgsGeometry( geom.symDifference( cur_geom ) )
new_geom = QgsGeometry( int_com.difference( int_sym ) )
try:
outFeat.setGeometry( new_geom )
outFeat.setAttributes( atMap )
writer.addFeature( outFeat )
except:
FEAT_EXCEPT = False
continue
except:
GEOS_EXCEPT = False
continue
del writer
resultLayer = QgsVectorLayer(filename, sourceLayer.name() + " - Ortho: Lat " + str(lat) + ", Lon " + str(lon), "ogr")
QgsMapLayerRegistry.instance().addMapLayer(resultLayer)