CoolFace
Datasetpublic

NoeFlandre/osm-polygon-website-tag-eunis

OSM Polygon Website Dataset OpenStreetMap closed ways and polygon relations carrying a non-empty website OR contact:website tag, with full main-page text extracted using Trafilatura. Every statistic below is regenerated from the current upload-acknowledged Parquet artifacts. Snapshot Metric Value What it means Snapshot status In progress Current published snapshot Regional PBFs included 386 / 386 Published source shards / expected source PBFs… See the full description on the dataset page: https://huggingface.co/datasets/NoeFlandre/osm-polygon-website-tag-eunis.

sourceHugging Faceodblupdated 5d agoView on Hugging Face
0likes53downloads
Dataset Card

OSM Polygon Website Dataset

[image]

OpenStreetMap closed ways and polygon relations carrying a non-empty website OR contact:website tag, with full main-page text extracted using Trafilatura. Every statistic below is regenerated from the current upload-acknowledged Parquet artifacts.

Snapshot

MetricValueWhat it means
Snapshot statusIn progressCurrent published snapshot
Regional PBFs included386 / 386Published source shards / expected source PBFs
Published polygon rows1,726,474Rows in the public polygons/ files
Comparison observations2,716,855Source-level records with a website, contact:website, or Wikidata tag
Duplicate OSM objects104,927Objects observed in more than one source snapshot
Conflicting snapshot observations15Repeated observations whose tag values disagree with the selected version
Rejected polygon candidates868,905,743Candidate objects that did not produce a usable polygon row

Website text

TagURLsSuccessfulEmptyFailedWords
website1,518,6051,075,91056,248386,447368,299,585
contact:website169,238123,5204,93540,78339,386,070

Website-text table counts are unique (osm_type, osm_id) identities across regional rows; regional overlap duplicates are removed globally.

Unique polygons with extracted text: 1,192,980 Counts unique (osm_type, osm_id) polygons across regional rows when any copy has successful, trimmed non-empty website or contact:website text; regional overlap duplicates removed globally. Combined extracted words: 407,685,655

Languages

Detected with GlotLID v3 on successfully extracted text; labels are exact script-aware language_Script codes with a top-1 probability column.

MetricValue
Distinct languages397
Labeled website texts1,075,910
Labeled contact:website texts123,520

Top 10 labels across both tags:

LanguageTexts
eng_Latn533,896
deu_Latn216,762
fra_Latn85,516
pol_Latn42,731
nld_Latn30,533
spa_Latn30,358
rus_Cyrl28,691
ita_Latn25,038
jpn_Jpan24,208
por_Latn22,377

Sentences

Extracted text is segmented with SaT for the 85 languages the segmenter covers; text in any other detected language records unsupported_language instead of sentences. Segments carry their own trailing spaces but not the line breaks that separated them, so joining them does not reproduce the source text; the full text stays in the *_text columns.

MetricValue
Sentences45,823,447
Segmented website texts1,073,468
Segmented contact:website texts125,132
Texts in an uncovered language37,473

Mean sentences per segmented text: 38.2

Polygon geometry

Surface and shape statistics computed over every published polygon row from the area_m2, bbox, and geometry columns. Areas are geodesic on the WGS84 ellipsoid. Population scope: published polygon rows. The complete breakdown is published as `stats.json`.

MetricValue
Polygons measured1,726,474
Total area906,230.67 km²
Median area946.58 m²
Mean area524,902.59 m²
Smallest / largest area0.01 / 129,636,243,089.97 m²
p95 area82,053.29 m²
MultiPolygon rows32
Rows with holes20
Rows below 1 m²393

Dataset bounding box: [-179.992396, -77.847199, 179.325994, 82.172551] (min lon, min lat, max lon, max lat).

Geographic distribution

[image]

H3 resolution 3 contains 5,850 occupied cells across 1,192,980 unique polygons with successfully extracted, non-empty website or contact:website text, globally deduplicated by (osm_type, osm_id); regional overlap duplicates removed globally. The color scale is logarithmic, counts are absolute, and a Natural Earth 1:110m land backdrop provides geographic context.

Links

Live metrics: Trackio dashboard; it shows this frozen dataset snapshot. Code and README: GitHub repository and README.

Top website hostnames

HostnamePolygons
www.facebook.com10,238
www.mcdonalds.com9,886
tools.usps.com6,382
www.dollargeneral.com5,909
locations.tacobell.com4,579
www.walmart.com4,446
www.hilton.com4,366
www.marriott.com4,314
www.cvs.com3,975
www.bk.com3,806

Top contact:website hostnames

HostnamePolygons
www.7-eleven.com1,587
www.tesco.com1,441
5ka.ru1,224
rosneft-azs.ru848
www.mcdonalds.com827
locations.dunkindonuts.com744
storelocator.asda.com692
lukoil.ru575
www.netto-online.de498
www.pochta.ru497

Methodology and quality

Geometry is assembled with libosmium. Full main text is extracted independently for both website tags with Trafilatura and is not truncated. Word counts are Python Unicode \w+ matches.

Text statuses are absent, pending, success, empty, invalid_url, unsafe_url, fetch_error, or extract_error. A source is enriched only when every status is success or absent. Failed values retry on later resumptions; successful values are cached.

A URL is marked unsafe_url when its hostname, or any redirect target, does not resolve exclusively to globally routable public IP addresses. Localhost, private, reserved, multicast, and unspecified targets are blocked. Unsupported schemes and URLs containing credentials are classified as invalid_url; redirect limits, timeouts, oversized responses, and unsupported content types are recorded as fetch_error.

Dataset contents

  • —polygons/*.parquet: the public polygon split, one shard per source PBF.
  • —analysis/*.parquet: detailed overlap, provenance, hostname, duplicate, conflict, and per-source statistics.
  • —deduplication_summary.json: counts and tag-conflict totals from the global canonicalization pass.
  • —manifests/: source inventory, upload checkpoints, and completion receipt.

Public polygon schema

ColumnTypeNullableDescription
polygon_idstringnoDeterministic source-scoped identifier of the form `<source-stem>:<osm_type>/<osm_id>`.
regionstringnoHuman-readable region label derived from the source PBF filename (Geofabrik convention). Stable and independent of the source filename's extension.
source_pbfstringnoOriginal source PBF filename (no path). Reconstructed from the run's processed-pbfs manifest.
osm_typestringno`"way" for a closed polygonal way, "relation"` for an assembled multipolygon or boundary relation.
osm_idint64noOriginal OSM numeric identifier of the way or relation. Way and relation namespaces are kept distinct.
osm_versionint32noOSM version number as recorded on the object at extraction time.
osm_timestamptimestamp[us, tz=UTC]noOSM last-edit timestamp as recorded on the object at extraction time. UTC.
namestringyesTrimmed `name tag value. None` when the tag is absent.
websitestringyesTrimmed original `website tag value. Nullable: None` when the tag is absent or whitespace-only.
contact_websitestringyesTrimmed original `contact:website tag value. Nullable: None` when the tag is absent or whitespace-only.
has_websiteboolno`True iff the trimmed website` tag is non-empty.
has_contact_websiteboolno`True iff the trimmed contact:website tag is non-empty. Only the exact key is checked; unrelated contact:*` keys do not contribute.
has_any_websiteboolno`True iff has_website OR has_contact_website. Always True` in the public shard (inclusion invariant).
website_classstringyesDiscrete classification of the `website value, or None` when the tag is absent.
contact_website_classstringyesDiscrete classification of the `contact:website value, or None` when the tag is absent.
website_hostnamestringyesLowercased hostname extracted from `website, or None` when the value is not parseable as a URL or bare hostname.
contact_website_hostnamestringyesLowercased hostname extracted from `contact_website, or None` when the value is not parseable.
tagsstringnoDeterministic JSON object containing every tag of the source OSM object, with keys sorted. `{}` when the object carries no tags.
tag_keysstringnoDeterministic JSON array of every tag key of the source OSM object, sorted lexicographically.
tag_countint32noNumber of tags carried by the source OSM object. Always non-negative.
osm_primary_tagstringnoPrimary OSM category key for the object, selected from a frozen precedence list (`boundary > building > amenity > ...). other` when no recognised key is present.
geometrystringnoDeterministic GeoJSON `Polygon or MultiPolygon in WGS84. Coordinate order is [lon, lat]`. Coordinates are rounded to seven decimal places. Empty geometries are rejected at extraction time and counted as expected exclusions; they never reach this column.
centroidstringnoDeterministic GeoJSON `Point in WGS84 ([lon, lat]`) representing the polygon's centroid. Coordinates are rounded to seven decimal places.
centroid_kindstringnoIdentifier of the centroid algorithm used. Currently always `"lambert_azimuthal_equal_area"` -- the centroid is computed in a Lambert azimuthal equal-area projection centred on the polygon's area-weighted outer-ring barycenter and reprojected back to WGS84. NOT a geodesic centroid.
latdoublenoCentroid latitude in WGS84 decimal degrees. Rounded to seven decimal places. `NaN` and infinity are never produced.
londoublenoCentroid longitude in WGS84 decimal degrees. Rounded to seven decimal places. `NaN` and infinity are never produced.
bboxstringnoDeterministic JSON array `[min_lon, min_lat, max_lon, max_lat]` in WGS84 decimal degrees. Coordinates are rounded to seven decimal places.
area_m2doublenoPolygon area in square metres computed on the WGS84 ellipsoid via `pyproj.Geod`. Outer-ring area minus the absolute area of every inner ring. Always finite and non-negative.
area_bucketstringnoCoarse area bucket. One of `"<10m2", "10-100m2", "100m2-1km2", "1-10km2", "10-100km2", "100km2-1000km2", ">=1000km2"`.
schema_versionstringnoSchema version of the public polygon table. Default extraction and enrichment use `SCHEMA_VERSION (v1.3); the opt-in language stage writes v1.4`.
website_textlarge_stringyesFull main text extracted from `website` with Trafilatura; null unless extraction succeeds.
website_word_countint64yesNumber of Python Unicode `\w+ sequences in website_text`; null without text.
website_text_statusstringnoWebsite text enrichment status from the documented frozen vocabulary.
contact_website_textlarge_stringyesFull main text extracted independently from `contact:website` with Trafilatura; null unless extraction succeeds.
contact_website_word_countint64yesNumber of Python Unicode `\w+ sequences in contact_website_text`; null without text.
contact_website_text_statusstringnoContact website text enrichment status from the documented frozen vocabulary.
website_languagestringyesExact script-aware GlotLID language label for `website_text`; null unless text was successfully extracted and detected.
website_language_probabilitydoubleyesTop-1 GlotLID probability for `website_language`; null without a successful language detection.
contact_website_languagestringyesExact script-aware GlotLID language label for `contact_website_text`; null unless text was successfully extracted and detected.
contact_website_language_probabilitydoubleyesTop-1 GlotLID probability for `contact_website_language`; null without a successful language detection.
website_sentenceslist<element: string not null>yesSentences segmented from `website_text with SaT; null unless website_sentence_status is success. Segments keep their own trailing whitespace but not the line breaks that separated them, so joining them does not reproduce website_text`.
website_sentence_countint32yesNumber of sentences in `website_sentences`; null unless the text was segmented.
website_sentence_statusstringnoWhy `website_text was or was not segmented: success, absent when no text was extracted, unsupported_language when the detected language is outside the segmenter's range, or empty_text` when the text carries no segmentable content.
contact_website_sentenceslist<element: string not null>yesSentences segmented from `contact_website_text with SaT; null unless contact_website_sentence_status is success. Segments keep their own trailing whitespace but not the line breaks that separated them, so joining them does not reproduce contact_website_text`.
contact_website_sentence_countint32yesNumber of sentences in `contact_website_sentences`; null unless the text was segmented.
contact_website_sentence_statusstringnoWhy `contact_website_text was or was not segmented: success, absent when no text was extracted, unsupported_language when the detected language is outside the segmenter's range, or empty_text` when the text carries no segmentable content.

Provenance and license

Source filename, byte size, and nanosecond modification time are recorded before processing. The completion receipt binds finalized artifacts by relative path, byte size, and SHA-256.

The map backdrop uses Natural Earth 1:110m Admin-0 country geography, distributed in the source tree under its public-domain terms.

© OpenStreetMap contributors. OpenStreetMap data is available under the Open Database License (ODbL) 1.0; see the OpenStreetMap copyright and attribution page. Regional PBF extracts are provided by Geofabrik.

Website text is third-party content, separate from the OSM data, and is not covered by the ODbL. This dataset asserts no license for that text and grants no additional reuse rights: copyright and licensing conditions remain with each source website. Check the source site's terms or license before using or redistributing extracted text.

Citation

If you use this dataset, please cite it using the machine-readable metadata in `CITATION.cff`. GitHub and the Hugging Face dataset page can then display the citation directly.

Flandre, Noé. OSM Polygon Website Tag Dataset. Hugging Face dataset