def test_passing_incorrect_custom_filter(test_pbf): from pyrosm import OSM osm = OSM(filepath=test_pbf) try: osm.get_natural(custom_filter="wrong") except ValueError as e: if "dictionary" in str(e): pass except Exception as e: raise e
def test_adding_extra_attribute(helsinki_pbf): from pyrosm import OSM from geopandas import GeoDataFrame osm = OSM(filepath=helsinki_pbf) gdf = osm.get_natural() extra_col = "wikidata" extra = osm.get_natural(extra_attributes=[extra_col]) # The extra should have one additional column compared to the original one assert extra.shape[1] == gdf.shape[1] + 1 # Should have same number of rows assert extra.shape[0] == gdf.shape[0] assert extra_col in extra.columns assert len(extra[extra_col].dropna().unique()) > 0 assert isinstance(gdf, GeoDataFrame)
def compute_geometry(self, bbox, filename=None): """ Parse OSM file (area in bbox) to retrieve information about geometry. :param Sequence[float] bbox: area to be parsed in format (min_lon, min_lat, max_lon, max_lat) :param Optional[str] filename: map file in .osm.pbf format or None (map will be downloaded) """ assert len(bbox) == 4 self.bbox_size = (fabs(bbox[2] - bbox[0]), fabs(bbox[3] - bbox[1])) if filename is None: converter = OsmConverter(bbox) filename = converter.filename osm = OSM(filename, bounding_box=bbox) multipolygons = GeoDataFrame(columns=['tag', 'geometry']) natural = osm.get_natural() if natural is not None: natural = natural.loc[:, ['natural', 'geometry']].rename( columns={'natural': 'tag'}) self.polygons = self.polygons.append( natural.loc[natural.geometry.type == 'Polygon']) multipolygons = multipolygons.append( natural.loc[natural.geometry.type == 'MultiPolygon']) natural.drop(natural.index, inplace=True) landuse = osm.get_landuse() if landuse is not None: landuse = landuse.loc[:, ['landuse', 'geometry']].rename( columns={'landuse': 'tag'}) self.polygons = self.polygons.append( landuse.loc[landuse.geometry.type == 'Polygon']) multipolygons = multipolygons.append( landuse.loc[landuse.geometry.type == 'MultiPolygon']) landuse.drop(landuse.index, inplace=True) # splitting multipolygons to polygons for i in range(multipolygons.shape[0]): tag = multipolygons.tag.iloc[i] for polygon in multipolygons.geometry.iloc[i].geoms: self.polygons = self.polygons.append( { 'tag': tag, 'geometry': polygon }, ignore_index=True) roads = osm.get_network() if roads is not None: roads = self.__dissolve(roads[["highway", "geometry"]]) self.multilinestrings = GeoDataFrame( roads.loc[roads.geometry.type == 'MultiLineString']).rename( columns={'highway': 'tag'}) self.tag_value.eval(self.polygons, self.multilinestrings, "tag")
def test_reading_natural_from_area_having_none(helsinki_pbf): from pyrosm import OSM from geopandas import GeoDataFrame # Bounding box for area that does not have any data bbox = [24.939753, 60.173388, 24.941269, 60.174829] osm = OSM(filepath=helsinki_pbf, bounding_box=bbox) # The tool should warn if no buildings were found with pytest.warns(UserWarning) as w: gdf = osm.get_natural() # Check the warning text if "could not find any buildings" in str(w): pass # Result should be None assert gdf is None
def test_natural(test_pbf): from pyrosm import OSM from geopandas import GeoDataFrame osm = OSM(test_pbf) gdf = osm.get_natural() assert isinstance(gdf, GeoDataFrame)