Files
planet/backend/app/services/collectors/arcgis_cables.py
rayd1o 99771a88c5 feat(config): make ArcGIS data source URLs configurable
- Add ARCGIS_CABLE_URL, ARCGIS_LANDING_POINT_URL, ARCGIS_CABLE_LANDING_RELATION_URL to config
- Use @property to read URL from settings in collectors
- URLs can now be configured via environment variables
2026-03-12 17:08:18 +08:00

88 lines
3.1 KiB
Python

"""ArcGIS Submarine Cables Collector
Collects submarine cable data from ArcGIS GeoJSON API.
"""
import json
from typing import Dict, Any, List
from datetime import datetime
import httpx
from app.services.collectors.base import BaseCollector
from app.core.config import settings
class ArcGISCableCollector(BaseCollector):
name = "arcgis_cables"
priority = "P1"
module = "L2"
frequency_hours = 168
data_type = "submarine_cable"
@property
def base_url(self) -> str:
return settings.ARCGIS_CABLE_URL
async def fetch(self) -> List[Dict[str, Any]]:
params = {"where": "1=1", "outFields": "*", "returnGeometry": "true", "f": "geojson"}
async with httpx.AsyncClient(timeout=60.0) as client:
response = await client.get(self.base_url, params=params)
response.raise_for_status()
return self.parse_response(response.json())
def parse_response(self, data: Dict[str, Any]) -> List[Dict[str, Any]]:
result = []
features = data.get("features", [])
for feature in features:
props = feature.get("properties", {})
geometry = feature.get("geometry", {})
route_coordinates = []
if geometry.get("type") == "MultiLineString":
coords = geometry.get("coordinates", [])
for line in coords:
line_coords = []
for point in line:
if len(point) >= 2:
line_coords.append(point)
if line_coords:
route_coordinates.append(line_coords)
elif geometry.get("type") == "LineString":
coords = geometry.get("coordinates", [])
line_coords = []
for point in coords:
if len(point) >= 2:
line_coords.append(point)
if line_coords:
route_coordinates.append(line_coords)
try:
entry = {
"source_id": f"arcgis_cable_{props.get('cable_id', props.get('OBJECTID', ''))}",
"name": props.get("Name", "Unknown"),
"country": "",
"city": "",
"latitude": "",
"longitude": "",
"value": str(props.get("length", "")).replace(",", ""),
"unit": "km",
"metadata": {
"cable_id": props.get("cable_id"),
"owners": props.get("owners"),
"rfs": props.get("rfs"),
"status": "active",
"year": props.get("year"),
"url": props.get("url"),
"color": props.get("color"),
"route_coordinates": route_coordinates,
},
"reference_date": datetime.utcnow().strftime("%Y-%m-%d"),
}
result.append(entry)
except (ValueError, TypeError, KeyError):
continue
return result