mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-26 00:02:08 -05:00
70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
from sextante.core.GeoAlgorithm import GeoAlgorithm
|
|
import os.path
|
|
from PyQt4 import QtGui
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
from qgis.core import *
|
|
from sextante.parameters.ParameterVector import ParameterVector
|
|
from sextante.core.QGisLayers import QGisLayers
|
|
from sextante.ftools import ftools_utils
|
|
import math
|
|
from sextante.outputs.OutputHTML import OutputHTML
|
|
|
|
class NearestNeighbourAnalysis(GeoAlgorithm):
|
|
|
|
POINTS = "POINTS"
|
|
OUTPUT = "OUTPUT"
|
|
|
|
def getIcon(self):
|
|
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/neighbour.png")
|
|
|
|
def processAlgorithm(self, progress):
|
|
output = self.getOutputValue(NearestNeighbourAnalysis.OUTPUT)
|
|
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(NearestNeighbourAnalysis.POINTS))
|
|
vprovider = vlayer.dataProvider()
|
|
allAttrs = vprovider.attributeIndexes()
|
|
vprovider.select( allAttrs )
|
|
feat = QgsFeature()
|
|
neighbour = QgsFeature()
|
|
sumDist = 0.00
|
|
distance = QgsDistanceArea()
|
|
A = vlayer.extent()
|
|
A = float( A.width() * A.height() )
|
|
index = ftools_utils.createIndex( vprovider )
|
|
vprovider.rewind()
|
|
nFeat = vprovider.featureCount()
|
|
nElement = 0
|
|
while vprovider.nextFeature( feat ):
|
|
neighbourID = index.nearestNeighbor( feat.geometry().asPoint(), 2 )[ 1 ]
|
|
vprovider.featureAtId( neighbourID, neighbour, True, [] )
|
|
nearDist = distance.measureLine( neighbour.geometry().asPoint(), feat.geometry().asPoint() )
|
|
sumDist += nearDist
|
|
nElement += 1
|
|
progress.setPercentage(int(nElement/nFeat * 100))
|
|
nVal = vprovider.featureCount()
|
|
do = float( sumDist) / nVal
|
|
de = float( 0.5 / math.sqrt( nVal / A ) )
|
|
d = float( do / de )
|
|
SE = float( 0.26136 / math.sqrt( ( nVal * nVal ) / A ) )
|
|
zscore = float( ( do - de ) / SE )
|
|
lstStats = []
|
|
lstStats.append("Observed mean distance:" + unicode( do ) )
|
|
lstStats.append("Expected mean distance:" + unicode( de ) )
|
|
lstStats.append("Nearest neighbour index:" + unicode( d ) )
|
|
lstStats.append("N:" + unicode( nVal ) )
|
|
lstStats.append("Z-Score:" + unicode( zscore ) )
|
|
self.createHTML(output, lstStats)
|
|
|
|
|
|
def createHTML(self, outputFile, lstStats):
|
|
f = open(outputFile, "w")
|
|
for s in lstStats:
|
|
f.write("<p>" + str(s) + "</p>")
|
|
f.close()
|
|
|
|
|
|
def defineCharacteristics(self):
|
|
self.name = "Nearest neighbour analysis"
|
|
self.group = "Analysis tools"
|
|
self.addParameter(ParameterVector(NearestNeighbourAnalysis.POINTS, "Points", ParameterVector.VECTOR_TYPE_POINT))
|
|
self.addOutput(OutputHTML(NearestNeighbourAnalysis.OUTPUT, "Result")) |