def _create_grid(self, grid_name, grid_file, x_min, y_min, x_max, y_max, x_off, y_off): x_off2, y_off2 = x_off / 2.0, y_off / 2.0 x_min = floor(x_min / x_off) * x_off x_max = ceil(x_max / x_off) * x_off y_min = floor(y_min / y_off) * y_off y_max = ceil(y_max / y_off) * y_off xtotal = int((x_max - x_min) / x_off) + 1 ytotal = int((y_max - y_min) / y_off) + 1 logAPICall.log( "x_min %f x_max %f y_min %f y_max %f x_off %f y_off %f xtotal %d, ytotal %d" % (x_min, x_max, y_min, y_max, x_off, y_off, xtotal, ytotal), logAPICall.DEBUG_L2, ) fields = {0: QgsField("GRID_GID", QVariant.String)} writer = QgsVectorFileWriter(grid_file, "utf-8", fields, QGis.WKBPolygon, self._crs, "ESRI Shapefile") f = QgsFeature() for x in range(xtotal): for y in range(ytotal): lon = x_min + (x * x_off) + (x_off2) lat = y_min + (y * y_off) + (y_off2) # out_geom = QgsGeometry.fromRect(QgsRectangle(lon-x_off2, lat-y_off2, # lon+x_off2, lat+y_off2)) f.setGeometry(self._outputGeometryFromLatLon(lat, lon)) f.addAttribute(0, QVariant(latlon_to_grid(lat, lon))) writer.addFeature(f) del writer return load_shapefile(grid_file, grid_name)
def _create_grid(self, grid_name, grid_file, x_min, y_min, x_max, y_max, x_off, y_off): x_off2, y_off2 = x_off / 2.0, y_off / 2.0 x_min = floor(x_min / x_off) * x_off x_max = ceil(x_max / x_off) * x_off y_min = floor(y_min / y_off) * y_off y_max = ceil(y_max / y_off) * y_off xtotal = int((x_max - x_min) / x_off)+1 ytotal = int((y_max - y_min) / y_off)+1 logAPICall.log('x_min %f x_max %f y_min %f y_max %f x_off %f y_off %f xtotal %d, ytotal %d' % (x_min, x_max, y_min, y_max, x_off, y_off, xtotal, ytotal), logAPICall.DEBUG_L2) fields = { 0 : QgsField('GRID_GID', QVariant.String), } writer = QgsVectorFileWriter(grid_file, "utf-8", fields, QGis.WKBPolygon, self._crs, "ESRI Shapefile") f = QgsFeature() for x in range(xtotal): for y in range(ytotal): lon = x_min + (x * x_off) + (x_off2) lat = y_min + (y * y_off) + (y_off2) #out_geom = QgsGeometry.fromRect(QgsRectangle(lon-x_off2, lat-y_off2, # lon+x_off2, lat+y_off2)) f.setGeometry(self._outputGeometryFromLatLon(lat, lon)) f.addAttribute(0, QVariant(latlon_to_grid(lat, lon))) writer.addFeature(f) del writer return load_shapefile(grid_file, grid_name)
def test_Grid(self): from utils.grid import latlon_to_grid, grid_to_latlon lats = [ 33.995833, -5.6625, -3.1375, 6.12083] lons = [-112.004167, 106.104167, -12.412541, 85.22916] for lat, lon in map(None, lats, lons): grid = latlon_to_grid(lat, lon) lat2, lon2 = grid_to_latlon(grid) self.assertAlmostEqual(lat, lat2, places=4) self.assertAlmostEqual(lon, lon2, places=4)
def _outputGeometryFromLatLon(self, lat, lon): # conversion lat/lon to grid_id is required # it acts as rounding function to lat/lon return self._outputGeometryFromGridId(latlon_to_grid(lat, lon))
def do_operation(self): """ perform create mappin """ # validate inputs popgrid_layer = self.inputs[0].value zone_layer = self.inputs[1].value zone_field = self.inputs[2].value pop_to_bldg = float(self.inputs[3].value) # make sure input is correct # NOTE: these checks cannot be performed at set input time # because the data layer maybe is not loaded yet self._test_layer_loaded(popgrid_layer) self._test_layer_field_exists(popgrid_layer, CNT_FIELD_NAME) self._test_layer_loaded(zone_layer) self._test_layer_field_exists(zone_layer, zone_field) # count_field is not required # if count field is not defined, then generate building count from footprints # local variables analyzer = QgsOverlayAnalyzer() # intersect grids and zones to obtain polygons with # - population and zone_id # - apply ratio to population to obtain building count tmp_join = 'joined_%s' % get_unique_filename() tmp_join_file = '%s%s.shp' % (self._tmp_dir, tmp_join) try: # do intersection analyzer.intersection(popgrid_layer, zone_layer, tmp_join_file) tmp_join_layer = load_shapefile(tmp_join_file, tmp_join) except AssertionError as err: raise OperatorError(str(err), self.__class__) except Exception as err: raise OperatorError(str(err), self.__class__) # generate grid with building counts fields = { 0 : QgsField(GID_FIELD_NAME, QVariant.String), 1 : QgsField(zone_field, QVariant.String), 2 : QgsField(CNT_FIELD_NAME, QVariant.Double), } output_layername = 'grid_%s' % get_unique_filename() output_file = '%s%s.shp' % (self._tmp_dir, output_layername) writer = QgsVectorFileWriter(output_file, "utf-8", fields, QGis.WKBPolygon, self._crs, "ESRI Shapefile") f = QgsFeature() pop_idx = layer_field_index(tmp_join_layer, CNT_FIELD_NAME) zone_idx = layer_field_index(tmp_join_layer, zone_field) for _f in layer_features(tmp_join_layer): pop_count = _f.attributeMap()[pop_idx].toDouble()[0] zone = _f.attributeMap()[zone_idx].toString() # 1. get geometry geom = _f.geometry() # 2. get original centroid point and project is required centroid = geom.centroid().asPoint() grid_gid = latlon_to_grid(centroid.y(), centroid.x()) f.setGeometry(self._outputGeometryFromGridId(grid_gid)) f.addAttribute(0, grid_gid) f.addAttribute(1, zone) f.addAttribute(2, pop_count / pop_to_bldg) writer.addFeature(f) del writer # clean up del tmp_join_layer remove_shapefile(tmp_join_file) # store data in output self._load_output(output_file, output_layername)
def do_operation(self): """ perform create mappin """ # validate inputs popgrid_layer = self.inputs[0].value zone_layer = self.inputs[1].value zone_field = self.inputs[2].value pop_to_bldg = float(self.inputs[3].value) # make sure input is correct # NOTE: these checks cannot be performed at set input time # because the data layer maybe is not loaded yet self._test_layer_loaded(popgrid_layer) self._test_layer_field_exists(popgrid_layer, CNT_FIELD_NAME) self._test_layer_loaded(zone_layer) self._test_layer_field_exists(zone_layer, zone_field) # count_field is not required # if count field is not defined, then generate building count from footprints # local variables analyzer = QgsOverlayAnalyzer() # intersect grids and zones to obtain polygons with # - population and zone_id # - apply ratio to population to obtain building count tmp_join = "joined_%s" % get_unique_filename() tmp_join_file = "%s%s.shp" % (self._tmp_dir, tmp_join) try: # do intersection analyzer.intersection(popgrid_layer, zone_layer, tmp_join_file) tmp_join_layer = load_shapefile(tmp_join_file, tmp_join) except AssertionError as err: raise OperatorError(str(err), self.__class__) except Exception as err: raise OperatorError(str(err), self.__class__) # generate grid with building counts fields = { 0: QgsField(GID_FIELD_NAME, QVariant.String), 1: QgsField(zone_field, QVariant.String), 2: QgsField(CNT_FIELD_NAME, QVariant.Double), } output_layername = "grid_%s" % get_unique_filename() output_file = "%s%s.shp" % (self._tmp_dir, output_layername) writer = QgsVectorFileWriter(output_file, "utf-8", fields, QGis.WKBPolygon, self._crs, "ESRI Shapefile") f = QgsFeature() pop_idx = layer_field_index(tmp_join_layer, CNT_FIELD_NAME) zone_idx = layer_field_index(tmp_join_layer, zone_field) for _f in layer_features(tmp_join_layer): pop_count = _f.attributeMap()[pop_idx].toDouble()[0] zone = _f.attributeMap()[zone_idx].toString() # 1. get geometry geom = _f.geometry() # 2. get original centroid point and project is required centroid = geom.centroid().asPoint() grid_gid = latlon_to_grid(centroid.y(), centroid.x()) f.setGeometry(self._outputGeometryFromGridId(grid_gid)) f.addAttribute(0, grid_gid) f.addAttribute(1, zone) f.addAttribute(2, pop_count / pop_to_bldg) writer.addFeature(f) del writer # clean up del tmp_join_layer remove_shapefile(tmp_join_file) # store data in output self._load_output(output_file, output_layername)
@logAPICall def do_operation(self): """ perform create mapping scheme operation """ # input/output verification already performed during set input/ouput svy_layer = self.inputs[0].value # make sure input is correct # NOTE: these checks cannot be performed at set input time # because the data layer maybe is not loaded yet self._test_layer_loaded(svy_layer) total_features = svy_layer.dataProvider().featureCount() if total_features > MAX_FEATURES_IN_MEMORY: # use bsddb to store temporary lat/lon tmp_db_file = '%sdb_%s.db' % (self._tmp_dir, get_unique_filename()) db = bsddb.btopen(tmp_db_file, 'c') else: db = {} # tally statistics for each grid_id/building type combination tax_idx = layer_field_index(svy_layer, TAX_FIELD_NAME) for f in layer_features(svy_layer): geom = f.geometry() centroid = geom.centroid().asPoint() grid_id = latlon_to_grid(centroid.y(), centroid.x()) tax_str = str(f.attributeMap()[tax_idx].toString()) key = '%s %s' % (tax_str, grid_id) if db.has_key(key): db[key] = str(int(db[key]) + 1) # value as string required by bsddb else: db[key] = '1' # value as string required by bsddb # loop through all zones and assign mapping scheme # outputs exposure_layername = 'exp_%s' % get_unique_filename() exposure_file = '%s%s.shp' % (self._tmp_dir, exposure_layername) try: writer = QgsVectorFileWriter(exposure_file, "utf-8", self._fields, self._outputGeometryType(), self._crs, "ESRI Shapefile") f = QgsFeature() gid = 0 for key, val in db.iteritems(): (tax_str, grid_id) = key.split(' ') lon, lat = grid_to_latlon(int(grid_id)) f.setGeometry(self._outputGeometryFromGridId(grid_id)) f.addAttribute(0, QVariant(grid_id)) f.addAttribute(1, QVariant(lon)) f.addAttribute(2, QVariant(lat)) f.addAttribute(3, QVariant(tax_str)) f.addAttribute(4, QVariant('')) f.addAttribute(5, QVariant(val)) writer.addFeature(f) gid += 1 del writer, f except Exception as err: remove_shapefile(exposure_file) raise OperatorError("error creating exposure file: %s" % err, self.__class__) # load shapefile as layer exposure_layer = load_shapefile(exposure_file, exposure_layername) if not exposure_layer: raise OperatorError('Error loading exposure file %s' % (exposure_file), self.__class__) # store data in output self.outputs[0].value = exposure_layer
def do_operation(self): """ perform create mapping scheme operation """ # input/output verification already performed during set input/ouput svy_layer = self.inputs[0].value # make sure input is correct # NOTE: these checks cannot be performed at set input time # because the data layer maybe is not loaded yet self._test_layer_loaded(svy_layer) total_features = svy_layer.dataProvider().featureCount() if total_features > MAX_FEATURES_IN_MEMORY: # use bsddb to store temporary lat/lon tmp_db_file = '%sdb_%s.db' % (self._tmp_dir, get_unique_filename()) db = bsddb.btopen(tmp_db_file, 'c') else: db = {} # tally statistics for each grid_id/building type combination tax_idx = layer_field_index(svy_layer, TAX_FIELD_NAME) for f in layer_features(svy_layer): geom = f.geometry() centroid = geom.centroid().asPoint() grid_id = latlon_to_grid(centroid.y(), centroid.x()) tax_str = str(f.attributeMap()[tax_idx].toString()) key = '%s %s' % (tax_str, grid_id) if db.has_key(key): db[key] = str(int(db[key]) + 1) # value as string required by bsddb else: db[key] = '1' # value as string required by bsddb # loop through all zones and assign mapping scheme # outputs exposure_layername = 'exp_%s' % get_unique_filename() exposure_file = '%s%s.shp' % (self._tmp_dir, exposure_layername) try: writer = QgsVectorFileWriter(exposure_file, "utf-8", self._fields, self._outputGeometryType(), self._crs, "ESRI Shapefile") f = QgsFeature() gid = 0 for key, val in db.iteritems(): (tax_str, grid_id) = key.split(' ') lon, lat = grid_to_latlon(int(grid_id)) f.setGeometry(self._outputGeometryFromGridId(grid_id)) f.addAttribute(0, QVariant(grid_id)) f.addAttribute(1, QVariant(lon)) f.addAttribute(2, QVariant(lat)) f.addAttribute(3, QVariant(tax_str)) f.addAttribute(4, QVariant('')) f.addAttribute(5, QVariant(val)) writer.addFeature(f) gid += 1 del writer, f except Exception as err: remove_shapefile(exposure_file) raise OperatorError("error creating exposure file: %s" % err, self.__class__) # load shapefile as layer exposure_layer = load_shapefile(exposure_file, exposure_layername) if not exposure_layer: raise OperatorError( 'Error loading exposure file %s' % (exposure_file), self.__class__) # store data in output self.outputs[0].value = exposure_layer self.outputs[1].value = exposure_file