tunned-geobr 0.2.2__py3-none-any.whl → 0.2.4__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.
- tunned_geobr/__init__.py +59 -1
- tunned_geobr/list_geobr.py +74 -3
- tunned_geobr/read_ama_anemometric_towers.py +119 -0
- tunned_geobr/read_areas_under_contract.py +129 -0
- tunned_geobr/read_biodiesel_plants.py +128 -0
- tunned_geobr/read_biomethane_plants.py +128 -0
- tunned_geobr/read_compression_stations.py +128 -0
- tunned_geobr/read_drainage_ducts.py +128 -0
- tunned_geobr/read_etanol_plants.py +128 -0
- tunned_geobr/read_existent_biomass_ute.py +128 -0
- tunned_geobr/read_existent_cgh.py +168 -0
- tunned_geobr/read_existent_eolic.py +165 -0
- tunned_geobr/read_existent_fossile_ute.py +128 -0
- tunned_geobr/read_existent_nuclear_ute.py +128 -0
- tunned_geobr/read_existent_pch.py +168 -0
- tunned_geobr/read_existent_solar.py +165 -0
- tunned_geobr/read_existent_substations.py +128 -0
- tunned_geobr/read_existent_transmission_lines.py +128 -0
- tunned_geobr/read_existent_uhe.py +168 -0
- tunned_geobr/read_exploration_production_environment.py +119 -0
- tunned_geobr/read_federal_union_areas.py +129 -0
- tunned_geobr/read_fuel_bases.py +128 -0
- tunned_geobr/read_gas_distribution_pipelines.py +128 -0
- tunned_geobr/read_gas_transport_pipelines.py +128 -0
- tunned_geobr/read_glp_bases.py +128 -0
- tunned_geobr/read_gnl_terminals.py +128 -0
- tunned_geobr/read_hydroelectric_feasibility_studies.py +119 -0
- tunned_geobr/read_hydroelectric_inventory_aai_studies.py +119 -0
- tunned_geobr/read_isolated_systems.py +128 -0
- tunned_geobr/read_natural_gas_delivery_points.py +128 -0
- tunned_geobr/read_natural_gas_processing_hub.py +128 -0
- tunned_geobr/read_og_basement.py +119 -0
- tunned_geobr/read_og_effective_geographic_basin.py +129 -0
- tunned_geobr/read_og_ipa_direct_evidence.py +119 -0
- tunned_geobr/read_og_ipa_exploratory_activity.py +119 -0
- tunned_geobr/read_og_ipa_exploratory_intensity.py +129 -0
- tunned_geobr/read_og_ipa_need_for_knowledge.py +119 -0
- tunned_geobr/read_og_ipa_prospectiveness.py +119 -0
- tunned_geobr/read_og_ipa_supply_infrastructure.py +119 -0
- tunned_geobr/read_og_legal_pre_salt_polygon.py +119 -0
- tunned_geobr/read_og_predominant_fluid_type.py +129 -0
- tunned_geobr/read_og_probabilistic_effective_basin.py +129 -0
- tunned_geobr/read_og_total_ipa.py +129 -0
- tunned_geobr/read_og_unconventional_resources.py +129 -0
- tunned_geobr/read_oil_and_derivatives_terminal.py +128 -0
- tunned_geobr/read_pan_strategic_areas 2.py +71 -0
- tunned_geobr/read_pio_ducts.py +128 -0
- tunned_geobr/read_pio_terminals.py +128 -0
- tunned_geobr/read_planned_biomass_ute.py +166 -0
- tunned_geobr/read_planned_cgh.py +166 -0
- tunned_geobr/read_planned_eolic.py +165 -0
- tunned_geobr/read_planned_fossile_ute.py +166 -0
- tunned_geobr/read_planned_nuclear_ute.py +165 -0
- tunned_geobr/read_planned_pch.py +166 -0
- tunned_geobr/read_planned_solar.py +165 -0
- tunned_geobr/read_planned_substations.py +164 -0
- tunned_geobr/read_planned_transmission_lines.py +165 -0
- tunned_geobr/read_planned_uhe.py +166 -0
- tunned_geobr/read_processing_facilities.py +128 -0
- tunned_geobr/read_sedimentary_basins.py +119 -0
- tunned_geobr/read_subsystem_interconnected.py +163 -0
- {tunned_geobr-0.2.2.dist-info → tunned_geobr-0.2.4.dist-info}/METADATA +1 -1
- {tunned_geobr-0.2.2.dist-info → tunned_geobr-0.2.4.dist-info}/RECORD +66 -8
- tunned_geobr/constants.py +0 -13
- {tunned_geobr-0.2.2.dist-info → tunned_geobr-0.2.4.dist-info}/WHEEL +0 -0
- {tunned_geobr-0.2.2.dist-info → tunned_geobr-0.2.4.dist-info}/entry_points.txt +0 -0
- {tunned_geobr-0.2.2.dist-info → tunned_geobr-0.2.4.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,165 @@
|
|
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_transmission_lines(simplified=False, verbose=False):
|
14
|
+
"""Download Planned Transmission Lines data from EPE.
|
15
|
+
|
16
|
+
This function downloads and processes planned transmission lines data from EPE
|
17
|
+
(Energy Research Company). The data includes information about planned transmission
|
18
|
+
lines 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 transmission lines data
|
32
|
+
|
33
|
+
Example
|
34
|
+
-------
|
35
|
+
>>> from tunned_geobr import read_planned_transmission_lines
|
36
|
+
|
37
|
+
# Read planned transmission lines data
|
38
|
+
>>> planned_lines = read_planned_transmission_lines()
|
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%22Linhas%20de%20Transmiss%C3%A3o%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', # Line name
|
135
|
+
'tensao', # Voltage level
|
136
|
+
'extensao', # Length
|
137
|
+
'ano_prev', # Expected year
|
138
|
+
'situacao' # Status
|
139
|
+
]
|
140
|
+
|
141
|
+
# Filter columns that actually exist in the dataset
|
142
|
+
existing_columns = ['geometry'] + [col for col in columns_to_keep[1:] if col in gdf.columns]
|
143
|
+
if len(existing_columns) <= 1:
|
144
|
+
if verbose:
|
145
|
+
print("Warning: No matching columns found for simplified version. Returning all columns.")
|
146
|
+
else:
|
147
|
+
gdf = gdf[existing_columns]
|
148
|
+
|
149
|
+
except Exception as e:
|
150
|
+
raise Exception(f"Error downloading or processing planned transmission lines data: {str(e)}")
|
151
|
+
|
152
|
+
return gdf
|
153
|
+
|
154
|
+
if __name__ == '__main__':
|
155
|
+
try:
|
156
|
+
lines_data = read_planned_transmission_lines(verbose=True)
|
157
|
+
print(f"Downloaded planned transmission lines data with {len(lines_data)} records and {len(lines_data.columns)} columns")
|
158
|
+
|
159
|
+
# Test simplified version
|
160
|
+
simplified_data = read_planned_transmission_lines(simplified=True)
|
161
|
+
print(f"Simplified data has {len(simplified_data.columns)} columns: {simplified_data.columns.tolist()}")
|
162
|
+
except Exception as e:
|
163
|
+
print(f"Error: {str(e)}")
|
164
|
+
import traceback
|
165
|
+
traceback.print_exc()
|
@@ -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)}")
|
@@ -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
|