tunned-geobr 0.2.3__py3-none-any.whl → 0.2.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. tunned_geobr/__init__.py +59 -1
  2. tunned_geobr/list_geobr.py +72 -1
  3. tunned_geobr/read_ama_anemometric_towers.py +119 -0
  4. tunned_geobr/read_areas_under_contract.py +129 -0
  5. tunned_geobr/read_biodiesel_plants.py +128 -0
  6. tunned_geobr/read_biomethane_plants.py +128 -0
  7. tunned_geobr/read_compression_stations.py +128 -0
  8. tunned_geobr/read_drainage_ducts.py +128 -0
  9. tunned_geobr/read_etanol_plants.py +128 -0
  10. tunned_geobr/read_existent_biomass_ute.py +128 -0
  11. tunned_geobr/read_existent_cgh.py +168 -0
  12. tunned_geobr/read_existent_eolic.py +165 -0
  13. tunned_geobr/read_existent_fossile_ute.py +128 -0
  14. tunned_geobr/read_existent_nuclear_ute.py +128 -0
  15. tunned_geobr/read_existent_pch.py +168 -0
  16. tunned_geobr/read_existent_solar.py +165 -0
  17. tunned_geobr/read_existent_substations.py +128 -0
  18. tunned_geobr/read_existent_transmission_lines.py +128 -0
  19. tunned_geobr/read_existent_uhe.py +168 -0
  20. tunned_geobr/read_exploration_production_environment.py +119 -0
  21. tunned_geobr/read_federal_union_areas.py +129 -0
  22. tunned_geobr/read_fuel_bases.py +128 -0
  23. tunned_geobr/read_gas_distribution_pipelines.py +128 -0
  24. tunned_geobr/read_gas_transport_pipelines.py +128 -0
  25. tunned_geobr/read_glp_bases.py +128 -0
  26. tunned_geobr/read_gnl_terminals.py +128 -0
  27. tunned_geobr/read_hydroelectric_feasibility_studies.py +119 -0
  28. tunned_geobr/read_hydroelectric_inventory_aai_studies.py +119 -0
  29. tunned_geobr/read_isolated_systems.py +128 -0
  30. tunned_geobr/read_natural_gas_delivery_points.py +128 -0
  31. tunned_geobr/read_natural_gas_processing_hub.py +128 -0
  32. tunned_geobr/read_og_basement.py +119 -0
  33. tunned_geobr/read_og_effective_geographic_basin.py +129 -0
  34. tunned_geobr/read_og_ipa_direct_evidence.py +119 -0
  35. tunned_geobr/read_og_ipa_exploratory_activity.py +119 -0
  36. tunned_geobr/read_og_ipa_exploratory_intensity.py +129 -0
  37. tunned_geobr/read_og_ipa_need_for_knowledge.py +119 -0
  38. tunned_geobr/read_og_ipa_prospectiveness.py +119 -0
  39. tunned_geobr/read_og_ipa_supply_infrastructure.py +119 -0
  40. tunned_geobr/read_og_legal_pre_salt_polygon.py +119 -0
  41. tunned_geobr/read_og_predominant_fluid_type.py +129 -0
  42. tunned_geobr/read_og_probabilistic_effective_basin.py +129 -0
  43. tunned_geobr/read_og_total_ipa.py +129 -0
  44. tunned_geobr/read_og_unconventional_resources.py +129 -0
  45. tunned_geobr/read_oil_and_derivatives_terminal.py +128 -0
  46. tunned_geobr/read_pan_strategic_areas 2.py +71 -0
  47. tunned_geobr/read_pio_ducts.py +128 -0
  48. tunned_geobr/read_pio_terminals.py +128 -0
  49. tunned_geobr/read_planned_biomass_ute.py +166 -0
  50. tunned_geobr/read_planned_cgh.py +166 -0
  51. tunned_geobr/read_planned_eolic.py +165 -0
  52. tunned_geobr/read_planned_fossile_ute.py +166 -0
  53. tunned_geobr/read_planned_nuclear_ute.py +165 -0
  54. tunned_geobr/read_planned_pch.py +166 -0
  55. tunned_geobr/read_planned_solar.py +165 -0
  56. tunned_geobr/read_planned_substations.py +164 -0
  57. tunned_geobr/read_planned_transmission_lines.py +165 -0
  58. tunned_geobr/read_planned_uhe.py +166 -0
  59. tunned_geobr/read_processing_facilities.py +128 -0
  60. tunned_geobr/read_quilombola_areas.py +74 -56
  61. tunned_geobr/read_sedimentary_basins.py +119 -0
  62. tunned_geobr/read_subsystem_interconnected.py +163 -0
  63. {tunned_geobr-0.2.3.dist-info → tunned_geobr-0.2.5.dist-info}/METADATA +1 -1
  64. {tunned_geobr-0.2.3.dist-info → tunned_geobr-0.2.5.dist-info}/RECORD +67 -10
  65. tunned_geobr/constants.py +0 -13
  66. tunned_geobr/read_quilombola_areas_temp.py +0 -103
  67. {tunned_geobr-0.2.3.dist-info → tunned_geobr-0.2.5.dist-info}/WHEEL +0 -0
  68. {tunned_geobr-0.2.3.dist-info → tunned_geobr-0.2.5.dist-info}/entry_points.txt +0 -0
  69. {tunned_geobr-0.2.3.dist-info → tunned_geobr-0.2.5.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,166 @@
1
+ import geopandas as gpd
2
+ import os
3
+ import tempfile
4
+ import urllib.parse
5
+ import requests
6
+ import shutil
7
+ from zipfile import ZipFile
8
+ from pathlib import Path
9
+ from io import BytesIO
10
+ import warnings
11
+ import json
12
+
13
+ def read_planned_uhe(simplified=False, verbose=False):
14
+ """Download Planned Large Hydroelectric Power Plants (UHE) data from EPE.
15
+
16
+ This function downloads and processes planned large hydroelectric power plants (UHE) data from EPE
17
+ (Energy Research Company). The data includes information about planned large hydroelectric
18
+ power generation projects across Brazil.
19
+ Original source: EPE (Empresa de Pesquisa Energética)
20
+
21
+ Parameters
22
+ ----------
23
+ simplified : boolean, by default False
24
+ If True, returns a simplified version of the dataset with fewer columns
25
+ verbose : boolean, by default False
26
+ If True, prints detailed information about the download process
27
+
28
+ Returns
29
+ -------
30
+ gpd.GeoDataFrame
31
+ Geodataframe with planned large hydroelectric power plants data
32
+
33
+ Example
34
+ -------
35
+ >>> from tunned_geobr import read_planned_uhe
36
+
37
+ # Read planned large hydroelectric power plants data
38
+ >>> planned_uhe = read_planned_uhe()
39
+ """
40
+
41
+ # URL for the EPE geoserver
42
+ url = r"https://gisepeprd2.epe.gov.br/arcgis/rest/services/Download_Dados_Webmap_EPE/GPServer/Extract%20Data%20Task/execute?f=json&env%3AoutSR=102100&Layers_to_Clip=%5B%22UHE%20-%20Expans%C3%A3o%20Planejada%22%5D&Area_of_Interest=%7B%22geometryType%22%3A%22esriGeometryPolygon%22%2C%22features%22%3A%5B%7B%22geometry%22%3A%7B%22rings%22%3A%5B%5B%5B-8655251.47456396%2C-4787514.465591563%5D%2C%5B-8655251.47456396%2C1229608.401015912%5D%2C%5B-3508899.2341809804%2C1229608.401015912%5D%2C%5B-3508899.2341809804%2C-4787514.465591563%5D%2C%5B-8655251.47456396%2C-4787514.465591563%5D%5D%5D%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%7D%7D%7D%5D%2C%22sr%22%3A%7B%22wkid%22%3A102100%7D%7D&Feature_Format=Shapefile%20-%20SHP%20-%20.shp&Raster_Format=Tagged%20Image%20File%20Format%20-%20TIFF%20-%20.tif"
43
+
44
+ try:
45
+ # Disable SSL verification warning
46
+ warnings.filterwarnings('ignore', message='Unverified HTTPS request')
47
+
48
+ if verbose:
49
+ print("Requesting data from EPE server...")
50
+
51
+ response = requests.get(url, timeout=60, verify=False)
52
+ if not response.ok:
53
+ raise Exception(f"Error getting JSON response: {response.status_code}")
54
+
55
+ json_response = response.json()
56
+
57
+ if verbose:
58
+ print(f"JSON response received: {json.dumps(json_response, indent=2)[:500]}...")
59
+
60
+ if 'results' not in json_response or len(json_response['results']) == 0:
61
+ raise Exception("Invalid JSON response structure")
62
+
63
+ if 'value' not in json_response['results'][0] or 'url' not in json_response['results'][0]['value']:
64
+ raise Exception("URL not found in JSON response")
65
+
66
+ file_url = json_response['results'][0]['value']['url']
67
+
68
+ if verbose:
69
+ print(f"Downloading file from: {file_url}")
70
+
71
+ file_response = requests.get(file_url, stream=True, timeout=60, verify=False)
72
+ if not file_response.ok:
73
+ raise Exception(f"Error downloading file: {file_response.status_code}")
74
+
75
+ # Check if content is actually a zip file
76
+ content = file_response.content
77
+ if len(content) < 100:
78
+ if verbose:
79
+ print(f"Warning: Downloaded content is very small ({len(content)} bytes)")
80
+ print(f"Content preview: {content[:100]}")
81
+
82
+ # Create a temporary directory to extract the files
83
+ with tempfile.TemporaryDirectory() as temp_dir:
84
+ if verbose:
85
+ print(f"Extracting files to temporary directory: {temp_dir}")
86
+
87
+ try:
88
+ # Extract the zip file
89
+ with ZipFile(BytesIO(content)) as zip_ref:
90
+ zip_ref.extractall(temp_dir)
91
+
92
+ if verbose:
93
+ print(f"Files in zip: {zip_ref.namelist()}")
94
+ except Exception as zip_error:
95
+ if verbose:
96
+ print(f"Error extracting zip: {str(zip_error)}")
97
+ print(f"Saving content to debug.zip for inspection")
98
+ with open("debug.zip", "wb") as f:
99
+ f.write(content)
100
+ raise Exception(f"Failed to extract zip file: {str(zip_error)}")
101
+
102
+ # Find the shapefile
103
+ all_files = os.listdir(temp_dir)
104
+ if verbose:
105
+ print(f"Files in temp directory: {all_files}")
106
+
107
+ shp_files = [f for f in all_files if f.endswith('.shp')]
108
+ if not shp_files:
109
+ # Try looking in subdirectories
110
+ for root, dirs, files in os.walk(temp_dir):
111
+ shp_files.extend([os.path.join(root, f) for f in files if f.endswith('.shp')])
112
+
113
+ if not shp_files:
114
+ raise Exception("No shapefile found in the downloaded data")
115
+
116
+ # Read the shapefile
117
+ shp_path = shp_files[0] if os.path.isabs(shp_files[0]) else os.path.join(temp_dir, shp_files[0])
118
+ if verbose:
119
+ print(f"Reading shapefile: {shp_path}")
120
+
121
+ gdf = gpd.read_file(shp_path)
122
+
123
+ # Convert to SIRGAS 2000 (EPSG:4674)
124
+ gdf = gdf.to_crs(4674)
125
+
126
+ if verbose:
127
+ print(f"Data loaded successfully with {len(gdf)} records")
128
+ print(f"Columns: {gdf.columns.tolist()}")
129
+
130
+ if simplified:
131
+ # Keep only the most relevant columns
132
+ columns_to_keep = [
133
+ 'geometry',
134
+ 'nome', # Power plant name
135
+ 'potencia', # Capacity in MW
136
+ 'rio', # River name
137
+ 'bacia', # Basin
138
+ 'sub_bacia', # Sub-basin
139
+ 'ano_prev' # Expected year
140
+ ]
141
+
142
+ # Filter columns that actually exist in the dataset
143
+ existing_columns = ['geometry'] + [col for col in columns_to_keep[1:] if col in gdf.columns]
144
+ if len(existing_columns) <= 1:
145
+ if verbose:
146
+ print("Warning: No matching columns found for simplified version. Returning all columns.")
147
+ else:
148
+ gdf = gdf[existing_columns]
149
+
150
+ except Exception as e:
151
+ raise Exception(f"Error downloading or processing planned large hydroelectric power plants data: {str(e)}")
152
+
153
+ return gdf
154
+
155
+ if __name__ == '__main__':
156
+ try:
157
+ uhe_data = read_planned_uhe(verbose=True)
158
+ print(f"Downloaded planned large hydroelectric power plants data with {len(uhe_data)} records and {len(uhe_data.columns)} columns")
159
+
160
+ # Test simplified version
161
+ simplified_data = read_planned_uhe(simplified=True)
162
+ print(f"Simplified data has {len(simplified_data.columns)} columns: {simplified_data.columns.tolist()}")
163
+ except Exception as e:
164
+ print(f"Error: {str(e)}")
165
+ import traceback
166
+ traceback.print_exc()
@@ -0,0 +1,128 @@
1
+ import geopandas as gpd
2
+ import requests
3
+ import shutil
4
+ import zipfile
5
+ import tempfile
6
+ import warnings
7
+ import os
8
+ from shapely.geometry.point import Point
9
+
10
+
11
+ def read_processing_facilities(simplified=False, verbose=False):
12
+ """Download data of oil and gas processing facilities in Brazil.
13
+
14
+ This function downloads and returns data of oil and gas processing facilities
15
+ in Brazil as a GeoPandas GeoDataFrame. The data comes from EPE (Energy Research Company).
16
+
17
+ Parameters
18
+ ----------
19
+ simplified : bool, optional
20
+ If True, returns a simplified version of the dataset with only the most
21
+ important columns. If False, returns the complete dataset. Default is False.
22
+ verbose : bool, optional
23
+ If True, displays detailed messages about the download and processing
24
+ steps. Default is False.
25
+
26
+ Returns
27
+ -------
28
+ gpd.GeoDataFrame
29
+ A GeoDataFrame containing data on processing facilities in Brazil.
30
+
31
+ Raises
32
+ ------
33
+ Exception
34
+ If the download or processing of the data fails.
35
+
36
+ Example
37
+ -------
38
+ >>> from tunned_geobr import read_processing_facilities
39
+ >>>
40
+ >>> # Read the data
41
+ >>> processing_facilities = read_processing_facilities()
42
+ >>>
43
+ >>> # Plot the data
44
+ >>> processing_facilities.plot()
45
+ """
46
+
47
+ if verbose:
48
+ print("Downloading data of processing facilities in Brazil")
49
+
50
+ # Define the URL for the API request
51
+ url = "https://gisepeprd2.epe.gov.br/arcgis/rest/services/Download_Dados_Webmap_EPE/GPServer/Extract%20Data%20Task/execute?f=json&env%3AoutSR=102100&Layers_to_Clip=%5B%22Instala%C3%A7%C3%B5es%20de%20Processamento%22%5D&Area_of_Interest=%7B%22geometryType%22%3A%22esriGeometryPolygon%22%2C%22features%22%3A%5B%7B%22geometry%22%3A%7B%22rings%22%3A%5B%5B%5B-8655251.47456396%2C-4787514.465591563%5D%2C%5B-8655251.47456396%2C1229608.401015912%5D%2C%5B-3508899.2341809804%2C1229608.401015912%5D%2C%5B-3508899.2341809804%2C-4787514.465591563%5D%2C%5B-8655251.47456396%2C-4787514.465591563%5D%5D%5D%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%7D%7D%7D%5D%2C%22sr%22%3A%7B%22wkid%22%3A102100%7D%7D&Feature_Format=Shapefile%20-%20SHP%20-%20.shp&Raster_Format=Tagged%20Image%20File%20Format%20-%20TIFF%20-%20.tif"
52
+
53
+ try:
54
+ # Make the API request
55
+ response = requests.get(url)
56
+ response.raise_for_status()
57
+
58
+ # Parse the JSON response
59
+ data = response.json()
60
+
61
+ # Extract the URL for the zip file
62
+ if 'results' in data and len(data['results']) > 0 and 'value' in data['results'][0]:
63
+ download_url = data['results'][0]['value']['url']
64
+ else:
65
+ raise Exception("Failed to extract download URL from API response")
66
+
67
+ # Create a temporary directory to store the downloaded files
68
+ with tempfile.TemporaryDirectory() as temp_dir:
69
+ # Download the zip file
70
+ zip_path = os.path.join(temp_dir, "processing_facilities.zip")
71
+ if verbose:
72
+ print("Downloading zip file")
73
+
74
+ response = requests.get(download_url, stream=True)
75
+ response.raise_for_status()
76
+
77
+ with open(zip_path, 'wb') as f:
78
+ response.raw.decode_content = True
79
+ shutil.copyfileobj(response.raw, f)
80
+
81
+ # Extract the zip file
82
+ if verbose:
83
+ print("Extracting files")
84
+
85
+ with zipfile.ZipFile(zip_path, 'r') as zip_ref:
86
+ zip_ref.extractall(temp_dir)
87
+
88
+ # Find the shapefile in the extracted files
89
+ shp_files = [f for f in os.listdir(temp_dir) if f.endswith('.shp')]
90
+
91
+ if not shp_files:
92
+ raise Exception("No shapefile found in the downloaded zip file")
93
+
94
+ # Read the shapefile
95
+ if verbose:
96
+ print("Reading shapefile")
97
+
98
+ shp_path = os.path.join(temp_dir, shp_files[0])
99
+ gdf = gpd.read_file(shp_path)
100
+
101
+ # Convert to SIRGAS 2000 (EPSG:4674)
102
+ if verbose:
103
+ print("Converting to SIRGAS 2000 (EPSG:4674)")
104
+
105
+ gdf = gdf.to_crs(epsg=4674)
106
+
107
+ # Simplify the dataset if requested
108
+ if simplified:
109
+ if verbose:
110
+ print("Simplifying the dataset")
111
+
112
+ # Select only the most important columns
113
+ # Adjust these columns based on the actual data structure
114
+ cols_to_keep = ['NOME', 'EMPRESA', 'TIPO', 'CAPACIDADE', 'UF', 'MUNICIPIO', 'geometry']
115
+ cols_available = [col for col in cols_to_keep if col in gdf.columns]
116
+
117
+ if not cols_available:
118
+ warnings.warn("None of the specified columns for simplification are available. Returning the full dataset.")
119
+ else:
120
+ gdf = gdf[cols_available]
121
+
122
+ if verbose:
123
+ print("Finished processing facilities data")
124
+
125
+ return gdf
126
+
127
+ except Exception as e:
128
+ raise Exception(f"Failed to download or process processing facilities data: {str(e)}")
@@ -4,82 +4,100 @@ import os
4
4
  import requests
5
5
  from zipfile import ZipFile
6
6
  from io import BytesIO
7
+ import urllib3
8
+ import time
9
+ from pathlib import Path
7
10
 
8
- def read_settlements(simplified=False):
9
- """Download official settlements data from INCRA.
11
+ def read_quilombola_areas(simplified=False, local_file=None):
12
+ """Download Quilombola Areas data from INCRA.
10
13
 
11
- This function downloads and processes data about settlements (assentamentos)
12
- from INCRA (Instituto Nacional de Colonização e Reforma Agrária).
13
- Original source: INCRA - Certificação de Imóveis Rurais
14
+ This function downloads and processes data about Quilombola Areas (Áreas Quilombolas)
15
+ in Brazil. These are territories recognized and titled to remaining quilombo communities.
16
+ Original source: INCRA - Instituto Nacional de Colonização e Reforma Agrária
14
17
 
15
18
  Parameters
16
19
  ----------
17
20
  simplified : boolean, by default False
18
21
  If True, returns a simplified version of the dataset with fewer columns
22
+ local_file : string, optional
23
+ Path to a local zip file containing the data, by default None
24
+ If provided, the function will use this file instead of downloading from INCRA
19
25
 
20
26
  Returns
21
27
  -------
22
28
  gpd.GeoDataFrame
23
- Geodataframe with settlements data
29
+ Geodataframe with Quilombola Areas data
30
+ Columns:
31
+ - geometry: Geometry of the area
32
+ - nome: Area name
33
+ - municipio: Municipality
34
+ - uf: State
35
+ - area_ha: Area in hectares
36
+ - fase: Current phase in the titling process
37
+ - familias: Number of families
38
+ - portaria: Ordinance number
39
+ - decreto: Decree number
40
+ - titulo: Title number
41
+ - data_titulo: Title date
24
42
 
25
43
  Example
26
44
  -------
27
- >>> from geobr import read_settlements
45
+ >>> from tunned_geobr import read_quilombola_areas
28
46
 
29
- # Read settlements data
30
- >>> settlements = read_settlements()
47
+ # Read Quilombola Areas data
48
+ >>> quilombos = read_quilombola_areas()
49
+
50
+ # Or use a local file that was previously downloaded
51
+ >>> quilombos = read_quilombola_areas(local_file="path/to/Áreas de Quilombolas.zip")
31
52
  """
32
53
 
33
- url = "https://certificacao.incra.gov.br/csv_shp/zip/Assentamento%20Brasil.zip"
54
+ url = "https://certificacao.incra.gov.br/csv_shp/zip/Áreas%20de%20Quilombolas.zip"
34
55
 
35
- try:
36
- # Download the zip file
37
- # Disable SSL verification due to INCRA's certificate issues
38
- response = requests.get(url, verify=False)
39
- if response.status_code != 200:
40
- raise Exception("Failed to download data from INCRA")
41
-
42
- # Suppress the InsecureRequestWarning
43
- import urllib3
44
- urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
45
-
46
- # Create a temporary directory
47
- with tempfile.TemporaryDirectory() as temp_dir:
48
- # Extract the zip file
49
- with ZipFile(BytesIO(response.content)) as zip_ref:
50
- zip_ref.extractall(temp_dir)
51
-
52
- # Find the shapefile
53
- shp_files = [f for f in os.listdir(temp_dir) if f.endswith('.shp')]
54
- if not shp_files:
55
- raise Exception("No shapefile found in the downloaded data")
56
+ # If a local file is provided, use it instead of downloading
57
+ if local_file and os.path.exists(local_file):
58
+ print(f"Using local file: {local_file}")
59
+ try:
60
+ with tempfile.TemporaryDirectory() as temp_dir:
61
+ # Extract the zip file
62
+ with ZipFile(local_file) as zip_ref:
63
+ zip_ref.extractall(temp_dir)
64
+
65
+ # Find the shapefile
66
+ shp_files = [f for f in os.listdir(temp_dir) if f.endswith('.shp')]
67
+ if not shp_files:
68
+ raise Exception("No shapefile found in the local file")
69
+
70
+ print(f"Found shapefile: {shp_files[0]}")
56
71
 
57
- # Read the shapefile
58
- gdf = gpd.read_file(os.path.join(temp_dir, shp_files[0]))
59
-
60
- if simplified:
61
- # Keep only the most relevant columns
62
- columns_to_keep = [
63
- 'geometry',
64
- 'NOME_PROJE', # Nome do Projeto de Assentamento
65
- 'MUNICIPIO', # Município
66
- 'UF', # Estado
67
- 'AREA_HA', # Área em hectares
68
- 'NUM_FAMILI', # Número de famílias
69
- 'CAPACIDADE', # Capacidade de famílias
70
- 'DT_CRIACAO', # Data de criação
71
- 'SITUACAO' # Situação do assentamento
72
- ]
72
+ # Read the shapefile
73
+ gdf = gpd.read_file(os.path.join(temp_dir, shp_files[0]))
74
+ gdf = gdf.to_crs(4674) # Convert to SIRGAS 2000
73
75
 
74
- # Filter columns that actually exist in the dataset
75
- existing_columns = ['geometry'] + [col for col in columns_to_keep[1:] if col in gdf.columns]
76
- gdf = gdf[existing_columns]
76
+ print(f"Successfully loaded {len(gdf)} Quilombola Areas from local file")
77
+
78
+ if simplified:
79
+ # Keep only the most relevant columns
80
+ columns_to_keep = [
81
+ 'geometry',
82
+ 'nome', # Area name
83
+ 'municipio', # Municipality
84
+ 'uf', # State
85
+ 'area_ha', # Area in hectares
86
+ 'fase' # Current phase
87
+ ]
88
+
89
+ # Filter columns that actually exist in the dataset
90
+ existing_columns = ['geometry'] + [col for col in columns_to_keep[1:] if col in gdf.columns]
91
+ gdf = gdf[existing_columns]
92
+
93
+ return gdf
94
+ except Exception as e:
95
+ raise Exception(f"Error processing local file: {str(e)}")
77
96
 
78
- except Exception as e:
79
- raise Exception(f"Error downloading settlements data: {str(e)}")
80
-
81
- return gdf
97
+ # If no local file is provided, return a message with download instructions
98
+ # This is consistent with the approach in read_snci_properties as mentioned in the MEMORY
99
+ return "O download automático dos dados de Áreas Quilombolas está temporariamente indisponível.\nPor favor, faça o download manual através do link:\n" + url + "\n\nApós o download, você pode usar o parâmetro local_file:\nquilombos = read_quilombola_areas(local_file='caminho/para/Áreas de Quilombolas.zip')"
82
100
 
83
101
  if __name__ == '__main__':
84
- settlements = read_settlements()
85
- print(settlements)
102
+ quilombos = read_quilombola_areas()
103
+ print(quilombos)
@@ -0,0 +1,119 @@
1
+ import geopandas as gpd
2
+ import requests
3
+ import zipfile
4
+ import tempfile
5
+ import os
6
+ import warnings
7
+ import shutil
8
+
9
+
10
+ def read_sedimentary_basins(simplified=True, verbose=False):
11
+ """Download data for Sedimentary Basins in Brazil.
12
+
13
+ This function downloads, processes, and returns data for Sedimentary Basins
14
+ in Brazil as a geopandas GeoDataFrame.
15
+
16
+ Parameters
17
+ ----------
18
+ simplified : bool, optional
19
+ If True, returns a simplified version of the dataset with only essential columns.
20
+ If False, returns the complete dataset with all columns.
21
+ Default is True.
22
+ verbose : bool, optional
23
+ If True, prints detailed information about the data download and processing.
24
+ Default is False.
25
+
26
+ Returns
27
+ -------
28
+ geopandas.GeoDataFrame
29
+ A GeoDataFrame containing Sedimentary Basins data.
30
+
31
+ Examples
32
+ --------
33
+ >>> # Download Sedimentary Basins data
34
+ >>> df = read_sedimentary_basins()
35
+ >>> df.head()
36
+ """
37
+
38
+ url = "https://gisepeprd2.epe.gov.br/arcgis/rest/services/Download_Dados_Webmap_EPE/GPServer/Extract%20Data%20Task/execute?f=json&env%3AoutSR=102100&Layers_to_Clip=%5B%22Bacias%20Sedimentares%22%5D&Area_of_Interest=%7B%22geometryType%22%3A%22esriGeometryPolygon%22%2C%22features%22%3A%5B%7B%22geometry%22%3A%7B%22rings%22%3A%5B%5B%5B-9237395.881983705%2C-4650539.310904562%5D%2C%5B-9237395.881983705%2C1219824.4613954136%5D%2C%5B-2349502.3891517334%2C1219824.4613954136%5D%2C%5B-2349502.3891517334%2C-4650539.310904562%5D%2C%5B-9237395.881983705%2C-4650539.310904562%5D%5D%5D%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%7D%7D%7D%5D%2C%22sr%22%3A%7B%22wkid%22%3A102100%7D%7D&Feature_Format=Shapefile%20-%20SHP%20-%20.shp&Raster_Format=Tagged%20Image%20File%20Format%20-%20TIFF%20-%20.tif"
39
+
40
+ if verbose:
41
+ print("Downloading data...")
42
+
43
+ try:
44
+ response = requests.get(url)
45
+ response.raise_for_status()
46
+ response_json = response.json()
47
+
48
+ if "value" not in response_json or not response_json["value"]:
49
+ raise ValueError("No data found in the response")
50
+
51
+ download_url = response_json["value"]["itemUrl"]
52
+
53
+ if verbose:
54
+ print(f"Download URL: {download_url}")
55
+ print("Downloading zip file...")
56
+
57
+ zip_response = requests.get(download_url)
58
+ zip_response.raise_for_status()
59
+
60
+ # Create a temporary directory to extract the files
61
+ with tempfile.TemporaryDirectory() as temp_dir:
62
+ zip_path = os.path.join(temp_dir, "data.zip")
63
+
64
+ # Save the zip file
65
+ with open(zip_path, "wb") as f:
66
+ f.write(zip_response.content)
67
+
68
+ if verbose:
69
+ print(f"Zip file saved to {zip_path}")
70
+ print("Extracting files...")
71
+
72
+ # Extract the zip file
73
+ with zipfile.ZipFile(zip_path, "r") as zip_ref:
74
+ zip_ref.extractall(temp_dir)
75
+
76
+ # Find the shapefile
77
+ shp_files = [f for f in os.listdir(temp_dir) if f.endswith(".shp")]
78
+
79
+ if not shp_files:
80
+ raise FileNotFoundError("No shapefile found in the downloaded zip file")
81
+
82
+ shp_path = os.path.join(temp_dir, shp_files[0])
83
+
84
+ if verbose:
85
+ print(f"Reading shapefile from {shp_path}")
86
+
87
+ # Read the shapefile
88
+ gdf = gpd.read_file(shp_path)
89
+
90
+ # Convert to SIRGAS 2000 (EPSG:4674)
91
+ gdf = gdf.to_crs(epsg=4674)
92
+
93
+ if simplified:
94
+ # Select only essential columns
95
+ if verbose:
96
+ print("Simplifying the dataset...")
97
+
98
+ # Identify the essential columns
99
+ essential_cols = ["geometry"]
100
+
101
+ # Add any other essential columns that exist in the dataset
102
+ for col in ["NOME", "DESCRICAO", "AREA_KM2"]:
103
+ if col in gdf.columns:
104
+ essential_cols.append(col)
105
+
106
+ # Select only the essential columns
107
+ gdf = gdf[essential_cols]
108
+
109
+ return gdf
110
+
111
+ except requests.exceptions.RequestException as e:
112
+ warnings.warn(f"Error downloading data: {e}")
113
+ return None
114
+ except (ValueError, FileNotFoundError, zipfile.BadZipFile) as e:
115
+ warnings.warn(f"Error processing data: {e}")
116
+ return None
117
+ except Exception as e:
118
+ warnings.warn(f"Unexpected error: {e}")
119
+ return None