fix(api): /parcels/by-bbox — derive area_m2 via ST_Area + drop missing land_category
P0 prod 500 (GlitchTip backend, deploy #135+ on main): endpoint queried cad_parcels.area_m2 and cad_parcels.land_category, but the table only has (cad_num, geom). PR #336 (SF-B1) shipped with wrong column assumption. Repro: curl 'https://gendsgn.ru/api/v1/parcels/by-bbox?min_lat=...&min_lon=...' -> 500 ProgrammingError: column p.area_m2 does not exist Fix: compute area from geometry via ST_Area(p.geom::geography) (meter accuracy on a geography cast), return NULL::text for land_category until EGRN enrichment is wired (tracking: B5 EGRN contract follow-up). Verified inline through postgres MCP: SQL returns expected rows (66:41:0001001:18 area 2945931 m^2, etc.) on production schema.
This commit is contained in:
parent
fd4eb8c6f4
commit
2dd21f68b3
1 changed files with 6 additions and 3 deletions
|
|
@ -1034,6 +1034,9 @@ async def get_parcels_by_bbox(
|
||||||
lon_km = (max_lon - min_lon) * 111.32 * math.cos(math.radians(lat_mid))
|
lon_km = (max_lon - min_lon) * 111.32 * math.cos(math.radians(lat_mid))
|
||||||
bbox_area_km2 = round(lat_km * lon_km, 4)
|
bbox_area_km2 = round(lat_km * lon_km, 4)
|
||||||
|
|
||||||
|
# cad_parcels has only (cad_num, geom) — area derived via ST_Area on geography
|
||||||
|
# cast for meter accuracy. land_category not stored on this table; returned NULL
|
||||||
|
# until enrichment from EGRN is wired (tracking: vault B5 EGRN contract note).
|
||||||
sql = text("""
|
sql = text("""
|
||||||
WITH bbox AS (
|
WITH bbox AS (
|
||||||
SELECT ST_MakeEnvelope(
|
SELECT ST_MakeEnvelope(
|
||||||
|
|
@ -1048,8 +1051,8 @@ async def get_parcels_by_bbox(
|
||||||
p.cad_num,
|
p.cad_num,
|
||||||
ST_Y(ST_Centroid(p.geom)) AS centroid_lat,
|
ST_Y(ST_Centroid(p.geom)) AS centroid_lat,
|
||||||
ST_X(ST_Centroid(p.geom)) AS centroid_lon,
|
ST_X(ST_Centroid(p.geom)) AS centroid_lon,
|
||||||
p.area_m2,
|
ST_Area(p.geom::geography) AS area_m2,
|
||||||
p.land_category,
|
NULL::text AS land_category,
|
||||||
pus.status AS user_status
|
pus.status AS user_status
|
||||||
FROM cad_parcels p
|
FROM cad_parcels p
|
||||||
CROSS JOIN bbox
|
CROSS JOIN bbox
|
||||||
|
|
@ -1058,7 +1061,7 @@ async def get_parcels_by_bbox(
|
||||||
AND pus.user_id = CAST(:user_id AS text)
|
AND pus.user_id = CAST(:user_id AS text)
|
||||||
WHERE p.geom IS NOT NULL
|
WHERE p.geom IS NOT NULL
|
||||||
AND ST_Intersects(p.geom, bbox.env)
|
AND ST_Intersects(p.geom, bbox.env)
|
||||||
ORDER BY p.area_m2 DESC NULLS LAST
|
ORDER BY ST_Area(p.geom::geography) DESC NULLS LAST
|
||||||
LIMIT CAST(:limit AS int)
|
LIMIT CAST(:limit AS int)
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue