def setUp(self): from pyramid.paster import get_app app = get_app('development.ini') self.testapp = TestApp(app) self.grids = { '21781': getTileGrid(21781), '2056': getTileGrid(2056) }
def testgetTileGrid(self): tileGrid = getTileGrid(21781) self.assertIs(tileGrid, GeoadminTileGridLV03) self.assertIsInstance(tileGrid(), GeoadminTileGridLV03) tileGrid = getTileGrid(2056) self.assertIs(tileGrid, GeoadminTileGridLV95) self.assertIsInstance(tileGrid(), GeoadminTileGridLV95) tileGrid = getTileGrid(3857) self.assertIs(tileGrid, GlobalMercatorTileGrid) self.assertIsInstance(tileGrid(), GlobalMercatorTileGrid) tileGrid = getTileGrid(4326) self.assertIs(tileGrid, GlobalGeodeticTileGrid) self.assertIsInstance(tileGrid(), GlobalGeodeticTileGrid)
def setUp(self): from pyramid.paster import get_app dir_path = os.path.dirname(os.path.realpath(__file__)) inifile = os.path.realpath( os.path.join(dir_path, '../..', 'development.ini')) app = get_app(inifile) self.testapp = TestApp(app) self.grids = { '21781': getTileGrid(21781), '2056': getTileGrid(2056), '3857': getTileGrid(3857), '4326': getTileGrid(4326) }
def grid(bounds, minZ, maxZ): geodetic = getTileGrid(4326)(extent=bounds, originCorner='bottom-left', tmsCompatible=True) gridGenerator = geodetic.iterGrid( minZ, maxZ) for tileBounds, tileZ, tileX, tileY in gridGenerator: yield (tileBounds, (tileX, tileY, tileZ))
def computeHeader(mapName, srid): gagrid = getTileGrid(srid)() minZoom = 0 maxZoom = 28 dpi = 90.7 lods = [] for zoom in range(minZoom, maxZoom + 1): lods.append({ 'level': zoom, 'resolution': gagrid.getResolution(zoom), 'scale': gagrid.getScale(zoom), 'width': gagrid.numberOfXTilesAtZoom(zoom), 'height': gagrid.numberOfYTilesAtZoom(zoom) }) return { 'mapName': mapName, 'description': 'Configuration for the map (topic) ' + mapName, 'copyrightUnicode': 'Data ' + mapName, 'layers': [], 'spatialReference': { "wkid": gagrid.spatialReference }, 'tileInfo': { 'rows': int(gagrid.tileSizePx), # tile width in pixel 'cols': int(gagrid.tileSizePx), 'dpi': dpi, 'format': 'PNG,JPEG', 'compressionQuality': None, 'origin': { 'x': gagrid.origin[0], 'y': gagrid.origin[1] }, 'spatialReference': { 'wkid': gagrid.spatialReference }, 'lods': lods }, 'initialExtent': { 'xmin': gagrid.extent[0] + 38000.0, 'ymin': gagrid.extent[1] + 46375.0, 'xmax': gagrid.extent[2] - 60875.0, 'ymax': gagrid.extent[3] - 37500.0, 'spatialReference': { 'wkid': gagrid.spatialReference } }, 'fullExtent': { 'xmin': gagrid.extent[0], 'ymin': gagrid.extent[1], 'xmax': gagrid.extent[2], 'ymax': gagrid.extent[3], 'spatialReference': { 'wkid': gagrid.spatialReference } }, 'units': 'esriMeters', 'capabilities': 'Map' }
def _stats(self, withDb=True): self.t0 = time.time() total = 0 msg = '\n' tiles = TerrainTiles(self.dbConfigFile, self.tmsConfig, self.t0) geodetic = getTileGrid(4326)(tmsCompatible=True) bounds = (tiles.minLon, tiles.minLat, tiles.maxLon, tiles.maxLat) zooms = range(tiles.tileMinZ, tiles.tileMaxZ + 1) db = DB('configs/terrain/database.cfg') try: with db.userSession() as session: for i in xrange(0, len(zooms)): zoom = zooms[i] model = modelsPyramid.getModelByZoom(zoom) nbObjects = None if withDb: nbObjects = session.query(model).filter( model.bboxIntersects(bounds)).count() # top letf corner tileMinX, tileMinY = geodetic.tileAddress( zoom, [bounds[0], bounds[3]]) # bottom right tileMaxX, tileMaxY = geodetic.tileAddress( zoom, [bounds[2], bounds[1]]) tileBounds = geodetic.tileBounds(zoom, tileMinX, tileMinY) xCount = tileMaxX - tileMinX + 1 yCount = tileMaxY - tileMinY + 1 nbTiles = xCount * yCount total += nbTiles pointA = transformCoordinate( 'POINT(%s %s)' % (tileBounds[0], tileBounds[1]), 4326, 21781).GetPoints()[0] pointB = transformCoordinate( 'POINT(%s %s)' % (tileBounds[2], tileBounds[3]), 4326, 21781).GetPoints()[0] length = int(round(c2d.distance(pointA, pointB))) msg += 'At zoom %s:\n' % zoom msg += 'We expect %s tiles overall\n' % nbTiles msg += 'Min X is %s, Max X is %s\n' % (tileMinX, tileMaxX) msg += '%s columns over X\n' % xCount msg += 'Min Y is %s, Max Y is %s\n' % (tileMinY, tileMaxY) msg += '%s rows over Y\n' % yCount msg += '\n' msg += 'A tile side is around %s meters' % length if nbTiles > 0 and nbObjects is not None: msg += 'We have an average of about %s triangles ' \ 'per tile\n' % int(round(nbObjects / nbTiles)) msg += '\n\n' msg += '%s tiles in total.' % total except Exception as e: logger.error('An error occured during statistics collection') logger.error('%s' % e, exc_info=True) raise Exception(e) finally: db.userEngine.dispose() return (total, msg)
def createTileFromQueue(tq): pid = os.getpid() try: (qName, t0, dbConfigFile, bucketBasePath, hasLighting, hasWatermask) = tq sqs = getSQS() q = sqs.get_queue(qName) geodetic = getTileGrid(4326)(tmsCompatible=True) # we do this as long as we are finding messages in the queue while True: parseOk = True try: # 20 is maximum wait time m = q.read( visibility_timeout=visibility_timeout, wait_time_seconds=20 ) if m is None: logger.info( '[%s] No more messages found. Closing process' % pid) break body = m.get_body() tiles = map(int, body.split(',')) except Exception as e: parseOk = False if not parseOk or len(tiles) % 3 != 0: msgBody = m.get_body() logger.warning( '[%s] Unparsable message received.' 'Skipping...and removing message [%s]' % (pid, msgBody) ) q.delete_message(m) continue for i in range(0, len(tiles), 3): try: tileXYZ = [tiles[i], tiles[i + 1], tiles[i + 2]] tilebounds = geodetic.tileBounds( tileXYZ[2], tileXYZ[0], tileXYZ[1] ) createTile( (tilebounds, tileXYZ, t0, dbConfigFile, bucketBasePath, hasLighting, hasWatermask) ) except Exception as e: logger.error( '[%s] Error while processing ' 'specific tile %s' % (pid, str(e)), exc_info=True) # when successfull, we delete the message from the queue logger.info('[%s] Successfully treated an SQS message: %s' % ( pid, body)) q.delete_message(m) except Exception as e: logger.error( '[%s] Error occured during processing. ' 'Halting process ' % str(e), exc_info=True)
def getDefaultTileMatrixSet(tileMatrixSet): tilematrixSet = {} gagrid = getTileGrid(int(tileMatrixSet))() minZoom = 0 maxZoom = len(gagrid.RESOLUTIONS) for zoom in range(minZoom, maxZoom): tilematrixSet[zoom] = [ gagrid.getResolution(zoom), gagrid.numberOfXTilesAtZoom(zoom), gagrid.numberOfYTilesAtZoom(zoom), gagrid.getScale(zoom) ] tilematrixSet['MAXY'] = gagrid.MAXY if tileMatrixSet == '4326' else gagrid.MINX tilematrixSet['MINX'] = gagrid.MINX if tileMatrixSet == '4326' else gagrid.MAXY return tilematrixSet
def computeHeader(mapName, srid): gagrid = getTileGrid(srid)() minZoom = 0 maxZoom = 28 dpi = 90.7 lods = [] for zoom in range(minZoom, maxZoom + 1): lods.append( {'level': zoom, 'resolution': gagrid.getResolution(zoom), 'scale': gagrid.getScale(zoom), 'width': gagrid.numberOfXTilesAtZoom(zoom), 'height': gagrid.numberOfYTilesAtZoom(zoom)} ) return { 'mapName': mapName, 'description': 'Configuration for the map (topic) ' + mapName, 'copyrightUnicode': 'Data ' + mapName, 'layers': [], 'spatialReference': {"wkid": gagrid.spatialReference}, 'tileInfo': { 'rows': int(gagrid.tileSizePx), # tile width in pixel 'cols': int(gagrid.tileSizePx), 'dpi': dpi, 'format': 'PNG,JPEG', 'compressionQuality': None, 'origin': {'x': gagrid.origin[0], 'y': gagrid.origin[1]}, 'spatialReference': {'wkid': gagrid.spatialReference}, 'lods': lods }, 'initialExtent': { 'xmin': gagrid.extent[0] + 38000.0, 'ymin': gagrid.extent[1] + 46375.0, 'xmax': gagrid.extent[2] - 60875.0, 'ymax': gagrid.extent[3] - 37500.0, 'spatialReference': {'wkid': gagrid.spatialReference} }, 'fullExtent': { 'xmin': gagrid.extent[0], 'ymin': gagrid.extent[1], 'xmax': gagrid.extent[2], 'ymax': gagrid.extent[3], 'spatialReference': {'wkid': gagrid.spatialReference} }, 'units': 'esriMeters', 'capabilities': 'Map' }
def getDefaultTileMatrixSet(tileMatrixSet): tilematrixSet = {} tilegridClass = getTileGrid(int(tileMatrixSet)) if tileMatrixSet not in ['2056', '21781']: useSwissExtent = False else: useSwissExtent = True gagrid = tilegridClass(useSwissExtent=useSwissExtent) minZoom = 0 maxZoom = len(gagrid.RESOLUTIONS) for zoom in range(minZoom, maxZoom): tilematrixSet[zoom] = [ gagrid.getResolution(zoom), gagrid.numberOfXTilesAtZoom(zoom), gagrid.numberOfYTilesAtZoom(zoom), gagrid.getScale(zoom) ] tilematrixSet['MAXY'] = gagrid.MAXY if tileMatrixSet == '4326' else gagrid.MINX tilematrixSet['MINX'] = gagrid.MINX if tileMatrixSet == '4326' else gagrid.MAXY return tilematrixSet
def getDefaultTileMatrixSet(tileMatrixSet): tilematrixSet = {} tilegridClass = getTileGrid(int(tileMatrixSet)) if tileMatrixSet not in ['2056', '21781']: useSwissExtent = False else: useSwissExtent = True gagrid = tilegridClass(useSwissExtent=useSwissExtent) minZoom = 0 maxZoom = len(gagrid.RESOLUTIONS) for zoom in range(minZoom, maxZoom): tilematrixSet[zoom] = [ gagrid.getResolution(zoom), gagrid.numberOfXTilesAtZoom(zoom), gagrid.numberOfYTilesAtZoom(zoom), gagrid.getScale(zoom) ] tilematrixSet[ 'MAXY'] = gagrid.MAXY if tileMatrixSet == '4326' else gagrid.MINX tilematrixSet[ 'MINX'] = gagrid.MINX if tileMatrixSet == '4326' else gagrid.MAXY return tilematrixSet
def testUnsupportedTileGrid(self): with self.assertRaises(AssertionError): getTileGrid(7008)
def getClosestZoom(self, epsg, resolution): tilegrid = getTileGrid(int(epsg))() return tilegrid.getClosestZoom(float(resolution))
def _getResolutionsFromMatrixSet(self, Resolution, srid): gagrid = getTileGrid(srid)() zoomlevel = gagrid.getClosestZoom(Resolution) return gagrid.RESOLUTIONS[0:zoomlevel + 1]