wm/map-multi-polygon
A Laravel/PHP package for managing multiple polygons on maps. Define, store, and render multi-polygon geometries with coordinate handling, boundary data, and map integration support, simplifying location-aware features and spatial datasets.
Architecture fit. wm/map-multi-polygon is a Laravel Nova field package, not application domain logic. Architecturally it is a thin presentation layer: a Vue component rendered inside Nova's form/detail views that serialises a multi-polygon geometry into a resource attribute. That is a good fit only if (a) the organisation already runs Laravel Nova as its admin surface, and (b) the persistence layer can tolerate geometry as a JSON/GeoJSON text column or is fronted by a cast that converts to/from a spatial column type. If the target system needs polygons consumed by backend geospatial queries (PostGIS ST_Intersects, spatial indexing, area computation), this package delivers none of that — it is an editor, not a geometry engine. It should be evaluated as a UI accelerator with a data-contract you own.
Integration feasibility. Mechanically trivial: composer require wm/map-multi-polygon, register the field on a Nova resource, point it at a column. The real work is the data contract — what the field writes (raw GeoJSON MultiPolygon? an array of coordinate rings? WKT?), the coordinate reference system it assumes (almost certainly WGS84/EPSG:4326 as delivered by browser map libraries), and whether ring winding/closure is normalised. Each of those needs to be verified empirically, not assumed, because the package has no dependents and no external documentation trail to cross-check against.
Technical risk. Material, and concentrated in three places:
webmappsrl/map-multi-polygon. There is no community signal that the frontend component has been exercised against Nova's internals beyond the author's own deployments. Nova field packages are tightly coupled to Nova's private Vue/Inertia component API, which changes across major versions.Change since last assessment (v1.0.4, 2025-05-27). Patch release, single fix: "handle null value in fillModelWithData". No new features, no deprecations, no public API change, no declared breaking change — it does not alter the architectural verdict. Two things are worth extracting from it:
fillModelWithData is the hydrate-from-database path — the step that turns a stored attribute back into editor state. A null-handling defect there means records with a null or absent geometry were previously mishandled, which is precisely the round-trip correctness risk already flagged. Treat this as confirmation that the serialisation path is under-tested upstream rather than as a resolved issue, and extend the spike accordingly (see below).Key questions to resolve before commitment.
composer.json, and is that range actively tested?fillModelWithData null case fixed in v1.0.4, and does the changelog for v1.0.4 ship with one?Stack fit. Appropriate only for a Laravel + Nova estate on a currently supported Nova version. For anything else — Filament, Livewire, Inertia/React front ends, headless APIs — it is not reusable; you would take the underlying map component or build the editor directly.
Migration path. Two scenarios:
json/text column (or PostGIS geometry(MultiPolygon, 4326) with an Eloquent cast), attach the field, done. Lowest effort, ~1–2 days including validation.Compatibility. Verify against your pinned Nova version first, in a scratch branch, before any resource is wired up. Check the package's version constraint against your laravel/framework and php constraints; a narrow constraint may force a Composer conflict that decides the question for you. Baseline on v1.0.4 or later — there is no reason to test against a version with a known null-hydration defect.
Sequencing.
NULL, and a record whose column holds an empty array/null JSON. Then save each through the field. This single test de-risks most of the assessment and directly exercises the code path that was just patched.NULL or malformed and confirm they are genuinely empty rather than nulled by the bug.Maintenance. Low ongoing cost if pinned and forked; potentially high and lumpy if consumed directly from upstream. v1.0.4 shows the maintainer is responsive enough to ship a one-line fix, which improves the near-term picture — but a two-year-old package receiving isolated single-commit patches is not the same as a maintained dependency with a support matrix. The realistic model remains: pin now, expect no upstream fix for the next Nova major, and own the Vue component yourself from that point. That is a small but non-zero permanent engineering commitment concentrated in one or two people — a knowledge-concentration risk worth naming.
Support. No SLA, no issue-tracker volume to infer responsiveness from, no dependents to lean on for community answers. Escalation path is a direct email to the publishing agency. The v1.0.4 patch is a mild positive signal on responsiveness; it does not constitute a support commitment. Acceptable for an internal admin tool; not acceptable for anything with a hard availability requirement.
Scaling. Two axes. Data volume: each edit ships the full geometry to the browser and back — fine for parcel/boundary-scale polygons, poor for thousands of vertices or hundreds of shapes per record. Query performance: JSON/text geometry cannot be spatially indexed; if downstream logic filters by location, plan the cast-to-PostGIS path and GiST index from the start rather than retrofitting. Also consider tile-provider rate limits if many editors use the map concurrently — self-hosted tiles remove that constraint at the cost of ops burden.
Failure modes.
Ramp-up. For a Laravel/Nova developer, hours — it is a field, not a subsystem. The real ramp-up is domain: GIS semantics (SRID, winding order, holes, multi-polygon vs polygon-collection) and the data contract your team must own. Non-technical editors will need brief UX guidance on drawing accuracy and how to correct a mis-drawn boundary, since geometric errors are invisible to them until a downstream report breaks. Overall: worth a short spike, worth pinning at v1.0.4 and forking, not worth adopting as an unexamined transitive dependency.
How can I help you explore Laravel packages today?