pktools  2.6.7
Processing Kernel for geospatial data
pkextract_random.py
1 # -*- coding: utf-8 -*-
2 
3 """
4 ***************************************************************************
5  pkextract_random.py
6  ---------------------
7  Date : April 2015
8  Copyright : (C) 2015 by Pieter Kempeneers
9  Email : kempenep at gmail dot com
10 ***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************
18 """
19 
20 __author__ = 'Pieter Kempeneers'
21 __date__ = 'April 2015'
22 __copyright__ = '(C) 2015, Pieter Kempeneers'
23 # This will get replaced with a git SHA1 when you do a git archive
24 __revision__ = '$Format:%H$'
25 
26 import os
27 from pktoolsUtils import pktoolsUtils
28 from pktoolsAlgorithm import pktoolsAlgorithm
29 from processing.core.parameters import ParameterRaster
30 from processing.core.parameters import ParameterVector
31 from processing.core.outputs import OutputVector
32 from processing.core.parameters import ParameterSelection
33 from processing.core.parameters import ParameterNumber
34 from processing.core.parameters import ParameterString
35 from processing.core.parameters import ParameterBoolean
36 from processing.core.parameters import ParameterExtent
37 
38 FORMATS = [
39  'ESRI Shapefile',
40  'GeoJSON',
41  'GeoRSS',
42  'SQLite',
43  'GMT',
44  'MapInfo File',
45  'INTERLIS 1',
46  'INTERLIS 2',
47  'GML',
48  'Geoconcept',
49  'DXF',
50  'DGN',
51  'CSV',
52  'BNA',
53  'S57',
54  'KML',
55  'GPX',
56  'PGDump',
57  'GPSTrackMaker',
58  'ODS',
59  'XLSX',
60  'PDF',
61 ]
62 EXTS = [
63  '.shp',
64  '.geojson',
65  '.xml',
66  '.sqlite',
67  '.gmt',
68  '.tab',
69  '.ili',
70  '.ili',
71  '.gml',
72  '.txt',
73  '.dxf',
74  '.dgn',
75  '.csv',
76  '.bna',
77  '.000',
78  '.kml',
79  '.gpx',
80  '.pgdump',
81  '.gtm',
82  '.ods',
83  '.xlsx',
84  '.pdf',
85 ]
86 
88 
89  INPUT = "INPUT"
90  OUTPUT = "OUTPUT"
91 
92  RULE_OPTIONS = ['centroid', 'point', 'mean', 'proportion', 'custom', 'min', 'max', 'mode', 'sum', 'median', 'stdev', 'percentile']
93 
94  RULE = "RULE"
95  POLYGON = "POLYGON"
96  BUFFER = "BUFFER"
97  RANDOM = "RANDOM"
98  SRCNODATA = "SRCNODATA"
99  BNDNODATA = "BNDNODATA"
100  EXTRA = 'EXTRA'
101 
102  FORMAT = "FORMAT"
103 
104  def cliName(self):
105  return "pkextractogr"
106 
107  def defineCharacteristics(self):
108  self.name = "extract random points"
109  self.group = "[pktools] raster/vector"
110  self.addParameter(ParameterRaster(self.INPUT, 'Input raster data set'))
111  self.addParameter(ParameterSelection(self.RULE,"extraction rule",self.RULE_OPTIONS, 0))
112 
113  self.addOutput(OutputVector(self.OUTPUT, 'Output vector data set'))
114  self.addParameter(ParameterSelection(self.FORMAT,
115  'Destination Format', FORMATS))
116 
117  self.addParameter(ParameterBoolean(self.POLYGON, "Create OGRPolygon as geometry instead of OGRPoint",False))
118  self.addParameter(ParameterNumber(self.BUFFER, "Buffer for calculating statistics for point features",1,25,1))
119  self.addParameter(ParameterNumber(self.RANDOM, "Number of random points to generate",0,1000000,100))
120 
121  self.addParameter(ParameterString(self.SRCNODATA, "invalid value(s) for input raster dataset (e.g., 0;255)","none"))
122  self.addParameter(ParameterString(self.BNDNODATA, "Band(s) in input image to check if pixel is valid (e.g., 0;1)","0"))
123  self.addParameter(ParameterString(self.EXTRA,
124  'Additional parameters', '', optional=True))
125 
126  def processAlgorithm(self, progress):
127  cliPath = '"' + os.path.join(pktoolsUtils.pktoolsPath(), self.cliName()) + '"'
128  commands = [cliPath]
129 
130  input=self.getParameterValue(self.INPUT)
131  commands.append('-i')
132  commands.append('"' + input + '"')
133 
134  commands.append("-r")
135  commands.append(self.RULE_OPTIONS[self.getParameterValue(self.RULE)])
136 
137  output = self.getOutputFromName(self.OUTPUT)
138  outFile = output.value
139  formatIdx = self.getParameterValue(self.FORMAT)
140  outFormat = '"' + FORMATS[formatIdx] + '"'
141  commands.append('-f')
142  commands.append(outFormat)
143  ext = EXTS[formatIdx]
144  if not outFile.endswith(ext):
145  outFile += ext
146  output.value = outFile
147  commands.append('-o')
148  commands.append('"' + outFile + '"')
149 
150  if self.getParameterValue(self.POLYGON):
151  commands.append("-polygon")
152  buffer=self.getParameterValue(self.BUFFER)
153  if buffer > 1:
154  commands.append("-buf")
155  commands.append(str(buffer))
156 
157  if self.getParameterValue(self.RANDOM) > 0:
158  commands.append("-rand")
159  commands.append(str(self.getParameterValue(self.RANDOM)))
160 
161  srcnodata=self.getParameterValue(self.SRCNODATA)
162  if srcnodata != "none":
163  srcnodataValues = srcnodata.split(';')
164  for srcnodataValue in srcnodataValues:
165  commands.append('-srcnodata')
166  commands.append(srcnodataValue)
167  bndnodata=self.getParameterValue(self.BNDNODATA)
168  bndnodataValues = bndnodata.split(';')
169  for bndnodataValue in bndnodataValues:
170  commands.append('-bndnodata')
171  commands.append(bndnodataValue)
172 
173  extra = str(self.getParameterValue(self.EXTRA))
174  if len(extra) > 0:
175  commands.append(extra)
176 
177 
178  pktoolsUtils.runpktools(commands, progress)