GeofabrikReader.merge_shp_layers

GeofabrikReader.merge_shp_layers(subregion_names, layer_name, data_dir=None, engine='pyshp', update=False, download=False, rm_zip_extracts=True, merged_shp_dir=None, rm_shp_temp=True, verbose=False, ret_merged_shp_path=False)[source]

Merge shapefiles for a specific layer of two or multiple geographic regions.

Parameters:
  • subregion_names (list) – names of geographic region (case-insensitive) that is available on Geofabrik free download server

  • layer_name (str) – name of a layer (e.g. ‘railways’)

  • engine (str) – the method used to merge/save shapefiles; options include: 'pyshp' (default) and 'geopandas' (or 'gpd') if engine='geopandas', this function relies on geopandas.GeoDataFrame.to_file(); otherwise, it by default uses shapefile.Writer()

  • update (bool) – whether to update the source .shp.zip files, defaults to False

  • download (bool) – whether to ask for confirmation before starting to download a file, defaults to True

  • data_dir (str | None) – directory where the .shp.zip data files are located/saved; if None (default), the default directory

  • rm_zip_extracts (bool) – whether to delete the extracted files, defaults to False

  • rm_shp_temp (bool) – whether to delete temporary layer files, defaults to False

  • merged_shp_dir (str | None) – if None (default), use the layer name as the name of the folder where the merged .shp files will be saved

  • verbose (bool | int) – whether to print relevant information in console, defaults to False

  • ret_merged_shp_path (bool) – whether to return the path to the merged .shp file, defaults to False

Returns:

the path to the merged file when ret_merged_shp_path=True

Return type:

list | str

Examples:

>>> from pydriosm.reader import GeofabrikReader
>>> from pyhelpers.dirs import cd, delete_dir
>>> import os

>>> gfr = GeofabrikReader()

Example 1:

>>> # To merge 'railways' of Greater Manchester and West Yorkshire
>>> subrgn_name = ['Manchester', 'West Yorkshire']
>>> lyr_name = 'railways'
>>> dat_dir = "tests\osm_data"
>>> path_to_merged_shp_file = gfr.merge_shp_layers(
...     subrgn_name, lyr_name, dat_dir, verbose=True, ret_merged_shp_path=True)
To download data in the format '.shp.zip' for the following geographic (sub)region(s):
  "West Yorkshire"
  "Greater Manchester"
  to "./tests/osm_data/"
? [No]|Yes: >? yes
Downloading "greater-manchester-latest-free.shp.zip" 100%|██████████| 87.5M/8...
  Saving "greater-manchester-latest-free.shp.zip" ...
      to "./tests/osm_data/greater-manchester/" ... Done.
Downloading "west-yorkshire-latest-free.shp.zip" 100%|██████████| 87.3M/87.3M...
  Saving "west-yorkshire-latest-free.shp.zip" ...
      to "./tests/osm_data/west-yorkshire/" ... Done.
Merging the following shapefiles:
    "greater-manchester_gis_osm_railways_free_1.shp"
    "west-yorkshire_gis_osm_railways_free_1.shp"
        In progress ... Done.
        Find the merged shapefile at "tests/osm_data/gre_man-wes_yor-railways".

>>> path_to_merged_shp_file = path_to_merged_shp_file[0]
>>> os.path.relpath(path_to_merged_shp_file)
'tests\osm_data\gre_man-wes_yor-railways\linestring.shp'

>>> # Read the merged data
>>> manchester_yorkshire_railways_shp = gfr.SHP.read_shp(path_to_merged_shp_file)
>>> manchester_yorkshire_railways_shp.head()
    osm_id  code  ...                                        coordinates shape_type
0   928999  6101  ...  [(-2.2844621, 53.4802635), (-2.2949851, 53.481...          3
1   929904  6101  ...  [(-2.2917977, 53.4619559), (-2.2924877, 53.461...          3
2   929905  6102  ...  [(-2.2794048, 53.4605819), (-2.2799722, 53.460...          3
3  3663332  6102  ...  [(-2.2382139, 53.4817985), (-2.2381708, 53.481...          3
4  3996086  6101  ...  [(-2.6003053, 53.4604346), (-2.6005261, 53.460...          3
[5 rows x 9 columns]

>>> # Delete the merged files
>>> delete_dir(os.path.dirname(path_to_merged_shp_file), verbose=True)
To delete the directory "./tests/osm_data/gre_man-wes_yor-railways/" (Not empty)
? [No]|Yes: yes
Deleting "./tests/osm_data/gre_man-wes_yor-railways/" ... Done.

>>> # Delete the downloaded .shp.zip data files
>>> delete_dir(list(map(os.path.dirname, gfr.downloader.data_paths)), verbose=True)
To delete the following directories:
  "./tests/osm_data/greater-manchester/" (Not empty)
  "./tests/osm_data/west-yorkshire/" (Not empty)
? [No]|Yes: yes
Deleting:
  "./tests/osm_data/greater-manchester/" ... Done.
  "./tests/osm_data/west-yorkshire/" ... Done.

Example 2:

>>> # To merge 'transport' of Greater London, Kent and Surrey

>>> subrgn_name = ['London', 'Kent', 'Surrey']
>>> lyr_name = 'transport'
>>> path_to_merged_shp_file = gfr.merge_shp_layers(
...     subrgn_name, lyr_name, dat_dir, verbose=True, ret_merged_shp_path=True)
To download data in the format '.shp.zip' for the following geographic (sub)region(s):
  "Kent"
  "Surrey"
  "Greater London"
  to "./tests/osm_data/"
? [No]|Yes: >? yes
Downloading "greater-london-latest-free.shp.zip" 100%|██████████| 196M/196M |...
  Saving "greater-london-latest-free.shp.zip" ...
      to "./tests/osm_data/greater-london/" ... Done.
Downloading "kent-latest-free.shp.zip" 100%|██████████| 89.1M/89.1M | 912kB/s...
  Saving "kent-latest-free.shp.zip" to "./tests/osm_data/kent/" ... Done.
Downloading "surrey-latest-free.shp.zip" 100%|██████████| 73.7M/73.7M | 1.00M...
  Saving "surrey-latest-free.shp.zip" to "./tests/osm_data/surrey/" ... Done.
Merging the following shapefiles:
    "greater-london_gis_osm_transport_a_free_1.shp"
    "greater-london_gis_osm_transport_free_1.shp"
    "kent_gis_osm_transport_a_free_1.shp"
    "kent_gis_osm_transport_free_1.shp"
    "surrey_gis_osm_transport_a_free_1.shp"
    "surrey_gis_osm_transport_free_1.shp"
        In progress ... Done.
        Find the merged shapefile at "tests/osm_data/gre_lon-ken-sur-transport".

>>> type(path_to_merged_shp_file)
list
>>> len(path_to_merged_shp_file)
2
>>> os.path.relpath(path_to_merged_shp_file[0])
'tests\osm_data\gre_lon-ken-sur-transport\point.shp'
>>> os.path.relpath(path_to_merged_shp_file[1])
'tests\osm_data\gre-lon_ken_sur_transport\polygon.shp'

>>> # Read the merged shapefile
>>> merged_transport_shp_1 = gfr.SHP.read_shp(path_to_merged_shp_file[1])
>>> merged_transport_shp_1.head()
     osm_id  ...  shape_type
0   5077928  ...           5
1   8610280  ...           5
2  15705264  ...           5
3  23077379  ...           5
4  24016945  ...           5
[5 rows x 6 columns]

>>> # Delete the merged files
>>> delete_dir(os.path.commonpath(path_to_merged_shp_file), verbose=True)
To delete the directory "./tests/osm_data/gre_lon-ken-sur-transport/" (Not empty)
? [No]|Yes: yes
Deleting "./tests/osm_data/gre_lon-ken-sur-transport/" ... Done.

>>> # Delete the example data and the test data directory
>>> delete_dir(dat_dir, verbose=True)
To delete the directory "./tests/osm_data/" (Not empty)
? [No]|Yes: yes
Deleting "./tests/osm_data/" ... Done.