review Export geometry info tool, sync with master

This commit is contained in:
Alexander Bruy 2012-10-01 20:48:06 +03:00
parent 1a67b91c4c
commit a6418d6502
2 changed files with 136 additions and 118 deletions

View File

@ -1,133 +1,151 @@
from sextante.core.GeoAlgorithm import GeoAlgorithm
import os.path import os.path
from PyQt4 import QtGui from PyQt4 import QtGui
from PyQt4.QtCore import * from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import * from qgis.core import *
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.core.QGisLayers import QGisLayers from sextante.core.QGisLayers import QGisLayers
from sextante.parameters.ParameterVector import ParameterVector
from sextante.parameters.ParameterSelection import ParameterSelection
from sextante.outputs.OutputVector import OutputVector from sextante.outputs.OutputVector import OutputVector
from sextante.ftools import FToolsUtils as utils
class ExportGeometryInfo(GeoAlgorithm): class ExportGeometryInfo(GeoAlgorithm):
INPUT = "INPUT" INPUT = "INPUT"
METHOD = "CALC_METHOD"
OUTPUT = "OUTPUT" OUTPUT = "OUTPUT"
CALC_METHODS = ["Layer CRS",
"Project CRS",
"Ellipsoidal"
]
def getIcon(self): def getIcon(self):
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/export_geometry.png") return QtGui.QIcon(os.path.dirname(__file__) + "/icons/export_geometry.png")
def defineCharacteristics(self):
self.name = "Export/Add geometry columns"
self.group = "Geometry tools"
self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
self.addParameter(ParameterSelection(self.METHOD, "Calculate using", self.CALC_METHODS, 0))
self.addOutput(OutputVector(self.OUTPUT, "Output layer"))
def processAlgorithm(self, progress): def processAlgorithm(self, progress):
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(ExportGeometryInfo.INPUT)) layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
vprovider = vlayer.dataProvider() method = self.getParameterValue(self.METHOD)
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs ) output = self.getOutputValue(self.OUTPUT)
( fields, index1, index2 ) = self.checkGeometryFields(vlayer)
writer = self.getOutputFromName(ExportGeometryInfo.OUTPUT).getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() ) provider = layer.dataProvider()
geometryType = layer.geometryType()
layer.select(layer.pendingAllAttributesList())
idx1 = -1
idx2 = -1
fields = layer.pendingFields()
if geometryType == QGis.Polygon:
idx1, fields = utils.findOrCreateField(layer, fields, "area", 21, 6)
idx2, fields = utils.findOrCreateField(layer, fields, "perimeter", 21, 6)
elif geometryType == QGis.Line:
idx1, fields = utils.findOrCreateField(layer, fields, "length", 21, 6)
idx2 = idx1
else:
idx1, fields = utils.findOrCreateField(layer, fields, "xcoord", 21, 6)
idx2, fields = utils.findOrCreateField(layer, fields, "ycoord", 21, 6)
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields,
provider.geometryType(), provider.crs())
ellips = None
crs = None
coordTransform = None
# calculate with:
# 0 - layer CRS
# 1 - project CRS
# 2 - ellipsoidal
if method == 2:
settings = QSettings()
ellips = settings.value("/qgis/measure/ellipsoid", "WGS84").toString()
crs = layer.crs().srsid()
elif method == 1:
mapCRS = QGisLayers.iface.mapCanvas().mapRenderer().destinationCrs()
layCRS = layer.crs()
coordTransform = QgsCoordinateTransform(layCRS, mapCRS)
inFeat = QgsFeature() inFeat = QgsFeature()
outFeat = QgsFeature() outFeat = QgsFeature()
inGeom = QgsGeometry() inGeom = QgsGeometry()
nFeat = vprovider.featureCount()
nElement = 0 current = 0
while vprovider.nextFeature(inFeat): total = 100.0 / float(provider.featureCount())
progress.setPercentage(int(nElement/nFeat * 100))
nElement += 1 while layer.nextFeature(inFeat):
inGeom = inFeat.geometry() inGeom = inFeat.geometry()
( attr1, attr2 ) = self.simpleMeasure( inGeom )
if method == 1:
inGeom.transform(coordTransform)
(attr1, attr2) = self.simpleMeasure(inGeom, method, ellips, crs)
outFeat.setGeometry(inGeom) outFeat.setGeometry(inGeom)
atMap = inFeat.attributeMap() atMap = inFeat.attributeMap()
outFeat.setAttributeMap(atMap) outFeat.setAttributeMap(atMap)
outFeat.addAttribute( index1, QVariant( attr1 ) ) outFeat.addAttribute(idx1, QVariant(attr1))
outFeat.addAttribute( index2, QVariant( attr2 ) ) outFeat.addAttribute(idx2, QVariant(attr2))
writer.addFeature( outFeat ) writer.addFeature( outFeat )
current += 1
progress.setPercentage(int(current * total))
del writer del writer
def simpleMeasure(self, geom, method, ellips, crs):
def simpleMeasure( self, inGeom ): if geom.wkbType() in [QGis.WKBPoint, QGis.WKBPoint25D]:
if inGeom.wkbType() in (QGis.WKBPoint, QGis.WKBPoint25D): pt = geom.asPoint()
pt = QgsPoint()
pt = inGeom.asPoint()
attr1 = pt.x() attr1 = pt.x()
attr2 = pt.y() attr2 = pt.y()
elif inGeom.wkbType() in (QGis.WKBMultiPoint, QGis.WKBMultiPoint25D): elif geom.wkbType() in [QGis.WKBMultiPoint, QGis.WKBMultiPoint25D]:
pt = inGeom.asMultiPoint() pt = inGeom.asMultiPoint()
attr1 = pt[0].x() attr1 = pt[0].x()
attr2 = pt[0].y() attr2 = pt[0].y()
else: else:
measure = QgsDistanceArea() measure = QgsDistanceArea()
attr1 = measure.measure(inGeom)
if inGeom.type() == QGis.Polygon: if method == 2:
attr2 = self.perimMeasure( inGeom, measure ) measure.setSourceCrs(crs)
measure.setEllipsoid(ellips)
measure.setProjectionsEnabled(True)
attr1 = measure.measure(geom)
if geom.type() == QGis.Polygon:
attr2 = self.perimMeasure(geom, measure)
else: else:
attr2 = attr1 attr2 = attr1
return (attr1, attr2) return (attr1, attr2)
def perimMeasure( self, inGeom, measure ): def perimMeasure(self, geom, measure):
value = 0.00 value = 0.0
if inGeom.isMultipart(): if geom.isMultipart():
poly = inGeom.asMultiPolygon() polygons = geom.asMultiPolygon()
for k in poly: for p in polygons:
for j in k: for line in p:
value = value + measure.measureLine( j ) value += measure.measureLine(line)
else: else:
poly = inGeom.asPolygon() poly = geom.asPolygon()
for k in poly: for r in poly:
value = value + measure.measureLine( k ) value += measure.measureLine(r)
return value return value
def checkForField( self, L, e ):
e = QString( e ).toLower()
fieldRange = range( 0,len( L ) )
for item in fieldRange:
if L[ item ].toLower() == e:
return True, item
return False, len( L )
def checkGeometryFields( self, vlayer ):
vprovider = vlayer.dataProvider()
nameList = []
fieldList = vprovider.fields()
geomType = vlayer.geometryType()
for i in fieldList.keys():
nameList.append( fieldList[ i ].name().toLower() )
if geomType == QGis.Polygon:
plp = "Poly"
( found, index1 ) = self.checkForField( nameList, "AREA" )
if not found:
field = QgsField( "AREA", QVariant.Double, "double", 21, 6, "Polygon area" )
index1 = len( fieldList.keys() )
fieldList[ index1 ] = field
( found, index2 ) = self.checkForField( nameList, "PERIMETER" )
if not found:
field = QgsField( "PERIMETER", QVariant.Double, "double", 21, 6, "Polygon perimeter" )
index2 = len( fieldList.keys() )
fieldList[ index2 ] = field
elif geomType == QGis.Line:
plp = "Line"
(found, index1) = self.checkForField(nameList, "LENGTH")
if not found:
field = QgsField("LENGTH", QVariant.Double, "double", 21, 6, "Line length" )
index1 = len(fieldList.keys())
fieldList[index1] = field
index2 = index1
else:
plp = "Point"
(found, index1) = self.checkForField(nameList, "XCOORD")
if not found:
field = QgsField("XCOORD", QVariant.Double, "double", 21, 6, "Point x coordinate" )
index1 = len(fieldList.keys())
fieldList[index1] = field
(found, index2) = self.checkForField(nameList, "YCOORD")
if not found:
field = QgsField("YCOORD", QVariant.Double, "double", 21, 6, "Point y coordinate" )
index2 = len(fieldList.keys())
fieldList[index2] = field
return (fieldList, index1, index2)
def defineCharacteristics(self):
self.name = "Export/Add geometry columns"
self.group = "Geometry tools"
self.addParameter(ParameterVector(ExportGeometryInfo.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
self.addOutput(OutputVector(ExportGeometryInfo.OUTPUT, "Output layer"))
#=========================================================