def test_dissolve_multisinglepolygons(tmpdir): # Init tmp_dir = Path(tmpdir) tmp_dir.mkdir(parents=True, exist_ok=True) # Prepare test data + test for suffix in test_helper.get_test_suffix_list(): for crs_epsg in test_helper.get_test_crs_epsg_list(): # Write test file in the right format + crs print(f"Run test for suffix {suffix} and crs_epsg {crs_epsg}") test_gdf = gpd.GeoDataFrame(geometry=[ test_helper.TestData.polygon_with_island, test_helper.TestData.multipolygon ], crs=test_helper.TestData.crs_epsg) # Reproject if needed if test_helper.TestData.crs_epsg != crs_epsg: test_gdf = test_gdf.to_crs(epsg=crs_epsg) assert isinstance(test_gdf, gpd.GeoDataFrame) input_path = tmp_dir / f"polygons_{crs_epsg}{suffix}" gfo.to_file(test_gdf, input_path) output_path = tmp_dir / f"{input_path.stem}-output{suffix}" # Now run test basetest_dissolve_multisinglepolygons(input_path, output_path)
def prepare_test_file( path: Path, tmp_dir: Path, suffix: str, crs_epsg: Optional[int] = None) -> Path: # If sufixx the same, copy to tmp_dir, if not, convert new_path = tmp_dir / f"{path.stem}{suffix}" if path.suffix == suffix: gfo.copy(path, new_path) else: gfo.convert(path, new_path) path = new_path # If crs_epsg specified and test input file in wrong crs_epsg, reproject if crs_epsg is not None: input_layerinfo = gfo.get_layerinfo(path) assert input_layerinfo.crs is not None if input_layerinfo.crs.to_epsg() != crs_epsg: new_path = tmp_dir / f"{path.stem}_{crs_epsg}{suffix}" if new_path.exists() is False: test_gdf = gfo.read_file(path) test_gdf = test_gdf.to_crs(crs_epsg) assert isinstance(test_gdf, gpd.GeoDataFrame) gfo.to_file(test_gdf, new_path) path = new_path return path
def test_delete_duplicate_geometries(tmpdir): # Prepare test data + run tests tmp_dir = Path(tmpdir) tmp_dir.mkdir(parents=True, exist_ok=True) test_gdf = gpd.GeoDataFrame( geometry=[ test_helper.TestData.polygon_with_island, test_helper.TestData.polygon_with_island, test_helper.TestData.polygon_no_islands, test_helper.TestData.polygon_no_islands, test_helper.TestData.polygon_with_island2], crs=test_helper.TestData.crs_epsg) suffix = ".gpkg" input_path = tmp_dir / f"input_test_data{suffix}" gfo.to_file(test_gdf, input_path) input_info = gfo.get_layerinfo(input_path) # Run test output_path = tmp_dir / f"{input_path.stem}-output{suffix}" print(f"Run test for suffix {suffix}") gfo.delete_duplicate_geometries( input_path=input_path, output_path=output_path) # Check result, 2 duplicates should be removed result_info = gfo.get_layerinfo(output_path) assert result_info.featurecount == input_info.featurecount - 2
def basetest_to_file_none(srcpath: Path, output_dir: Path, output_suffix: str): ### Test for gdf with a None geometry + a polygon ### test_gdf = gpd.GeoDataFrame( geometry=[None, test_helper.TestData.polygon_with_island]) test_geometrytypes = geoseries_util.get_geometrytypes(test_gdf.geometry) assert len(test_geometrytypes) == 1 output_none_path = output_dir / f"{srcpath.stem}_none{output_suffix}" gfo.to_file(test_gdf, output_none_path) # Now check the result if the data is still the same after being read again test_read_gdf = gfo.read_file(output_none_path) # Result is the same as the original input assert test_read_gdf.geometry[0] is None assert isinstance(test_read_gdf.geometry[1], sh_geom.Polygon) # The geometrytype of the column in the file is also the same as originaly test_file_geometrytype = gfo.get_layerinfo(output_none_path).geometrytype if output_suffix == '.shp': assert test_file_geometrytype == GeometryType.MULTIPOLYGON else: assert test_file_geometrytype == test_geometrytypes[0] # The result type in the geodataframe is also the same as originaly test_read_geometrytypes = geoseries_util.get_geometrytypes( test_read_gdf.geometry) assert len(test_gdf) == len(test_read_gdf) assert test_read_geometrytypes == test_geometrytypes
def basetest_to_file(srcpath, tmppath): # Read test file and write to tmppath read_gdf = gfo.read_file(srcpath) gfo.to_file(read_gdf, tmppath) tmp_gdf = gfo.read_file(tmppath) assert len(read_gdf) == len(tmp_gdf) # Append the file again to tmppath gfo.to_file(read_gdf, tmppath, append=True) tmp_gdf = gfo.read_file(tmppath) assert 2 * len(read_gdf) == len(tmp_gdf)
def test_simplify_ext_keep_points_on(tmpdir): #### Test if keep_points_on works properly #### ## First init some stuff ## # Read the test data input_path = test_helper.TestFiles.polygons_simplify_onborder_testcase_gpkg gfo.copy(input_path, tmpdir / input_path.name) input_gdf = gfo.read_file(input_path) # Create geometry where we want the points kept grid_gdf = grid_util.create_grid( total_bounds=(210431.875-1000, 176640.125-1000, 210431.875+1000, 176640.125+1000), nb_columns=2, nb_rows=2, crs='epsg:31370') gfo.to_file(grid_gdf, tmpdir / "grid.gpkg") grid_coords = [tile.exterior.coords for tile in grid_gdf['geometry']] grid_lines_geom = sh_geom.MultiLineString(grid_coords) ## Test rdp (ramer–douglas–peucker) ## # Without keep_points_on, the following point that is on the test data + # on the grid is removed by rdp point_on_input_and_border = sh_geom.Point(210431.875, 176599.375) tolerance_rdp = 0.5 # Determine the number of intersects with the input test data nb_intersects_with_input = len(input_gdf[input_gdf.intersects(point_on_input_and_border)]) assert nb_intersects_with_input > 0 # Test if intersects > 0 assert len(input_gdf[grid_gdf.intersects(point_on_input_and_border)]) > 0 # Without keep_points_on the number of intersections changes simplified_gdf = input_gdf.copy() # assert to evade pyLance warning assert isinstance(simplified_gdf, gpd.GeoDataFrame) simplified_gdf.geometry = input_gdf.geometry.apply( lambda geom: geometry_util.simplify_ext( geom, algorithm=geometry_util.SimplifyAlgorithm.RAMER_DOUGLAS_PEUCKER, tolerance=tolerance_rdp)) gfo.to_file(simplified_gdf, tmpdir / f"simplified_rdp{tolerance_rdp}.gpkg") assert len(simplified_gdf[simplified_gdf.intersects(point_on_input_and_border)]) != nb_intersects_with_input # With keep_points_on specified, the number of intersections stays the same simplified_gdf = input_gdf.copy() # assert to evade pyLance warning assert isinstance(simplified_gdf, gpd.GeoDataFrame) simplified_gdf.geometry = input_gdf.geometry.apply( lambda geom: geometry_util.simplify_ext( geom, algorithm=geometry_util.SimplifyAlgorithm.RAMER_DOUGLAS_PEUCKER, tolerance=tolerance_rdp, keep_points_on=grid_lines_geom)) gfo.to_file(simplified_gdf, tmpdir / f"simplified_rdp{tolerance_rdp}_keep_points_on.gpkg") assert len(simplified_gdf[simplified_gdf.intersects(point_on_input_and_border)]) == nb_intersects_with_input ## Test vw (visvalingam-whyatt) ## # Without keep_points_on, the following point that is on the test data + # on the grid is removed by vw point_on_input_and_border = sh_geom.Point(210430.125, 176640.125) tolerance_vw = 16*0.25*0.25 # 1m² # Determine the number of intersects with the input test data nb_intersects_with_input = len(input_gdf[input_gdf.intersects(point_on_input_and_border)]) assert nb_intersects_with_input > 0 # Test if intersects > 0 assert len(input_gdf[grid_gdf.intersects(point_on_input_and_border)]) > 0 # Without keep_points_on the number of intersections changes simplified_gdf = input_gdf.copy() # assert to evade pyLance warning assert isinstance(simplified_gdf, gpd.GeoDataFrame) simplified_gdf.geometry = input_gdf.geometry.apply( lambda geom: geometry_util.simplify_ext( geom, algorithm=geometry_util.SimplifyAlgorithm.VISVALINGAM_WHYATT, tolerance=tolerance_vw)) gfo.to_file(simplified_gdf, tmpdir / f"simplified_vw{tolerance_vw}.gpkg") assert len(simplified_gdf[simplified_gdf.intersects(point_on_input_and_border)]) != nb_intersects_with_input # With keep_points_on specified, the number of intersections stays the same simplified_gdf = input_gdf.copy() # assert to evade pyLance warning assert isinstance(simplified_gdf, gpd.GeoDataFrame) simplified_gdf.geometry = input_gdf.geometry.apply( lambda geom: geometry_util.simplify_ext( geom, algorithm=geometry_util.SimplifyAlgorithm.VISVALINGAM_WHYATT, tolerance=tolerance_vw, keep_points_on=grid_lines_geom)) gfo.to_file(simplified_gdf, tmpdir / f"simplified_vw{tolerance_vw}_keep_points_on.gpkg") assert len(simplified_gdf[simplified_gdf.intersects(point_on_input_and_border)]) == nb_intersects_with_input ## Test lang ## # Without keep_points_on, the following point that is on the test data + # on the grid is removed by lang point_on_input_and_border = sh_geom.Point(210431.875,176606.125) tolerance_lang = 0.25 step_lang = 8 # Determine the number of intersects with the input test data nb_intersects_with_input = len(input_gdf[input_gdf.intersects(point_on_input_and_border)]) assert nb_intersects_with_input > 0 # Test if intersects > 0 assert len(input_gdf[grid_gdf.intersects(point_on_input_and_border)]) > 0 # Without keep_points_on the number of intersections changes simplified_gdf = input_gdf.copy() # assert to evade pyLance warning assert isinstance(simplified_gdf, gpd.GeoDataFrame) simplified_gdf.geometry = input_gdf.geometry.apply( lambda geom: geometry_util.simplify_ext( geom, algorithm=geometry_util.SimplifyAlgorithm.LANG, tolerance=tolerance_lang, lookahead=step_lang)) gfo.to_file(simplified_gdf, tmpdir / f"simplified_lang;{tolerance_lang};{step_lang}.gpkg") assert len(simplified_gdf[simplified_gdf.intersects(point_on_input_and_border)]) != nb_intersects_with_input # With keep_points_on specified, the number of intersections stays the same simplified_gdf = input_gdf.copy() # assert to evade pyLance warning assert isinstance(simplified_gdf, gpd.GeoDataFrame) simplified_gdf.geometry = input_gdf.geometry.apply( lambda geom: geometry_util.simplify_ext( geom, algorithm=geometry_util.SimplifyAlgorithm.LANG, tolerance=tolerance_lang, lookahead=step_lang, keep_points_on=grid_lines_geom)) gfo.to_file(simplified_gdf, tmpdir / f"simplified_lang;{tolerance_lang};{step_lang}_keep_points_on.gpkg") assert len(simplified_gdf[simplified_gdf.intersects(point_on_input_and_border)]) == nb_intersects_with_input