Skip to content

Commit

Permalink
fix: error in area calculations caused crash of endpoint
Browse files Browse the repository at this point in the history
Signed-off-by: Evan Prodromou <[email protected]>
  • Loading branch information
evanp committed May 6, 2024
1 parent 9050df9 commit f65fc01
Showing 1 changed file with 22 additions and 9 deletions.
31 changes: 22 additions & 9 deletions global-api/routes/city_boundaries_endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import json
from models.osm import Osm
from decimal import Decimal
from shapely.geometry import Point, shape
from shapely.geometry import Point, shape, Polygon, MultiPolygon
from shapely.wkt import loads
import pyproj
from functools import partial
from shapely.ops import transform
import math
from pyproj import Transformer

api_router = APIRouter(prefix="/api/v0")

Expand Down Expand Up @@ -43,18 +43,31 @@ def epsg_code(polygon):

return code

def transform_geometry(geometry, transformer):
if isinstance(geometry, Polygon):
transformed_polygon = []
for lat, lon in geometry.exterior.coords:
x, y = transformer.transform(lon, lat)
transformed_polygon.append((x, y))
return Polygon(transformed_polygon)
elif isinstance(geometry, MultiPolygon):
transformed_polygons = []
for polygon in geometry.geoms:
transformed_polygon = transform_geometry(polygon, transformer)
transformed_polygons.append(transformed_polygon)
return MultiPolygon(transformed_polygons)
else:
raise ValueError("Unsupported geometry type")

def get_area(geometry):
polygon = loads(geometry)
code = epsg_code(polygon)

proj = partial(
pyproj.transform,
pyproj.Proj("epsg:4326"), # lat/lon
pyproj.Proj(f'epsg:{code}')
)
transformer = Transformer.from_crs("epsg:4326", f'epsg:5070')

utm_polygon = transform_geometry(polygon, transformer)

utm_polygon = transform(proj, polygon)
area = utm_polygon.area / 10.0**6 # in km^2

return area

@api_router.get("/cityboundary/city/{locode}")
Expand Down

0 comments on commit f65fc01

Please sign in to comment.