जैसा कि आंद्रे ने कहा, इसे काम करने के लिए, आपको प्रोजेक्ट करने से पहले अपनी परत की आवश्यकता होगी। आंद्रे एक मैनुअल विधि का वर्णन करता है, जो बहुत सारे मामलों के लिए अच्छी तरह से काम करता है: अपनी आकृति आकृति को ऑज़मोग्राफिक प्रोजेक्शन के समान अज़िमुथल इक्वेडिस्टेंट प्रोजेक्शन के साथ प्रोजेक्ट करें, एक क्लिपिंग सर्कल बनाएं जो गोलार्ध को कवर करता है जो ऑर्थोग्राफ़िक प्रोजेक्शन में दिखाई देगा, और उस के साथ आकृति को क्लिप करें। हालाँकि, उस विधि के लिए थोड़े से मैनुअल प्रयास की आवश्यकता होती है, और सभी प्रोजेक्शन मापदंडों के लिए काम नहीं करता है, क्योंकि अज़ीमुथल इक्विडिस्टेंट प्रोजेक्शन के लिए प्रोजेक्ट करने से ऑर्थोग्राफ़िक प्रोजेक्शन के समान प्रॉब्लम हो सकती है।
यहां एक स्क्रिप्ट (अब क्लिप टू हेमिस्फेयर क्यूजीआईएस प्लगइन के रूप में भी उपलब्ध है ) जो थोड़ा अलग दृष्टिकोण लेती है: ऑर्थोग्राफ़िक से स्रोत सीआरएस के एक सर्कल को प्रोजेक्ट करके मूल आकृति आकृति के समन्वय संदर्भ प्रणाली में एक क्लिपिंग परत बनाई जाती है, लेकिन इसके अतिरिक्त दृश्यमान ध्रुव सहित पूरे दृश्यमान गोलार्ध को कवर करना सुनिश्चित करें।
यह वह क्लिपिंग परत है जो 30 ° N, 110 ° E पर केंद्रित ऑर्थोग्राफ़िक प्रोजेक्शन के लिए दिखती है:
स्क्रिप्ट तब क्लिपिंग परत के साथ वर्तमान में चयनित परत को क्लिप करती है, और परिणामी परत को प्रोजेक्ट में जोड़ती है। उस परत को ऑर्थोग्राफिक प्रोजेक्शन के लिए प्रोजेक्ट किया जा सकता है, या तो मक्खी पर या ऑर्थोग्राफ़िक सीआरएस में इसे सहेज कर:
यहाँ स्क्रिप्ट है। इसे अपने पाइथन पथ में सहेजना सुनिश्चित करें, उदाहरण के लिए 'क्लिपोरथो-थ्रू'। तब आप इसका उपयोग कर QGIS पायथन कंसोल में आयात कर सकते हैं 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)