tunned-geobr 1.0.9__py3-none-any.whl → 1.0.11__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 +1 -0
- tunned_geobr/list_geobr.py +1 -0
- tunned_geobr/read_oil_wells.py +87 -0
- tunned_geobr/read_sigel_wind_turbines.py +164 -0
- {tunned_geobr-1.0.9.dist-info → tunned_geobr-1.0.11.dist-info}/METADATA +1 -1
- {tunned_geobr-1.0.9.dist-info → tunned_geobr-1.0.11.dist-info}/RECORD +9 -7
- {tunned_geobr-1.0.9.dist-info → tunned_geobr-1.0.11.dist-info}/WHEEL +0 -0
- {tunned_geobr-1.0.9.dist-info → tunned_geobr-1.0.11.dist-info}/entry_points.txt +0 -0
- {tunned_geobr-1.0.9.dist-info → tunned_geobr-1.0.11.dist-info}/licenses/LICENSE.txt +0 -0
tunned_geobr/__init__.py
CHANGED
@@ -130,3 +130,4 @@ from .read_ibama_embargoes import read_ibama_embargoes
|
|
130
130
|
from .read_climate import read_climate
|
131
131
|
from .read_exploration_blocks import read_exploration_blocks
|
132
132
|
from .read_production_fields import read_production_fields
|
133
|
+
from .read_oil_wells import read_oil_wells
|
tunned_geobr/list_geobr.py
CHANGED
@@ -140,6 +140,7 @@ def list_geobr():
|
|
140
140
|
# Energy infrastructure datasets - Oil and Gas Infrastructure
|
141
141
|
{"Function": "read_exploration_blocks", "Geography": "Oil and Gas Exploration Blocks", "Years": "All", "Source": "ANP"},
|
142
142
|
{"Function": "read_production_fields", "Geography": "Oil and Gas Production Fields", "Years": "All", "Source": "ANP"},
|
143
|
+
{"Function": "read_oil_wells", "Geography": "Oil and Gas Wells", "Years": "All", "Source": "ANP"},
|
143
144
|
{"Function": "read_fuel_bases", "Geography": "Fuel Bases", "Years": "All", "Source": "EPE"},
|
144
145
|
{"Function": "read_glp_bases", "Geography": "GLP (LPG) Bases", "Years": "All", "Source": "EPE"},
|
145
146
|
{"Function": "read_processing_facilities", "Geography": "Oil and Gas Processing Facilities", "Years": "All", "Source": "EPE"},
|
@@ -0,0 +1,87 @@
|
|
1
|
+
import geopandas as gpd
|
2
|
+
import tempfile
|
3
|
+
import os
|
4
|
+
import requests
|
5
|
+
from zipfile import ZipFile
|
6
|
+
from io import BytesIO
|
7
|
+
|
8
|
+
def read_oil_wells(simplified=False):
|
9
|
+
"""Download Brazilian Oil and Gas Wells data from ANP.
|
10
|
+
|
11
|
+
This function downloads and processes the Brazilian Oil and Gas Wells data
|
12
|
+
from ANP (National Petroleum Agency).
|
13
|
+
Original source: ANP - Agência Nacional do Petróleo, Gás Natural e Biocombustíveis
|
14
|
+
|
15
|
+
Parameters
|
16
|
+
----------
|
17
|
+
simplified : boolean, by default False
|
18
|
+
If True, returns a simplified version of the dataset with fewer columns
|
19
|
+
|
20
|
+
Returns
|
21
|
+
-------
|
22
|
+
gpd.GeoDataFrame
|
23
|
+
Geodataframe with Brazilian oil and gas wells data
|
24
|
+
|
25
|
+
Example
|
26
|
+
-------
|
27
|
+
>>> from tunned_geobr import read_oil_wells
|
28
|
+
|
29
|
+
# Read oil wells data
|
30
|
+
>>> wells = read_oil_wells()
|
31
|
+
"""
|
32
|
+
|
33
|
+
url = "https://gishub.anp.gov.br/geoserver/BD_ANP/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=BD_ANP%3APOCOS_SIRGAS&maxFeatures=40000&outputFormat=SHAPE-ZIP"
|
34
|
+
|
35
|
+
try:
|
36
|
+
# Download the zip file
|
37
|
+
response = requests.get(url)
|
38
|
+
if response.status_code != 200:
|
39
|
+
raise Exception("Failed to download oil wells data from ANP")
|
40
|
+
|
41
|
+
# Create a temporary directory
|
42
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
43
|
+
# Extract the zip file
|
44
|
+
with ZipFile(BytesIO(response.content)) as zip_ref:
|
45
|
+
zip_ref.extractall(temp_dir)
|
46
|
+
|
47
|
+
# Find the shapefile
|
48
|
+
shp_files = []
|
49
|
+
for root, dirs, files in os.walk(temp_dir):
|
50
|
+
shp_files.extend([os.path.join(root, f) for f in files if f.endswith('.shp')])
|
51
|
+
|
52
|
+
if not shp_files:
|
53
|
+
raise Exception("No shapefile found in the downloaded data")
|
54
|
+
|
55
|
+
# Read the shapefile
|
56
|
+
gdf = gpd.read_file(shp_files[0])
|
57
|
+
|
58
|
+
# Convert to SIRGAS 2000 (EPSG:4674) if not already
|
59
|
+
if gdf.crs is None:
|
60
|
+
gdf.crs = 4674
|
61
|
+
elif gdf.crs.to_epsg() != 4674:
|
62
|
+
gdf = gdf.to_crs(4674)
|
63
|
+
|
64
|
+
if simplified:
|
65
|
+
# Keep only the most relevant columns
|
66
|
+
# Note: Column names based on typical ANP data structure
|
67
|
+
columns_to_keep = [
|
68
|
+
'geometry',
|
69
|
+
'NOME', # Well name
|
70
|
+
'OPERADOR', # Operator
|
71
|
+
'BACIA', # Basin
|
72
|
+
'CAMPO', # Field
|
73
|
+
'SITUACAO', # Status
|
74
|
+
'CATEGORIA' # Category
|
75
|
+
]
|
76
|
+
|
77
|
+
# Filter columns that actually exist in the dataset
|
78
|
+
existing_columns = ['geometry'] + [col for col in columns_to_keep[1:] if col in gdf.columns]
|
79
|
+
gdf = gdf[existing_columns]
|
80
|
+
|
81
|
+
except Exception as e:
|
82
|
+
raise Exception(f"Error downloading oil wells data: {str(e)}")
|
83
|
+
|
84
|
+
return gdf
|
85
|
+
|
86
|
+
if __name__ == '__main__':
|
87
|
+
read_oil_wells()
|
@@ -0,0 +1,164 @@
|
|
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_sigel_wind_turbines(simplified=False, verbose=False):
|
14
|
+
"""Download Wind Turbines data from Sigel.
|
15
|
+
|
16
|
+
This function downloads and processes wind turbines data from Sigel (ANEEL).
|
17
|
+
Original source: ANEEL (Agência Nacional de Energia Elétrica)
|
18
|
+
|
19
|
+
Parameters
|
20
|
+
----------
|
21
|
+
simplified : boolean, by default False
|
22
|
+
If True, returns a simplified version of the dataset with fewer columns
|
23
|
+
verbose : boolean, by default False
|
24
|
+
If True, prints detailed information about the download process
|
25
|
+
|
26
|
+
Returns
|
27
|
+
-------
|
28
|
+
gpd.GeoDataFrame
|
29
|
+
Geodataframe with wind turbines data
|
30
|
+
|
31
|
+
Example
|
32
|
+
-------
|
33
|
+
>>> from tunned_geobr import read_sigel_wind_turbines
|
34
|
+
|
35
|
+
# Read wind turbines data
|
36
|
+
>>> wind_turbines = read_sigel_wind_turbines()
|
37
|
+
"""
|
38
|
+
|
39
|
+
# URL for the Sigel geoserver WFS service
|
40
|
+
url = r'https://sigel.aneel.gov.br/arcgis/rest/services/PORTAL/ExtractDataTaskAneel/GPServer/Extract%20Data%20Task/execute?f=json&env:outSR=102100&Layers_to_Clip=["Aerogeradores"]&Area_of_Interest={"geometryType":"esriGeometryPolygon","features":[{"geometry":{"rings":[[[-10056193.304181412,-5207437.87749587],[-10056193.304181412,2052245.3209151002],[-2405152.5209504515,2052245.3209151002],[-2405152.5209504515,-5207437.87749587],[-10056193.304181412,-5207437.87749587]]],"spatialReference":{"wkid":102100}}}],"sr":{"wkid":102100}}&Feature_Format=Shapefile - SHP - .shp&Raster_Format=Tagged Image File Format - TIFF - .tif'
|
41
|
+
|
42
|
+
try:
|
43
|
+
# Disable SSL verification warning
|
44
|
+
warnings.filterwarnings('ignore', message='Unverified HTTPS request')
|
45
|
+
|
46
|
+
if verbose:
|
47
|
+
print("Requesting data from Sigel server...")
|
48
|
+
|
49
|
+
response = requests.get(url, timeout=60, verify=False)
|
50
|
+
if not response.ok:
|
51
|
+
raise Exception(f"Error getting JSON response: {response.status_code}")
|
52
|
+
|
53
|
+
json_response = response.json()
|
54
|
+
|
55
|
+
if verbose:
|
56
|
+
print(f"JSON response received: {json.dumps(json_response, indent=2)[:500]}...")
|
57
|
+
|
58
|
+
if 'results' not in json_response or len(json_response['results']) == 0:
|
59
|
+
raise Exception("Invalid JSON response structure")
|
60
|
+
|
61
|
+
if 'value' not in json_response['results'][0] or 'url' not in json_response['results'][0]['value']:
|
62
|
+
raise Exception("URL not found in JSON response")
|
63
|
+
|
64
|
+
file_url = json_response['results'][0]['value']['url']
|
65
|
+
|
66
|
+
if verbose:
|
67
|
+
print(f"Downloading file from: {file_url}")
|
68
|
+
|
69
|
+
file_response = requests.get(file_url, stream=True, timeout=60, verify=False)
|
70
|
+
if not file_response.ok:
|
71
|
+
raise Exception(f"Error downloading file: {file_response.status_code}")
|
72
|
+
|
73
|
+
# Check if content is actually a zip file
|
74
|
+
content = file_response.content
|
75
|
+
if len(content) < 100:
|
76
|
+
if verbose:
|
77
|
+
print(f"Warning: Downloaded content is very small ({len(content)} bytes)")
|
78
|
+
print(f"Content preview: {content[:100]}")
|
79
|
+
|
80
|
+
# Create a temporary directory to extract the files
|
81
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
82
|
+
if verbose:
|
83
|
+
print(f"Extracting files to temporary directory: {temp_dir}")
|
84
|
+
|
85
|
+
try:
|
86
|
+
# Extract the zip file
|
87
|
+
with ZipFile(BytesIO(content)) as zip_ref:
|
88
|
+
zip_ref.extractall(temp_dir)
|
89
|
+
|
90
|
+
if verbose:
|
91
|
+
print(f"Files in zip: {zip_ref.namelist()}")
|
92
|
+
except Exception as zip_error:
|
93
|
+
if verbose:
|
94
|
+
print(f"Error extracting zip: {str(zip_error)}")
|
95
|
+
print(f"Saving content to debug.zip for inspection")
|
96
|
+
with open("debug.zip", "wb") as f:
|
97
|
+
f.write(content)
|
98
|
+
raise Exception(f"Failed to extract zip file: {str(zip_error)}")
|
99
|
+
|
100
|
+
# Find the shapefile
|
101
|
+
all_files = os.listdir(temp_dir)
|
102
|
+
if verbose:
|
103
|
+
print(f"Files in temp directory: {all_files}")
|
104
|
+
|
105
|
+
shp_files = [f for f in all_files if f.endswith('.shp')]
|
106
|
+
if not shp_files:
|
107
|
+
# Try looking in subdirectories
|
108
|
+
for root, dirs, files in os.walk(temp_dir):
|
109
|
+
shp_files.extend([os.path.join(root, f) for f in files if f.endswith('.shp')])
|
110
|
+
|
111
|
+
if not shp_files:
|
112
|
+
raise Exception("No shapefile found in the downloaded data")
|
113
|
+
|
114
|
+
# Read the shapefile
|
115
|
+
shp_path = shp_files[0] if os.path.isabs(shp_files[0]) else os.path.join(temp_dir, shp_files[0])
|
116
|
+
if verbose:
|
117
|
+
print(f"Reading shapefile: {shp_path}")
|
118
|
+
|
119
|
+
gdf = gpd.read_file(shp_path)
|
120
|
+
|
121
|
+
# Convert to SIRGAS 2000 (EPSG:4674)
|
122
|
+
gdf = gdf.to_crs(4674)
|
123
|
+
|
124
|
+
if verbose:
|
125
|
+
print(f"Data loaded successfully with {len(gdf)} records")
|
126
|
+
print(f"Columns: {gdf.columns.tolist()}")
|
127
|
+
|
128
|
+
if simplified:
|
129
|
+
# Keep only the most relevant columns based on actual data structure
|
130
|
+
columns_to_keep = [
|
131
|
+
'geometry',
|
132
|
+
# Add relevant columns for wind turbines here, e.g.,
|
133
|
+
# 'nome', # Plant name
|
134
|
+
# 'potencia', # Power capacity
|
135
|
+
# 'leilao', # Auction
|
136
|
+
# 'ceg', # CEG code
|
137
|
+
# 'ano_prev' # Expected year
|
138
|
+
]
|
139
|
+
|
140
|
+
# Filter columns that actually exist in the dataset
|
141
|
+
existing_columns = ['geometry'] + [col for col in columns_to_keep[1:] if col in gdf.columns]
|
142
|
+
if len(existing_columns) <= 1:
|
143
|
+
if verbose:
|
144
|
+
print("Warning: No matching columns found for simplified version. Returning all columns.")
|
145
|
+
else:
|
146
|
+
gdf = gdf[existing_columns]
|
147
|
+
|
148
|
+
except Exception as e:
|
149
|
+
raise Exception(f"Error downloading or processing wind turbines data: {str(e)}")
|
150
|
+
|
151
|
+
return gdf
|
152
|
+
|
153
|
+
if __name__ == '__main__':
|
154
|
+
try:
|
155
|
+
wind_turbines_data = read_sigel_wind_turbines(verbose=True)
|
156
|
+
print(f"Downloaded wind turbines data with {len(wind_turbines_data)} records and {len(wind_turbines_data.columns)} columns")
|
157
|
+
|
158
|
+
# Test simplified version
|
159
|
+
simplified_data = read_sigel_wind_turbines(simplified=True)
|
160
|
+
print(f"Simplified data has {len(simplified_data.columns)} columns: {simplified_data.columns.tolist()}")
|
161
|
+
except Exception as e:
|
162
|
+
print(f"Error: {str(e)}")
|
163
|
+
import traceback
|
164
|
+
traceback.print_exc()
|
@@ -1,10 +1,10 @@
|
|
1
|
-
tunned_geobr-1.0.
|
2
|
-
tunned_geobr-1.0.
|
3
|
-
tunned_geobr-1.0.
|
4
|
-
tunned_geobr-1.0.
|
5
|
-
tunned_geobr/__init__.py,sha256=
|
1
|
+
tunned_geobr-1.0.11.dist-info/METADATA,sha256=-OD5dmaWBgTi2LdFztCAK1lC9T7Ry8TFHnqMoiUJ7wM,5019
|
2
|
+
tunned_geobr-1.0.11.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
|
3
|
+
tunned_geobr-1.0.11.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
|
4
|
+
tunned_geobr-1.0.11.dist-info/licenses/LICENSE.txt,sha256=mECZRcbde3HssOKe1Co4zgqBLGVN0OWpTsEy3LIbcRA,75
|
5
|
+
tunned_geobr/__init__.py,sha256=FU_YkEkjkMlq6J2AxEV8WQLFFiGDIXj37Vyjz_hWNdQ,7595
|
6
6
|
tunned_geobr/data/grid_state_correspondence_table.csv,sha256=FpkBuX_-lRXQ1yBrQODxQgG9oha9Fd8A8zGKfdsDAmk,2660
|
7
|
-
tunned_geobr/list_geobr.py,sha256=
|
7
|
+
tunned_geobr/list_geobr.py,sha256=MaPOra0n2wPuakB-IPwK33x9uyXCWH5sjDb3D7eIQhk,17761
|
8
8
|
tunned_geobr/lookup_muni.py,sha256=ny1zU4i6OagvL4Mrc6XQWPgn2RrJa_mXlKXh81oVYsM,3462
|
9
9
|
tunned_geobr/read_ama_anemometric_towers.py,sha256=M3qKBTBYdqHzTuWtRrBiLA88Ymt6g0cf7sakJd5mTRo,4686
|
10
10
|
tunned_geobr/read_amazon.py,sha256=HiwKnYebWe3nDMDRUqHpKJIO76bA4ERm4iJlCPhagQg,1286
|
@@ -96,6 +96,7 @@ tunned_geobr/read_og_probabilistic_effective_basin.py,sha256=ftdY--3rZJwhCfbuQUL
|
|
96
96
|
tunned_geobr/read_og_total_ipa.py,sha256=0Tz4x7ZD7bRvXiLR2AitAmx-hQEVxAzNugfg2o0L3gc,5300
|
97
97
|
tunned_geobr/read_og_unconventional_resources.py,sha256=97lUpkJQtBZTUb4oPdvT9wxlm2yj6euWzLR4oGiezrc,5444
|
98
98
|
tunned_geobr/read_oil_and_derivatives_terminal.py,sha256=-BzLd9WpWWgH1pUaz9y16rg54FbZgUqJ_YTqbFak_7Y,5385
|
99
|
+
tunned_geobr/read_oil_wells.py,sha256=WeM4OY1x3KSdmdY2hQqCxlcvYySmsaCaICplRxulNUg,3080
|
99
100
|
tunned_geobr/read_pan_strategic_areas 2.py,sha256=alORMUQbnW_ER3_uOzqTbUaSyr-Y3Mg_bsoykxiGDMA,2654
|
100
101
|
tunned_geobr/read_pan_strategic_areas.py,sha256=EP-Qtx_q4lE3lsNNIUaoQc5j-9aKBkxY2BizTwWY3ZY,3375
|
101
102
|
tunned_geobr/read_pedology.py,sha256=xk_yOxIOVTHip4kj2y1xgO4fHKn8e1dv2cNOayXCtKk,2783
|
@@ -126,6 +127,7 @@ tunned_geobr/read_sedimentary_basins.py,sha256=mpCde4-WRdAAuHF-AwrODd0GpxRhzJOuP
|
|
126
127
|
tunned_geobr/read_semiarid.py,sha256=pxxYTWq8_UPUyblA7_FXXXRz-XOCrrebCvYQ-kgDSrU,1358
|
127
128
|
tunned_geobr/read_settlements.py,sha256=C47Wj4DhSDa-pSFfYK4uGDwtu4sUwqPMr-CuuxS95xg,3060
|
128
129
|
tunned_geobr/read_sigef_properties.py,sha256=rYdh8o_fhXom1A9wQsd5d9dKhT02wTpGRY2ACTpQZ4A,4735
|
130
|
+
tunned_geobr/read_sigel_wind_turbines.py,sha256=uobMxbB4M_npQfoGGkYKuImoFxaNy_OpNT1ZDLlUjzs,7112
|
129
131
|
tunned_geobr/read_snci_properties.py,sha256=80VUN5NesYiNTfioaw7aybLHDNpYJObQT-kV90big-c,3233
|
130
132
|
tunned_geobr/read_state.py,sha256=JgV3cR0LFbmwIzuzPbR_Zfy1bR_2eBeEPxunozctuag,3819
|
131
133
|
tunned_geobr/read_state_direct.py,sha256=8Tdz-gVH_t90BJngcfcpr0VLs5HfCUxRgRQj8hy4Bt0,3826
|
@@ -140,4 +142,4 @@ tunned_geobr/read_water_bodies_ana.py,sha256=Z-dpTPVgRHVndTeSFxx8uXn7ufMg2jm0Dlz
|
|
140
142
|
tunned_geobr/read_waterways.py,sha256=mEdoVogYWr5EYZ8bE3xMCVWyLrHYU7xTL2lUE0XbDAM,2951
|
141
143
|
tunned_geobr/read_weighting_area.py,sha256=m2X5Ua3jRqLlkqCQbIzR2jmo58pzqkyR3UYcGtgy20E,2325
|
142
144
|
tunned_geobr/utils.py,sha256=WT9PSGWvcERjj3yhfTvyWSE5ZiEjO4tYK5xIj5jJCg8,8170
|
143
|
-
tunned_geobr-1.0.
|
145
|
+
tunned_geobr-1.0.11.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|