mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-12 22:13:05 +00:00
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import type { PolygonalFeature } from '../../src/lib/bahiaGeometriesTypes.js'
|
|
import {
|
|
featureContainsPoint,
|
|
polygonRingsOf,
|
|
type GeoPoint,
|
|
} from '../../src/lib/municipalityProximity.js'
|
|
|
|
export type FeatureBounds = {
|
|
west: number
|
|
east: number
|
|
south: number
|
|
north: number
|
|
}
|
|
|
|
/** Bounding box of every ring of a mesh feature. Shared by the int and e2e suites. */
|
|
export const featureBounds = (feature: PolygonalFeature): FeatureBounds => {
|
|
const positions = polygonRingsOf(feature).flat(2)
|
|
const longitudes = positions.map(([lng]) => lng)
|
|
const latitudes = positions.map(([, lat]) => lat)
|
|
|
|
return {
|
|
west: Math.min(...longitudes),
|
|
east: Math.max(...longitudes),
|
|
south: Math.min(...latitudes),
|
|
north: Math.max(...latitudes),
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A real interior point of the feature: a centroid can fall outside a concave
|
|
* município, so scan a coarse grid inside the bounding box (shared by the B14
|
|
* geo spec and the S39 home sample spec).
|
|
*/
|
|
export const interiorPointOf = (feature: PolygonalFeature): GeoPoint => {
|
|
const { west, east, south, north } = featureBounds(feature)
|
|
const steps = 24
|
|
|
|
for (let row = 1; row < steps; row += 1) {
|
|
for (let column = 1; column < steps; column += 1) {
|
|
const point = {
|
|
lng: west + ((east - west) * column) / steps,
|
|
lat: south + ((north - south) * row) / steps,
|
|
}
|
|
if (featureContainsPoint(feature, point)) return point
|
|
}
|
|
}
|
|
|
|
throw new Error('No interior point found in the feature bounding box.')
|
|
}
|