this is the code of chatGPT with H3 : backend : <?php
header('Content-Type: application/json'); $pdo = new PDO("pgsql:host=localhost;dbname=database", "user", "password", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('password'); $shape = $_GET['shape']; $bbox = explode(',', $_GET['bbox']); $size = $_GET['size'] ?? null; $radius = $_GET['radius'] ?? null; $resolution = $_GET['resolution'] ?? 8; $cacheKey = "$shape:" . implode('-', $bbox) . ":$size:$radius:$resolution"; if ($redis->exists($cacheKey)) { echo $redis->get($cacheKey); exit; } if ($shape === "hexagone") { $sql = " SELECT h3_geo_to_h3(ST_Y(geom), ST_X(geom), :resolution) AS h3_cell, COUNT(*) AS point_count FROM your_points_table WHERE geom && ST_MakeEnvelope(:minLng, :minLat, :maxLng, :maxLat, 4326) GROUP BY h3_cell; "; $params = [':resolution' => $resolution, ':minLng' => $bbox[0], ':minLat' => $bbox[1], ':maxLng' => $bbox[2], ':maxLat' => $bbox[3]]; } elseif ($shape === "cercle") { $sql = " SELECT ST_AsGeoJSON(ST_Buffer(geom::geography, :radius)::geometry) AS shape, COUNT(*) AS point_count FROM your_points_table WHERE geom && ST_MakeEnvelope(:minLng, :minLat, :maxLng, :maxLat, 4326) GROUP BY shape; "; $params = [':radius' => $radius, ':minLng' => $bbox[0], ':minLat' => $bbox[1], ':maxLng' => $bbox[2], ':maxLat' => $bbox[3]]; } else { $sql = " SELECT ST_AsGeoJSON(ST_Envelope(ST_Buffer(geom::geography, :size, 'quad_segs=1')::geometry)) AS shape, COUNT(*) AS point_count FROM your_points_table WHERE geom && ST_MakeEnvelope(:minLng, :minLat, :maxLng, :maxLat, 4326) GROUP BY shape; "; $params = [':size' => $size, ':minLng' => $bbox[0], ':minLat' => $bbox[1], ':maxLng' => $bbox[2], ':maxLat' => $bbox[3]]; } $stmt = $pdo->prepare($sql); $stmt->execute($params); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); $redis->setEx($cacheKey, 3600, json_encode($result)); echo json_encode($result); frontend : <!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>Cartographie avec Forme Sélectionnée</title> <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css "> <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <style> #map { height: 500px; width: 100%; } </style> </head> <body> <h2>Choisissez la forme :</h2> <select id="shapeSelector"> <option value="hexagone">Hexagone</option> <option value="cercle">Cercle</option> <option value="carre">Carré</option> </select> <div id="map"></div> <script> const map = L.map('map').setView([0, 0], 2); L.tileLayer('https://{s}. tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map); let layer; function fetchData(shape) { const bbox = "-10,-10,10,10"; const url = `backend.php?shape=${shape}&bbox=${bbox}&size=1000&radius=500&resolution=8`; $.getJSON(url, function (data) { if (layer) map.removeLayer(layer); layer = L.geoJSON(data, { style: { color: shape === "carre" ? "green" : shape === "cercle" ? "blue" : "red", weight: 2, fillOpacity: 0.4 } }).addTo(map); }); } $("#shapeSelector").change(function () { fetchData($(this).val()); }); fetchData("hexagone"); // Chargement initial </script> </body> </html> Sylvain Ard 0549507724 0778380991 sylvain....@gmail.com https://www.sylvain-ard.fr <http://sylvain-ard.fr> Entreprise individuelle SIRET : 80079243400022 Appt 26 Bât A Résidence Le Patio 83 rue de la Bugellerie 86000 Poitiers Le ven. 14 mars 2025 à 20:49, Sylvain Ard <sylvain....@gmail.com> a écrit : > yes but H3 can't simplify the job ? > Sylvain Ard > 0549507724 > 0778380991 > sylvain....@gmail.com > https://www.sylvain-ard.fr <http://sylvain-ard.fr> > Entreprise individuelle SIRET : 80079243400022 > Appt 26 Bât A Résidence Le Patio > 83 rue de la Bugellerie > 86000 Poitiers > > > Le ven. 14 mars 2025 à 20:48, Brent Wood <brent.w...@niwa.co.nz> a écrit : > >> Hi, >> >> Off the top of my head... >> >> Postgis can easily cope with millions of records. Given the points are >> there, use that to create the hexagons as required - this can be done using >> https://postgis.net/docs/ST_HexagonGrid.html >> >> If you set up your QGIS project with preset zoom levels, and create a set >> of appropriately sized hexagons for each zoom level, then populate a column >> with the number of points it contains. >> >> There will be some devilish details - as you zoom in, the polygon's real >> area will get smaller, so will contain less points. A fixed symbology will >> therefore change the colour range with the scale. >> >> Calculating a normalised value, perhaps something like instead of the no >> of points, you calculate a normalised value - the hex at each scale with >> the most points gets 100, the rest get a value based on the no of >> points/the max for that scale, so all polygon datasets will have colours >> set to values between 0 and 100. All doable with SQL. >> >> Do all the data stuff in Postgis, then just plot in QGIS. >> >> There are various ways to set QGIS up for this, but one reasonably >> straightforward way that should work is having a separate hexagon layer for >> each scale, with a scale limit on displaying it so that all map scales are >> represented by one of the hexagon layers, with the fixed zoom >> levels/scales, set the same symbology for each layer, then group them into >> a single group. >> >> >> Something to consider anyway... >> >> Cheers >> >> Brent Wood >> >> Principal Technician, Fisheries >> NIWA >> DDI: +64 (4) 3860529 >> ------------------------------ >> *From:* QGIS-User <qgis-user-boun...@lists.osgeo.org> on behalf of >> Sylvain Ard via QGIS-User <qgis-user@lists.osgeo.org> >> *Sent:* Friday, March 14, 2025 23:35 >> *To:* qgis-user@lists.osgeo.org <qgis-user@lists.osgeo.org> >> *Subject:* [Qgis-user] question >> >> Hello, >> I'd like a map with hexagons that are darker the more points there are >> underneath. My points are in a PostgreSQL table. If there are no points, >> there should be no hexagon. The hexagons have a constant size on the >> screen, so they have to be recalculated each time the map is zoomed in. I >> want a truly optimized solution because I have millions of points. So, >> perhaps I could use QGIS-server. >> Please suggest a solution for both the server and client side. >> Best regards >> PS : my map must be like GBIF maps >> >> Sylvain Ard >> 0549507724 >> 0778380991 >> sylvain....@gmail.com >> https://www.sylvain-ard.fr <http://sylvain-ard.fr/> >> Entreprise individuelle SIRET : 80079243400022 >> Appt 26 Bât A Résidence Le Patio >> 83 rue de la Bugellerie >> 86000 Poitiers >> <https://www.niwa.co.nz/> >> Brent Wood >> Principal Technician - GIS and Spatial Data Management >> Programme Leader - Environmental Information Delivery >> +64-4-386-0529 >> >> National Institute of Water & Atmospheric Research Ltd (NIWA) >> 301 Evans Bay Parade Hataitai Wellington New Zealand >> *Connect with NIWA:* niwa.co.nz <https://www.niwa.co.nz/> Facebook >> <https://www.facebook.com/nzniwa> LinkedIn >> <https://www.linkedin.com/company/niwa> Twitter >> <https://twitter.com/niwa_nz> Instagram >> <https://www.instagram.com/niwa_science> YouTube >> <https://www.youtube.com/channel/UCJ-j3MLMg1H59Ak2UaNLL3A> To ensure >> compliance with legal requirements and to maintain cyber security >> standards, NIWA's IT systems are subject to ongoing monitoring, activity >> logging and auditing. This monitoring and auditing service may be provided >> by third parties. Such third parties can access information transmitted to, >> processed by and stored on NIWA's IT systems. >> Note: This email is intended solely for the use of the addressee and may >> contain information that is confidential or subject to legal professional >> privilege. If you receive this email in error please immediately notify the >> sender and delete the email. >> >
_______________________________________________ QGIS-User mailing list QGIS-User@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-user Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user