Skip to content

A better “label centroid” initializer? (polylabel) #1587

Open
@Fil

Description

@Fil
Contributor

The centroid of a geometry is sometimes outside of it, for example (but not exclusively) with a MultiPolygon such as France+Guyane. This can result in labels or interactive tips that are quite far off from the shape they identify.

A great solution is to use @mapbox/polylabel, which guarantees that the center is inside —and furthermore at an optimal position for a centered label. The dependency is less that 1kB over the wire, including tinyqueue. An alternative approach could be to add an option to Plot.centroid, to make it choose the centroid of the largest polygon when given a multipolygon. Subpar solution, but cheaper.

Prototype https://observablehq.com/@observablehq/plot-pole-of-inaccessibility-1587

Activity

added
enhancementNew feature or request
questionFurther information is needed
on May 18, 2023
fgregg

fgregg commented on Aug 2, 2023

@fgregg

the centroid of the largest polygon could also lead to the point being outside the polygon. this would be the case for a crescent-moon shaped polygon.

polylabel sounds great!

Fil

Fil commented on Aug 2, 2023

@Fil
ContributorAuthor

We should probably call it labelCentroid, with an ellipseRatio option that defaults to 2 (?). And maybe add an anchor option so that we can align text on the left (with textAnchor: start) or on the right (with textAnchor: end). Since polylabel returns the radius, it's not expensive to add.

fgregg

fgregg commented on Aug 2, 2023

@fgregg

this approach could also make it easier to scale labels so they fit inside of polygons, since you'll know the ellipse dimensions anyway.

Fil

Fil commented on Jun 17, 2024

@Fil
ContributorAuthor

See #2087 (comment) for using this as part of a "geo" pointer option.

Fil

Fil commented on Jun 17, 2024

@Fil
ContributorAuthor

Related:

changed the title [-]A better “label centroid” initializer?[/-] [+]A better “label centroid” initializer? (polylabel)[/+] on Aug 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestquestionFurther information is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @Fil@fgregg

      Issue actions

        A better “label centroid” initializer? (polylabel) · Issue #1587 · observablehq/plot