mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-27 00:33:48 -05:00
122 lines
5.2 KiB
Python
Executable File
122 lines
5.2 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
#-----------------------------------------------------------
|
|
#
|
|
# Vector Split
|
|
#
|
|
# A QGIS plugin for creating separate output shapefiles
|
|
# based on an attribute from a single input vector layer
|
|
#
|
|
# EMAIL: carson.farmer (at) gmail.com
|
|
# WEB : www.geog.uvic.ca/spar/carson
|
|
#
|
|
#-----------------------------------------------------------
|
|
#
|
|
# licensed under the terms of GNU GPL 2
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
#---------------------------------------------------------------------
|
|
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
from qgis.core import *
|
|
#import os, sys, string, math
|
|
import ftools_utils
|
|
from ui_frmVectorSplit import Ui_Dialog
|
|
|
|
class Dialog(QDialog, Ui_Dialog):
|
|
def __init__(self, iface):
|
|
QDialog.__init__(self)
|
|
self.iface = iface
|
|
# Set up the user interface from Designer.
|
|
self.setupUi(self)
|
|
QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
|
|
QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.update)
|
|
self.setWindowTitle(self.tr("Split vector layer"))
|
|
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
|
|
# populate layer list
|
|
self.progressBar.setValue(0)
|
|
mapCanvas = self.iface.mapCanvas()
|
|
layers = ftools_utils.getLayerNames([QGis.Point, QGis.Line, QGis.Polygon])
|
|
self.inShape.addItems(layers)
|
|
|
|
def update(self, inputLayer):
|
|
self.inField.clear()
|
|
changedLayer = ftools_utils.getVectorLayerByName(inputLayer)
|
|
changedField = ftools_utils.getFieldList(changedLayer)
|
|
for i in changedField:
|
|
self.inField.addItem(unicode(changedField[i].name()))
|
|
|
|
def accept(self):
|
|
self.buttonOk.setEnabled( False )
|
|
if self.inShape.currentText() == "":
|
|
QMessageBox.information(self, self.tr("Vector Split"), self.tr("No input shapefile specified"))
|
|
elif self.outShape.text() == "":
|
|
QMessageBox.information(self, self.tr("Vector Split"), self.tr("Please specify output shapefile"))
|
|
else:
|
|
inField = self.inField.currentText()
|
|
inLayer = ftools_utils.getVectorLayerByName(unicode(self.inShape.currentText()))
|
|
self.progressBar.setValue(5)
|
|
outPath = QString(self.folderName)
|
|
self.progressBar.setValue(10)
|
|
if outPath.contains("\\"):
|
|
outPath.replace("\\", "/")
|
|
self.progressBar.setValue(15)
|
|
if not outPath.endsWith("/"): outPath = outPath + "/"
|
|
self.split(inLayer, unicode(outPath), unicode(inField), self.progressBar)
|
|
self.progressBar.setValue(100)
|
|
self.outShape.clear()
|
|
QMessageBox.information(self, self.tr("Vector Split"), self.tr("Created output shapefiles in folder:\n%1").arg( outPath))
|
|
self.progressBar.setValue(0)
|
|
self.buttonOk.setEnabled( True )
|
|
|
|
def outFile(self):
|
|
self.outShape.clear()
|
|
( self.shapefileName, self.encoding ) = ftools_utils.saveDialog( self )
|
|
if self.shapefileName is None or self.encoding is None:
|
|
return
|
|
self.outShape.setText( QString( self.shapefileName ) )
|
|
|
|
def split(self, vlayer, outPath, inField, progressBar):
|
|
provider = vlayer.dataProvider()
|
|
#unique = []
|
|
index = provider.fieldNameIndex(inField)
|
|
#provider.uniqueValues(index, unique)
|
|
unique = ftools_utils.getUniqueValues(vlayer.dataProvider(), int(index))
|
|
baseName = unicode( outPath + vlayer.name() + "_" + inField + "_" )
|
|
allAttrs = provider.attributeIndexes()
|
|
provider.select(allAttrs)
|
|
fieldList = ftools_utils.getFieldList(vlayer)
|
|
sRs = provider.crs()
|
|
inFeat = QgsFeature()
|
|
progressBar.setValue(20)
|
|
start = 20.00
|
|
add = 80.00 / len(unique)
|
|
for i in unique:
|
|
check = QFile(baseName + "_" + unicode(i) + ".shp")
|
|
if check.exists():
|
|
if not QgsVectorFileWriter.deleteShapeFile(baseName + "_" + unicode(i.toString().trimmed()) + ".shp"):
|
|
return
|
|
writer = QgsVectorFileWriter(baseName + "_" + unicode(i.toString().trimmed()) + ".shp", self.encoding, fieldList, vlayer.dataProvider().geometryType(), sRs)
|
|
provider.rewind()
|
|
while provider.nextFeature(inFeat):
|
|
atMap = inFeat.attributeMap()
|
|
#changed from QVariant(i) to below:
|
|
if atMap[index] == i:
|
|
writer.addFeature(inFeat)
|
|
del writer
|
|
start = start + add
|
|
progressBar.setValue(start)
|