Пример #1
0
def read_bathymetry_file():
    log.info('Building irregular-grid index from bathymetry file.  This will take awhile.')
    then = datetime.now()
    def take(k, source):
        while k>0:
            yield re.split(r'\s*', source.readline().strip())
            k -= 1

    src = open(settings.BATHYMETRY_SOURCE_FILE)
    version = src.readline().strip()
    num_edges, num_nodes = [int(k) for k in re.split(r'\s*', src.readline().strip())]

    log.info("Reading {num_edges} triangles from {num_nodes} total nodes".format(num_edges=num_edges, num_nodes=num_nodes))

    zvalues = np.empty(num_nodes+1, dtype=np.float_)
    nodes_arr = np.empty((num_nodes+1, 2), dtype=np.float_)
    triangle_arr = np.empty((num_edges+1, 3), dtype=np.int_)
    triangle_coords_arr = np.empty((num_edges+1, 3, 2), dtype=np.float_)
    #triangle_coords_arr = {}

    for node, x, y, z in take(num_nodes, src):
        node = int(node)
        nodes_arr[node][0] = float(x)
        nodes_arr[node][1] = float(y)
        zvalues[node] = z

    log.info('Built node array')

    for triangle, dim, node1, node2, node3 in take(num_edges, src):
        node1 = int(node1)
        node2 = int(node2)
        node3 = int(node3)
        triangle = int(triangle)

        triangle_arr[triangle][0] = node1
        triangle_arr[triangle][1] = node2
        triangle_arr[triangle][2] = node3

        triangle_coords_arr[triangle][0] = nodes_arr[node1]
        triangle_coords_arr[triangle][1] = nodes_arr[node2]
        triangle_coords_arr[triangle][2] = nodes_arr[node3]

        #triangle_coords_arr[triangle] = Polygon(( tuple(nodes_arr[node1]), tuple(nodes_arr[node2]), tuple(nodes_arr[node3]), tuple(nodes_arr[node1]) ), srid=4326)

    log.info('Built triangle array')

    obj = StaticArray.objects.filter(name='bathymetry', long_name='bathymetry').first() or StaticArray(name='bathymetry', long_name='bathymetry')
    obj.data = pickle.dumps(zvalues)
    obj.save()

    log.info('Saved bathymetry data')

    if os.path.exists(settings.BATHYMETRY_INDEX_FILE + '.idx'):
        os.unlink(settings.BATHYMETRY_INDEX_FILE + '.idx')
        os.unlink(settings.BATHYMETRY_INDEX_FILE + '.dat')

    index = GeoIndex(settings.BATHYMETRY_INDEX_FILE, 'bathymetry', str, int, clear=True) # bulk load

    cs = ((i, triangle_arr[i]) for i in range(1, triangle_arr.shape[0]))
    triangles = ((i, Polygon(( tuple(nodes_arr[c1]), tuple(nodes_arr[c2]), tuple(nodes_arr[c3]), tuple(nodes_arr[c1]) ), srid=4326) ) for i, (c1, c2, c3) in cs)
    index.bulk_insert(triangles)

    log.info('saved geometry index')

    np.save(settings.BATHYMETRY_INDEX_FILE + "bathymetry.nodes.npy", triangle_arr)
    log.info('saved nodes')
    np.save(settings.BATHYMETRY_INDEX_FILE + 'bathymetry.coords.npy', triangle_coords_arr)
    log.info('saved coordinates')

    index.close()
    delta = datetime.now() - then
    log.info('Finished building index in {secs} seconds.'.format(secs=delta.seconds))