@trailstash/ultra 6.0.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +2 -2
- package/cli/build.js +1 -1
- package/components/help-modal.js +12 -0
- package/components/ultra-map.js +4 -4
- package/docs/yaml.md +7 -0
- package/index.js +1 -1
- package/lib/queryProviders/dsv.js +71 -0
- package/lib/queryProviders/geojson.js +1 -1
- package/lib/queryProviders/index.js +2 -0
- package/lib/queryProviders/kml.js +4 -4
- package/lib/queryProviders/osm.js +4 -4
- package/package.json +3 -1
package/.gitlab-ci.yml
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
test:
|
|
2
2
|
image: node:20
|
|
3
3
|
script:
|
|
4
|
-
- npm
|
|
4
|
+
- npm i
|
|
5
5
|
- npm test
|
|
6
6
|
pages:
|
|
7
7
|
image: node:20
|
|
8
8
|
script:
|
|
9
9
|
- apt update && apt install -y mkdocs-material jq moreutils
|
|
10
|
-
- npm
|
|
10
|
+
- npm i
|
|
11
11
|
# Update version
|
|
12
12
|
- jq ".version = \"$(git describe --tags --dirty | sed -e 's/^v//')\"" package.json | sponge package.json
|
|
13
13
|
- mv pages-config.mjs config.mjs
|
package/cli/build.js
CHANGED
|
@@ -26,7 +26,7 @@ export const buildConfigFromQuery = async (config, query) => {
|
|
|
26
26
|
};
|
|
27
27
|
const newConfig = `export const defaultMode = "map";
|
|
28
28
|
export const modes = {map: {settings: ${JSON.stringify(settings, null, 2)}}};`;
|
|
29
|
-
return `data:text/javascript;base64,${
|
|
29
|
+
return `data:text/javascript;base64,${Buffer.from(newConfig).toString("base64")}`;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
export const ultraRoot = path.dirname(
|
package/components/help-modal.js
CHANGED
|
@@ -7,6 +7,7 @@ import { version } from "../package.json";
|
|
|
7
7
|
import { version as maplibreVersion } from "maplibre-gl/package.json";
|
|
8
8
|
import { version as osmtogeojsonVersion } from "osm2geojson-ultra/package.json";
|
|
9
9
|
import { version as esridumpVersion } from "esri-dump/package.json";
|
|
10
|
+
import { version as csv2geojsonVersion } from "csv2geojson/package.json";
|
|
10
11
|
|
|
11
12
|
const help = `# Introduction
|
|
12
13
|
|
|
@@ -161,6 +162,17 @@ export class HelpModal extends HTMLElement {
|
|
|
161
162
|
</li>`
|
|
162
163
|
: ""
|
|
163
164
|
}
|
|
165
|
+
|
|
166
|
+
${
|
|
167
|
+
this.queryProviders.dsv
|
|
168
|
+
? `<li>
|
|
169
|
+
CSV/TSV/DSV support powered by
|
|
170
|
+
<a target="_blank" href="https://github.com/mapbox/csv2geojson"
|
|
171
|
+
>csv2geojson</a
|
|
172
|
+
> <code>${csv2geojsonVersion}</code>
|
|
173
|
+
</li>`
|
|
174
|
+
: ""
|
|
175
|
+
}
|
|
164
176
|
</ul>
|
|
165
177
|
</div>
|
|
166
178
|
`,
|
package/components/ultra-map.js
CHANGED
|
@@ -350,12 +350,12 @@ export class UltraMap extends HTMLElement {
|
|
|
350
350
|
this.#cachedQuery = query;
|
|
351
351
|
this.#cachedTransform = this.transform;
|
|
352
352
|
this.#cachedType = this.type;
|
|
353
|
-
let source = await
|
|
354
|
-
.source(query, controller, {
|
|
353
|
+
let source = await Promise.resolve(
|
|
354
|
+
queryProvider.source(query, controller, {
|
|
355
355
|
server: this.server,
|
|
356
356
|
bounds: this.refs.mapLibre.bounds,
|
|
357
|
-
})
|
|
358
|
-
|
|
357
|
+
}),
|
|
358
|
+
).catch(alertOnError);
|
|
359
359
|
if (this.transform) {
|
|
360
360
|
if (sandbox) {
|
|
361
361
|
source.data = await Promise.race([
|
package/docs/yaml.md
CHANGED
|
@@ -74,6 +74,7 @@ Automatically detects and chooses the right query provider out of the following:
|
|
|
74
74
|
- `osmWebsite`
|
|
75
75
|
- `osmWiki`
|
|
76
76
|
- `taginfo`
|
|
77
|
+
- `dsv`
|
|
77
78
|
|
|
78
79
|
See each provider for how it is auto-detected
|
|
79
80
|
|
|
@@ -249,6 +250,12 @@ Detected if
|
|
|
249
250
|
|
|
250
251
|
- A JSON document or URL to a JSON document containing a `tilejson` key and a `format` key equal to `pbf`.
|
|
251
252
|
|
|
253
|
+
### `dsv`
|
|
254
|
+
|
|
255
|
+
`,`, `\t`, `;`, or `|` delimited values. Can only represent points. Header must include columns
|
|
256
|
+
matching the the regexes `/(lat)(itude)?/` and `/l(on|ng)(gitude)?`. The delmiter is automatically
|
|
257
|
+
detected.
|
|
258
|
+
|
|
252
259
|
### `postpass`
|
|
253
260
|
|
|
254
261
|
An SQL query to be executed on a [Postpass](https://github.com/woodpeck/postpass) server. Server
|
package/index.js
CHANGED
|
@@ -56,10 +56,10 @@ customElements.define("fs-button", FSButton);
|
|
|
56
56
|
customElements.define("fa-icon", FontAwesomeIcon);
|
|
57
57
|
customElements.define("button-modal", ButtonModal);
|
|
58
58
|
customElements.define("map-popup", MapPopup);
|
|
59
|
+
customElements.define("html-control", HTMLControl);
|
|
59
60
|
customElements.define("ultra-map", UltraMap);
|
|
60
61
|
customElements.define("ultra-ide", UltraIDE);
|
|
61
62
|
customElements.define("ultra-loader", UltraLoader);
|
|
62
|
-
customElements.define("html-control", HTMLControl);
|
|
63
63
|
|
|
64
64
|
// reload on hash changes
|
|
65
65
|
addEventListener("hashchange", () => window.location.reload());
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { fetchIfHTTP } from "./util.js";
|
|
2
|
+
import { csv2geojson } from "csv2geojson";
|
|
3
|
+
|
|
4
|
+
const layers = (source) => [
|
|
5
|
+
{
|
|
6
|
+
id: `${source}-dsv-point`,
|
|
7
|
+
type: "symbol",
|
|
8
|
+
source,
|
|
9
|
+
filter: ["==", ["geometry-type"], "Point"],
|
|
10
|
+
layout: {
|
|
11
|
+
"icon-overlap": "always",
|
|
12
|
+
"icon-size": [
|
|
13
|
+
"case",
|
|
14
|
+
["==", ["get", "marker-size"], "large"],
|
|
15
|
+
1.5,
|
|
16
|
+
["==", ["get", "marker-size"], "medium"],
|
|
17
|
+
1,
|
|
18
|
+
["==", ["get", "marker-size"], "small"],
|
|
19
|
+
0.75,
|
|
20
|
+
1,
|
|
21
|
+
],
|
|
22
|
+
"icon-anchor": [
|
|
23
|
+
"case",
|
|
24
|
+
["!", ["has", "marker-symbol"]],
|
|
25
|
+
"bottom",
|
|
26
|
+
["==", ["get", "marker-symbol"], "marker"],
|
|
27
|
+
"bottom",
|
|
28
|
+
["==", ["get", "marker-symbol"], "marker-stroked"],
|
|
29
|
+
"bottom",
|
|
30
|
+
"center",
|
|
31
|
+
],
|
|
32
|
+
"icon-image": [
|
|
33
|
+
"coalesce",
|
|
34
|
+
["image", ["concat", "maki:", ["get", "marker-symbol"]]],
|
|
35
|
+
["image", "maki:marker"],
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
paint: {
|
|
39
|
+
"icon-color": ["coalesce", ["get", "marker-color"], "#555"],
|
|
40
|
+
"icon-halo-color": ["coalesce", ["get", "stroke-color"], "#fff"],
|
|
41
|
+
"icon-halo-width": [
|
|
42
|
+
"coalesce",
|
|
43
|
+
["get", "stroke-width"],
|
|
44
|
+
[
|
|
45
|
+
"case",
|
|
46
|
+
["==", ["get", "marker-size"], "large"],
|
|
47
|
+
3,
|
|
48
|
+
["==", ["get", "marker-size"], "medium"],
|
|
49
|
+
1.5,
|
|
50
|
+
["==", ["get", "marker-size"], "small"],
|
|
51
|
+
1,
|
|
52
|
+
1.5,
|
|
53
|
+
],
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
export default {
|
|
60
|
+
source: async function (query) {
|
|
61
|
+
query = await fetchIfHTTP(query);
|
|
62
|
+
const data = await new Promise((resolve, reject) =>
|
|
63
|
+
csv2geojson(query, { delimiter: "auto" }, (error, result) =>
|
|
64
|
+
error ? reject(error.message) : resolve(result),
|
|
65
|
+
),
|
|
66
|
+
);
|
|
67
|
+
return { type: "geojson", data, generateId: true };
|
|
68
|
+
},
|
|
69
|
+
layers,
|
|
70
|
+
fitBounds: true,
|
|
71
|
+
};
|
|
@@ -13,6 +13,7 @@ import tcx from "./tcx.js";
|
|
|
13
13
|
import raw from "./raw.js";
|
|
14
14
|
import esri from "./esri.js";
|
|
15
15
|
import javascript from "./javascript.js";
|
|
16
|
+
import dsv from "./dsv.js";
|
|
16
17
|
|
|
17
18
|
export const all = {
|
|
18
19
|
overpass,
|
|
@@ -35,6 +36,7 @@ export const all = {
|
|
|
35
36
|
osmWiki,
|
|
36
37
|
taginfo,
|
|
37
38
|
javascript,
|
|
39
|
+
dsv,
|
|
38
40
|
};
|
|
39
41
|
|
|
40
42
|
export default { auto: new AutoProvider(all), ...all };
|
|
@@ -3,7 +3,7 @@ import { kml } from "@tmcw/togeojson";
|
|
|
3
3
|
|
|
4
4
|
const layers = (source) => [
|
|
5
5
|
{
|
|
6
|
-
id: `${source}-
|
|
6
|
+
id: `${source}-kml-fill`,
|
|
7
7
|
type: "fill",
|
|
8
8
|
source,
|
|
9
9
|
filter: ["==", ["geometry-type"], "Polygon"],
|
|
@@ -13,7 +13,7 @@ const layers = (source) => [
|
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
|
-
id: `${source}-
|
|
16
|
+
id: `${source}-kml-fill-outline`,
|
|
17
17
|
type: "line",
|
|
18
18
|
source,
|
|
19
19
|
filter: ["==", ["geometry-type"], "Polygon"],
|
|
@@ -28,7 +28,7 @@ const layers = (source) => [
|
|
|
28
28
|
},
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
|
-
id: `${source}-
|
|
31
|
+
id: `${source}-kml-line`,
|
|
32
32
|
type: "line",
|
|
33
33
|
source,
|
|
34
34
|
filter: ["==", ["geometry-type"], "LineString"],
|
|
@@ -43,7 +43,7 @@ const layers = (source) => [
|
|
|
43
43
|
},
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
|
-
id: `${source}-
|
|
46
|
+
id: `${source}-kml-point`,
|
|
47
47
|
type: "symbol",
|
|
48
48
|
source,
|
|
49
49
|
filter: ["==", ["geometry-type"], "Point"],
|
|
@@ -68,7 +68,7 @@ export const popupContextBuilder = ({ properties, geometry }) => {
|
|
|
68
68
|
};
|
|
69
69
|
export const layers = (source) => [
|
|
70
70
|
{
|
|
71
|
-
id: `${source}-polygons`,
|
|
71
|
+
id: `${source}-osm-polygons`,
|
|
72
72
|
type: "fill",
|
|
73
73
|
source,
|
|
74
74
|
filter: ["all", ["==", ["geometry-type"], "Polygon"]],
|
|
@@ -77,7 +77,7 @@ export const layers = (source) => [
|
|
|
77
77
|
},
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
|
-
id: `${source}-polygons-stroke`,
|
|
80
|
+
id: `${source}-osm-polygons-stroke`,
|
|
81
81
|
type: "line",
|
|
82
82
|
source,
|
|
83
83
|
filter: ["all", ["==", ["geometry-type"], "Polygon"]],
|
|
@@ -85,7 +85,7 @@ export const layers = (source) => [
|
|
|
85
85
|
paint: { "line-width": 2, "line-color": "rgba(0, 51, 255, 0.6)" },
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
|
-
id: `${source}-lines`,
|
|
88
|
+
id: `${source}-osm-lines`,
|
|
89
89
|
type: "line",
|
|
90
90
|
source,
|
|
91
91
|
filter: ["all", ["==", ["geometry-type"], "LineString"]],
|
|
@@ -96,7 +96,7 @@ export const layers = (source) => [
|
|
|
96
96
|
layout: { "line-join": "round", "line-cap": "round" },
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
|
-
id: `${source}-points`,
|
|
99
|
+
id: `${source}-osm-points`,
|
|
100
100
|
type: "circle",
|
|
101
101
|
source,
|
|
102
102
|
filter: ["all", ["==", ["geometry-type"], "Point"]],
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "6.
|
|
6
|
+
"version": "6.1.0",
|
|
7
7
|
"description": "A web based tool for making MapLibre GL maps with data from sources such as Overpass, GeoJSON, GPX, KML, TCX, etc",
|
|
8
8
|
"main": "index.js",
|
|
9
9
|
"scripts": {
|
|
@@ -62,6 +62,8 @@
|
|
|
62
62
|
"@tmcw/togeojson": "^5.8.1",
|
|
63
63
|
"@trailstash/maplibre-component": "^1.0.1",
|
|
64
64
|
"@turf/bbox": "^7.1.0",
|
|
65
|
+
"buffer": "^6.0.3",
|
|
66
|
+
"csv2geojson": "^5.1.2",
|
|
65
67
|
"deep-equal": "^2.2.3",
|
|
66
68
|
"dompurify": "^3.1.7",
|
|
67
69
|
"esbuild": "^0.24.0",
|