Files
2026-09-04 14:58:42 +08:00

130 lines
4.6 KiBLFS
Python

import json
from datetime import datetime
import geopandas as gpd
from shapely.geometry import Point
# File path configuration
EARTHQUAKES_FILE = "/root/earthquakes_2024.json"
PLATES_POLY_FILE = "/root/PB2002_plates.json"
BOUNDARIES_FILE = "/root/PB2002_boundaries.json"
output_file = "/root/answer.json"
# Projection (metric)
METRIC_CRS = "EPSG:4087"
def load_earthquakes_from_file():
"""
Load earthquake data from local file
"""
print(f"Loading earthquake data from {EARTHQUAKES_FILE}...")
with open(EARTHQUAKES_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
earthquakes = []
for feature in data["features"]:
props = feature["properties"]
coords = feature["geometry"]["coordinates"]
earthquakes.append({
"id": feature["id"],
"place": props["place"],
"time": props["time"],
"mag": props["mag"],
"longitude": coords[0],
"latitude": coords[1],
"depth": coords[2],
})
print(f"Successfully loaded {len(earthquakes)} earthquake records")
return earthquakes
def main():
print("Loading data...")
# Load earthquake data from local file
earthquakes = load_earthquakes_from_file()
gdf_plates = gpd.read_file(PLATES_POLY_FILE)
gdf_boundaries = gpd.read_file(BOUNDARIES_FILE)
# Convert to GeoDataFrame
geometry = [Point(eq["longitude"], eq["latitude"]) for eq in earthquakes]
gdf_eq = gpd.GeoDataFrame(earthquakes, geometry=geometry, crs="EPSG:4326")
# ================= Step 1: Identify Pacific Plate region =================
print("Filtering Pacific Plate region...")
# In plates.json, the Pacific Plate's code typically contains 'Pacific'
# Note: In PB2002, the Pacific Plate is called 'Pacific Plate', code 'PA'
pacific_poly = gdf_plates[gdf_plates["PlateName"] == "Pacific"].geometry.unary_union
# ================= Step 2: Spatial filtering (keep only earthquakes inside Pacific Plate) =================
# Use .within() to determine if points are inside the polygon
# Note: This step is time-consuming, consider unified projection or coarse filtering in 4326
print("Filtering earthquakes within the Pacific Plate...")
is_in_pacific = gdf_eq.within(pacific_poly)
pacific_quakes = gdf_eq[is_in_pacific].copy()
print(
f" -> Total of {len(gdf_eq)} earthquakes globally in 2024, {len(pacific_quakes)} occurred within the Pacific Plate."
)
if len(pacific_quakes) == 0:
print("No earthquakes found within the Pacific Plate.")
return
# ================= Step 3: Calculate distances =================
print("Calculating distances...")
# Project to metric coordinate system for distance calculation
pacific_quakes_proj = pacific_quakes.to_crs(METRIC_CRS)
# Only need to calculate distance to "Pacific boundaries" (lines with code PA-xx)
pacific_bounds = (
gdf_boundaries[gdf_boundaries["Name"].str.contains("PA")]
.to_crs(METRIC_CRS)
.geometry.unary_union
)
pacific_quakes["distance_km"] = (
pacific_quakes_proj.geometry.distance(pacific_bounds) / 1000.0
)
# ================= Step 4: Find the furthest one =================
# Sort
furthest_quake = pacific_quakes.nlargest(1, "distance_km").iloc[0]
# Convert time from Unix timestamp (milliseconds) to ISO 8601 format (UTC)
time_iso = datetime.utcfromtimestamp(furthest_quake['time'] / 1000.0).strftime('%Y-%m-%dT%H:%M:%SZ')
print("\n" + "=" * 30)
print("The most isolated earthquake in the Pacific Plate (furthest from boundaries)")
print("=" * 30)
print(f"Earthquake ID: {furthest_quake['id']}")
print(f"Location: {furthest_quake['place']}")
print(f"Time: {time_iso}")
print(f"Magnitude: {furthest_quake['mag']}")
print(f"Latitude: {furthest_quake['latitude']}")
print(f"Longitude: {furthest_quake['longitude']}")
print(f"Distance to nearest boundary: {furthest_quake['distance_km']:.2f} km")
# Output result to JSON file
result = {
"id": furthest_quake['id'],
"place": furthest_quake['place'],
"time": time_iso,
"magnitude": furthest_quake['mag'],
"latitude": furthest_quake['latitude'],
"longitude": furthest_quake['longitude'],
"distance_km": round(furthest_quake['distance_km'], 2)
}
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(result, f, indent=2, ensure_ascii=False)
print(f"\nResult saved to {output_file}")
if __name__ == "__main__":
main()