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))