Như Andre đã nói, để điều này hoạt động, bạn sẽ cần cắt lớp của mình trước khi chiếu nó. Andre mô tả một phương pháp thủ công , hoạt động tốt trong nhiều trường hợp: Chiếu shapefile của bạn thành phép chiếu đẳng thức phương vị với các tham số tương tự như phép chiếu chính tả, tạo một vòng tròn cắt bao phủ bán cầu sẽ hiển thị trong hình chiếu chính tả và clip shapefile với điều đó. Tuy nhiên, phương pháp đó đòi hỏi một chút nỗ lực thủ công và không hoạt động đối với tất cả các tham số chiếu, vì việc chiếu lên phép chiếu tương đương phương vị có thể dẫn đến các vấn đề tương tự như chiếu lên phép chiếu chính tả.
Đây là một tập lệnh (hiện cũng có sẵn dưới dạng plugin Clip to Hemisphere QGIS ) có cách tiếp cận hơi khác: Một lớp cắt được tạo trong hệ thống tham chiếu tọa độ của shapefile ban đầu bằng cách chiếu một vòng tròn từ hình chính tả sang CRS nguồn, nhưng ngoài ra đảm bảo bao phủ toàn bộ bán cầu có thể nhìn thấy, bao gồm cả cực nhìn thấy được.
Đây là những gì lớp cắt trông giống như một hình chiếu chính tả tập trung vào 30 ° N, 110 ° E:
Kịch bản sau đó cắt lớp hiện đang được chọn với lớp cắt và thêm lớp kết quả vào dự án. Lớp đó sau đó có thể được chiếu lên hình chiếu chính tả, khi đang di chuyển hoặc bằng cách lưu nó trong CRS chính tả:
Đây là kịch bản. Đảm bảo lưu nó trong đường dẫn Python của bạn, ví dụ như 'cliportho.py'. Sau đó, bạn có thể nhập nó trong bảng điều khiển QGIS Python bằng cách sử dụng import cliportho
. Để cắt một lớp, gọi 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)