def node_list(): n1 = Node(7.41275611, 46.922925, 1) n2 = Node(7.41275612, 46.922925, 2) n3 = Node(7.41275613, 46.922925, 3) n4 = Node(8.412797, 46.922942, 4) n5 = Node(8.412797, 46.922941, 5) return [n1, n2, n3, n4, n5]
def _feature_to_nodes(feature): nodes = [] coordinates = feature['geometry']['coordinates'] if isinstance(coordinates, tuple): nodes.append(Node(coordinates[1], coordinates[0], 0)) else: for coordinate in coordinates: nodes.append(Node(coordinate[1], coordinate[0], 0)) return nodes
def _calculate_tile_centres(self): centers = [] left_down = self.tile.bbox.node_left_down() right_down = self.tile.bbox.node_right_down() left_up = self.tile.bbox.node_left_up() distance_row = left_down.get_distance_in_meter(left_up) column = 0.5 row = 0.5 while distance_row > self._step_distance: current_node_row = left_down.step_to(left_up, self._step_distance * row) distance_column = left_down.get_distance_in_meter(right_down) while distance_column > self._step_distance: current_node_column = left_down.step_to( right_down, self._step_distance * column) new_node = Node(current_node_row.latitude, current_node_column.longitude) centers.append(new_node) distance_column = current_node_column.get_distance_in_meter( right_down) column += 1 distance_row = current_node_row.get_distance_in_meter(left_up) column = 0.5 row += 1 return centers
def _generate_street(data): streets = [] for feature in data['features']: coordinates = feature['geometry']['coordinates'] nodes = [] for coordinate in coordinates: nodes.append(Node(coordinate[1], coordinate[0])) streets.append(Street(nodes)) return streets
def big_node_list(): return [ Node(47.09572760391754, 9.354246854782108, 0.0), Node(47.09569108531167, 9.353826284408573, 0.0), Node(47.095734907638715, 9.353978633880619, 0.0), Node(47.091450260764105, 9.347023665904997, 0.0), Node(47.09598323415865, 9.353849887847904, 0.0), Node(47.09582072636252, 9.354110956192018, 0.0), Node(47.095880982062205, 9.353635311126713, 0.0), Node(47.09582255229281, 9.353581666946415, 0.0) ]
def _get_centre(nodes): sum_lat = 0 sum_lon = 0 for node in nodes: sum_lat += node.latitude sum_lon += node.longitude length = len(nodes) centre_latitude = sum_lat / length centre_longitude = sum_lon / length return Node(centre_latitude, centre_longitude, 0)
def _merge(sub_graph): node_count = len(sub_graph) latitude_sum = 0 longitude_sum = 0 for node in sub_graph: latitude_sum += node.latitude longitude_sum += node.longitude latitude = latitude_sum / node_count longitude = longitude_sum / node_count merged = Node(latitude, longitude, 0) return merged
def get_node(self, pixel): x = pixel[0] y = pixel[1] x_count = self.image.size[0] y_count = self.image.size[1] y_part = (y_count - y) / float(y_count) x_part = x / float(x_count) lat_diff = float(self.bbox.top) - float(self.bbox.bottom) lon_diff = float(self.bbox.right) - float(self.bbox.left) lat = float(self.bbox.bottom) + lat_diff * y_part lon = float(self.bbox.left) + lon_diff * x_part return Node(lat, lon)
def _calculate_tile_centres(self): centers = [] # [out:csv(::lat,::lon)][timeout:25];node["public_transport"="platform"]({{bbox}});out; self.api = OverpassApi() data = self.api.get(self.tile.bbox, self.tags, nodes=True, ways=False, relations=False, responseformat='csv(::lat,::lon)') data = list(map(lambda cc: Node(float(cc[0]), float(cc[1])), data[1:])) print(data) return data
def _generate_street(data): streets = [] for feature in data['features']: coordinates = feature['geometry']['coordinates'] nodes = [] for coordinate in coordinates: try: lat, lon = coordinate[1], coordinate[0] except TypeError: logger.exception() logger.warn("feature was: {}, coordinate was: {}".format(feature, coordinate)) else: nodes.append(Node(lat, lon)) streets.append(Street(nodes)) return streets
def get_node(self, pixel=(0, 0)): x = pixel[0] y = pixel[1] image_size_x, image_size_y = self.image_api.get_image_size(self.bbox) y_part = 0 x_part = 0 if image_size_x > 0 and image_size_y > 0: y_part = (image_size_y - y) / float(image_size_y) x_part = x / float(image_size_x) lat_diff = float(self.bbox.top) - float(self.bbox.bottom) lon_diff = float(self.bbox.right) - float(self.bbox.left) lat = float(self.bbox.bottom) + lat_diff * y_part lon = float(self.bbox.left) + lon_diff * x_part return Node(lat, lon)
def main(args): coords = [args.coord[i:i + 2] for i in range(0, len(args.coord), 2)] coords = list(map(lambda c: Node(*c), coords)) bbox = Bbox.from_nodes(coords[0], coords[1]) if args.tags: tags = map(lambda kv: Tag(key=kv[0], value=kv[1]), map(lambda kv: kv.split('=', 1), args.tags.split(','))) walker = OsmObjectWalker(Tile(image_api=WmsApi(), bbox=bbox), tags, square_image_length=100) else: walker = CoordWalker(Tile(image_api=WmsApi(), bbox=bbox), coords, square_image_length=100) tiles = walker.get_tiles() for n, t in enumerate(tiles): centre_node = t.get_centre_node() name = "fetch/{0:02.8}_{1:02.8}.png".format(centre_node.latitude, centre_node.longitude) t.image.save(name, "PNG") print(name)
def get_centre_node(self): diff_lat = self.bbox.node_right_up().latitude - self.bbox.node_left_down().latitude diff_lon = self.bbox.node_right_up().longitude - self.bbox.node_left_down().longitude node = Node(self.bbox.node_left_down().latitude + diff_lat / 2, self.bbox.node_left_down().longitude + diff_lon / 2) return node
def node_left_down(self): return Node(self.bottom, self.left)
def node_left_up(self): return Node(self.top, self.left)
def node_right_up(self): return Node(self.top, self.right)
def node_right_down(self): return Node(self.bottom, self.right)
def same_node(): return Node(46.78351333884473, 8.159137666225423, 10)
def test_not_in_bbox(rappi): bbox = rappi node = Node(48.0, 8.8) assert bbox.in_bbox(node) == False
def test_in_bbox(rappi): bbox = rappi node = Node(47.22, 8.82) assert bbox.in_bbox(node) == True
def test_reduce_not_same_points(same_node): node = Node(46.78351333884473, 8.159137666225423, 0) merger = NodeMerger([node, same_node]) merged_nodes = merger.reduce() assert len(merged_nodes) == 1
def test_node_equality(node1): node = Node('47.0', '8.0', 10) assert node == node1
def test_instantiate_string(): node = Node('47.0', '8.0', 10) assert node.latitude == 47.0 assert node.longitude == 8.0 assert node.osm_id == 10
def test_instantiate(): node = Node(47.0, 8.0, 10) assert node.latitude == 47.0 assert node.longitude == 8.0 assert node.osm_id == 10
def node1(): return Node('47.0', '8.0', 10)
def node(): return Node(47.0912, 9.3470236659, 0)
def node2(): return Node('47.1', '8.1', 10)