diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 383b31462..24e03c9c9 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -11,6 +11,7 @@
"@solidjs/router": "^0.15.1",
"array-shuffle": "^3.0.0",
"autoprefixer": "^10.4.20",
+ "leaflet": "^2.0.0-alpha.1",
"medium-zoom": "^1.1.0",
"mqtt": "^5.14.0",
"postcss": "^8.5.6",
@@ -2877,6 +2878,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/leaflet": {
+ "version": "2.0.0-alpha.1",
+ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-2.0.0-alpha.1.tgz",
+ "integrity": "sha512-2EJU27z/wljOgQCyybRkfrm5Xc3uy6huKehh0UAPsrAdwnSMxaplsqCl9cXPAuDm6D7uL6PCznYMDVIsaAdSdA==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index de022adb3..85a04498e 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -13,6 +13,7 @@
"@solidjs/router": "^0.15.1",
"array-shuffle": "^3.0.0",
"autoprefixer": "^10.4.20",
+ "leaflet": "^2.0.0-alpha.1",
"medium-zoom": "^1.1.0",
"mqtt": "^5.14.0",
"postcss": "^8.5.6",
diff --git a/frontend/src/pages/map/index.jsx b/frontend/src/pages/map/index.jsx
new file mode 100644
index 000000000..c3b50360e
--- /dev/null
+++ b/frontend/src/pages/map/index.jsx
@@ -0,0 +1,65 @@
+import styles from "./styles.module.css"
+
+import { For, createSignal, Show, onMount, createResource } from "solid-js"
+import L, { Map, TileLayer, Marker, Circle, Polygon, Popup } from "leaflet"
+
+import "leaflet/dist/leaflet.css"
+import { getObjects } from "../../../../lib/ecotaxa"
+
+// https://github.com/ecotaxa/ecotaxa_back/issues/64
+const api_url = new URL("http://example.com/ecotaxa/api/")
+api_url.hostname = document.location.hostname
+
+// No need for CORS for
+const vault_url = "https://ecotaxa.obs-vlfr.fr/vault/"
+
+export default function MapPage() {
+ let div_map
+
+ onMount(() => {
+ const map = new Map(div_map)
+ // map.setZoom(2)
+ .setView([48.587410962886686, -3.8383494867168175], 2)
+
+ const tile_layer = new TileLayer(
+ "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
+ {
+ maxZoom: 19,
+ attribution:
+ '© OpenStreetMap',
+ },
+ )
+ tile_layer.addTo(map)
+
+ getObjects({
+ api_url,
+ vault_url,
+ project_id: 15730,
+ window_start: 0,
+ window_size: 5000,
+ }).then((result) => {
+ console.log(result)
+ result.objects.forEach((object) => {
+ if (object.latitude && object.longitude) {
+ const market = new Marker([object.latitude, object.longitude])
+ market.addTo(map)
+ }
+ })
+ })
+
+ // const marker = new Marker([48.587410962886686, -3.8383494867168175])
+ // marker.addTo(map)
+ })
+
+ return (
+ <>
+
+
+
+
+
+ >
+ )
+}
diff --git a/frontend/src/pages/map/styles.module.css b/frontend/src/pages/map/styles.module.css
new file mode 100644
index 000000000..30b52cfb7
--- /dev/null
+++ b/frontend/src/pages/map/styles.module.css
@@ -0,0 +1,9 @@
+/*:global(html) {
+ background-color: #f3f3f3;
+}*/
+
+.map {
+ /*height: 180px;*/
+ /*width: 100%;*/
+ height: 1024px;
+}
diff --git a/lib/ecotaxa.js b/lib/ecotaxa.js
index f064fbf8f..5dfe4571c 100644
--- a/lib/ecotaxa.js
+++ b/lib/ecotaxa.js
@@ -31,6 +31,8 @@ export async function getObjects({
"img.thumb_width",
"img.thumb_height",
"txo.display_name",
+ "obj.latitude",
+ "obj.longitude",
]
url.search = new URLSearchParams({
@@ -61,12 +63,16 @@ export async function getObjects({
const thumb_width = details[idx][4]
const thumb_height = details[idx][5]
const label = details[idx][6]
+ const latitude = details[idx][7]
+ const longitude = details[idx][8]
const url = new URL(file_name, vault_url)
const thumb_url = new URL(thumb_file_name || file_name, vault_url)
return {
label,
+ latitude,
+ longitude,
file: {
url: url,
width,