Beispiel #1
0
 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)
Beispiel #3
0
 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 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)
Beispiel #5
0
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))
Beispiel #6
0
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'
    }
Beispiel #7
0
    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)
Beispiel #8
0
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)
Beispiel #9
0
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
Beispiel #10
0
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'
    }
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
 def testUnsupportedTileGrid(self):
     with self.assertRaises(AssertionError):
         getTileGrid(7008)
Beispiel #14
0
 def getClosestZoom(self, epsg, resolution):
     tilegrid = getTileGrid(int(epsg))()
     return tilegrid.getClosestZoom(float(resolution))
Beispiel #15
0
 def _getResolutionsFromMatrixSet(self, Resolution, srid):
     gagrid = getTileGrid(srid)()
     zoomlevel = gagrid.getClosestZoom(Resolution)
     return gagrid.RESOLUTIONS[0:zoomlevel + 1]
Beispiel #16
0
 def _getResolutionsFromMatrixSet(self, Resolution, srid):
     gagrid = getTileGrid(srid)()
     zoomlevel = gagrid.getClosestZoom(Resolution)
     return gagrid.RESOLUTIONS[0:zoomlevel + 1]
Beispiel #17
0
 def getClosestZoom(self, epsg, resolution):
     tilegrid = getTileGrid(int(epsg))()
     return tilegrid.getClosestZoom(float(resolution))
 def testUnsupportedTileGrid(self):
     with self.assertRaises(AssertionError):
         getTileGrid(7008)