def rasterize_list_poly(list_poly, in_met, i): print('Poly stack number ' + str(i + 1)) # create input image gt, proj, npix_x, npix_y = in_met drv = gdal.GetDriverByName('MEM') dst = drv.Create('', npix_x, npix_y, 1, gdal.GDT_Float32) sp = dst.SetProjection(proj) sg = dst.SetGeoTransform(gt) band = dst.GetRasterBand(1) band.SetNoDataValue(0) band.Fill(0, 0) del sp, sg img = GeoImg(dst) out_density = np.zeros(np.shape(img.img)) srs = osr.SpatialReference() srs.ImportFromWkt(proj) for j, poly in enumerate(list_poly): print('Poly ' + str(j + 1) + ' out of ' + str(len(list_poly))) ds_shp = ot.create_mem_shp(poly, srs) mask = ot.geoimg_mask_on_feat_shp_ds(ds_shp, img) out_density[mask] += 1 return out_density
def worldwide_coverage_density(list_poly, fn_out, res=0.05, nproc=1): #worldwide raster in lat/lon proj xmin = -180 ymax = 90 gt = (xmin, res, 0, ymax, 0, -res) npix_x = int(360 / res) npix_y = int(180 / res) proj = osr.SpatialReference() proj.ImportFromEPSG(4326) ds_out = gdal.GetDriverByName('GTiff').Create(fn_out, npix_x, npix_y, 1, gdal.GDT_Int16) ds_out.SetGeoTransform(gt) ds_out.SetProjection(proj.ExportToWkt()) band = ds_out.GetRasterBand(1) band.SetNoDataValue(0) band.Fill(0, 0) img = GeoImg(ds_out) out_density = np.zeros(np.shape(img.img)) if nproc == 1: for i, poly in enumerate(list_poly): print('Rasterizing poly number ' + str(i + 1) + ' in ' + str(len(list_poly))) ds_shp = ot.create_mem_shp(poly, proj) mask = ot.geoimg_mask_on_feat_shp_ds(ds_shp, img) out_density[mask] += 1 else: print('Using ' + str(nproc) + ' processors...') # speed up things with multiprocessing pool = mp.Pool(nproc, maxtasksperchild=1) in_met = (img.gt, img.proj_wkt, img.npix_x, img.npix_y) pack_size = int(np.ceil(len(list_poly) / nproc)) argsin_packs = [{ 'list_poly': list_poly[i:min(i + pack_size, len(list_poly))], 'in_met': in_met, 'i': k } for k, i in enumerate(np.arange(0, len(list_poly), pack_size))] outputs = pool.map(wrapper_rasterize, argsin_packs, chunksize=1) pool.close() pool.join() for output in outputs: out_density += output ds_out.GetRasterBand(1).WriteArray(out_density) ds_out = None
def out_of_poly_mask(geoimg, poly_coords): poly = ot.poly_from_coords(inter_poly_coords(poly_coords)) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) # put in a memory vector ds_shp = ot.create_mem_shp(poly, srs) return ot.geoimg_mask_on_feat_shp_ds(ds_shp, geoimg)