Gallery › robotparts › robotparts sellers by country

robotparts sellers by country

Where robotparts' sellers are based and where they ship, from what each seller published with its listings (seller_country, ships_to). Markers sit on the country's Natural Earth label point; rows at one point count together and a counted marker lists its rows. The basemap is bundled: no tile server is asked.

robotpartsmaptable4 views of one sellers.json

The .base file and its data

Every tab above is one entry of this file; the views read these rows. ⋯ in the toolbar copies the current view as YAML.

# Where robotparts' sellers are based and where they ship, from the sellers' own listings (seller_country,
# ships_to). Obsidian Bases grammar plus the Maps plugin's keys (docs/CONTRACT.md §5).
data: sellers.json
properties:
  country_name: { displayName: Country }
  seller: { displayName: Seller }
  relation: { displayName: Relation }
views:
  - type: map
    name: Where sellers ship
    filters: 'relation == "ships to"'
    coordinates: coordinates
    markerColor: seller
  - type: map
    name: Where sellers are based
    filters: 'relation == "based in"'
    coordinates: coordinates
    markerColor: seller
  - type: map
    name: Ships to, one colour
    filters: 'relation == "ships to"'
    coordinates: coordinates
    markerColor: var(--data-series-3)
    center: [50, 10]
    defaultZoom: 2.5
  - type: table
    name: By country
    order: [country_name, country, relation, seller, seller_name, listings, coordinates]
    groupBy: { property: country_name, direction: ASC }
// sellers.json: 322 rows, 115 KB; the first 3
{
 "id": "robotparts-sellers",
 "title": "Sellers by country",
 "titleProperty": "country_name",
 "source": "robotparts parts/*/quotes.jsonl (seller_country, ships_to) + Natural Earth 1:110m label points",
 "properties": {
  "country_name": {
   "type": "text",
   "label": "Country",
   "width": 180
  },
  "country": {
   "type": "text",
   "label": "ISO code"
  },
  "relation": {
   "type": "text",
   "label": "Relation",
   "display": "badge",
   "colors": {
    "based in": 8,
    "ships to": 1
   }
  },
  "seller": {
   "type": "text",
   "label": "Seller",
   "display": "badge",
   "colors": {
    "aifitlab.com": 1,
    "www.bravoelectro.com": 2,
    "www.trcelectronics.com": 3,
    "www.ztec.dk": 4,
    "www.omc-stepperonline.com": 5,
    "thinklucid.com": 6,
    "va-imaging.com": 7
   }
  },
  "seller_name": {
   "type": "text",
   "label": "Seller name"
  },
  "coordinates": {
   "type": "list",
   "label": "Point (lat, lng)"
  },
  "listings": {
   "type": "number",
   "label": "Listings (seller)"
  }
 },
 "rows": [
  {
   "id": "aifitlab.com-based-in-hk",
   "seller": "aifitlab.com",
   "seller_name": "aifitlab.com",
   "relation": "based in",
   "country": "HK",
   "country_name": "Hong Kong",
   "coordinates": {
    "value": [
     22.32,
     114.17
    ],
    "basis": "assumed",
    "note": "Hong Kong is not a polygon in Natural Earth 1:110m; its centre entered by hand"
   },
   "listings": 1230
  },
  {
   "id": "va-imaging.com-based-in-nl",
   "seller": "va-imaging.com",
   "seller_name": "VA Imaging (Netherlands, Daheng distributor)",
   "relation": "based in",
   "country": "NL",
   "country_name": "Netherlands",
   "coordinates": {
    "value": [
     52.422,
     5.611
    ],
    "basis": "derived",
    "source": "Natural Earth 1:110m label point"
   },
   "listings": 8
  },
  {
   "id": "www.trcelectronics.com-based-in-us",
   "seller": "www.trcelectronics.com",
   "seller_name": "TRC Electronics",
   "relation": "based in",
   "country": "US",
   "country_name": "United States of America",
   "coordinates": {
    "value": [
     39.538,
     -97.483
    ],
    "basis": "derived",
    "source": "Natural Earth 1:110m label point"
   },
   "listings": 279
  }
 ]
}
README.md
# robotparts sellers by country

Where robotparts' sellers are based and where they ship, from what each seller published with its listings
(`seller_country`, `ships_to`). Markers sit on the country's Natural Earth label point; rows at one point count
together and a counted marker lists its rows. The basemap is bundled: no tile server is asked.

- **App:** robotparts
- **Replaces:** the part page's "Ships to <region>: yes / no" column (robotparts `build/site_pages.py`) and the
  seller table in `docs/sellers.md` for the question "who can ship to me".
- **Shows:** the map view (MapLibre GL on the bundled Natural Earth 1:110m countries) with `coordinates`,
  `markerColor` from a property (the `seller` column's `colors`) or a token (`var(--data-series-3)`), `center` and
  `defaultZoom`, filters, and the same rows grouped by country in a table.
- **Data:** `sellers.json`, written by `source/build.py` from robotparts' `parts/*/quotes.jsonl`. Countries too
  small for 1:110m have no point and say so; Hong Kong's centre is entered by hand and marked `assumed`. Makers
  have no country in robotparts, so none is shown.

The original UI it replaces

the part page's "Ships to <region>: yes / no" column (robotparts build/site_pages.py) and the seller table in docs/sellers.md for the question "who can ship to me".

What it shows

the map view (MapLibre GL on the bundled Natural Earth 1:110m countries) with coordinates, markerColor from a property (the seller column's colors) or a token (var(--data-series-3)), center and defaultZoom, filters, and the same rows grouped by country in a table.

Data

sellers.json, written by source/build.py from robotparts' parts/*/quotes.jsonl. Countries too small for 1:110m have no point and say so; Hong Kong's centre is entered by hand and marked assumed. Makers have no country in robotparts, so none is shown.