From a032a89186e57001a92f627252f24790f662ee8d Mon Sep 17 00:00:00 2001 From: huafengchun Date: Tue, 18 Jun 2024 22:23:59 +0800 Subject: [PATCH] Use amap instead of OSM --- grafana/Dockerfile | 7 ++ grafana/dashboards/charging-stats.json | 8 ++- .../dashboards/internal/charge-details.json | 10 +-- .../dashboards/internal/drive-details.json | 8 ++- grafana/dashboards/trip.json | 9 +-- grafana/dashboards/visited.json | 10 +-- grafana/proc.sql | 66 +++++++++++++++++++ grafana/run_init_sql.sh | 13 ++++ 8 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 grafana/proc.sql create mode 100644 grafana/run_init_sql.sh diff --git a/grafana/Dockerfile b/grafana/Dockerfile index fa5090d2bc..d97b444c64 100644 --- a/grafana/Dockerfile +++ b/grafana/Dockerfile @@ -16,6 +16,9 @@ ENV GF_ANALYTICS_REPORTING_ENABLED=false \ DATABASE_PORT=5432 \ DATABASE_SSL_MODE=disable +USER root +RUN apk update && apk add --no-cache postgresql-client + USER grafana COPY logo.svg /usr/share/grafana/public/img/grafana_icon.svg @@ -27,5 +30,9 @@ COPY dashboards.yml /etc/grafana/provisioning/dashboards/ COPY dashboards/internal/*.json /dashboards_internal/ COPY dashboards/reports/*.json /dashboards_reports/ COPY dashboards/*.json /dashboards/ +COPY proc.sql /proc.sql +COPY run_init_sql.sh /run_init_sql.sh + +ENTRYPOINT ["bash", "/run_init_sql.sh"] EXPOSE 3000 diff --git a/grafana/dashboards/charging-stats.json b/grafana/dashboards/charging-stats.json index 3346ecfd02..1b01d58b2c 100644 --- a/grafana/dashboards/charging-stats.json +++ b/grafana/dashboards/charging-stats.json @@ -1414,10 +1414,12 @@ "maxDataPoints": 1, "options": { "basemap": { - "config": {}, + "config": { + "url": "https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}" + }, "name": "Layer 0", "tooltip": true, - "type": "osm-standard" + "type": "xyz" }, "controls": { "mouseWheelZoom": true, @@ -1502,7 +1504,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "WITH charge_data AS (\r\nSELECT COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS loc_nm\r\n, AVG(position.latitude) AS latitude\r\n, AVG(position.longitude) AS longitude\r\n, sum(charge.charge_energy_added) AS chg_total\r\n, count(*) as charges\r\nFROM charging_processes charge\r\nLEFT JOIN addresses address ON charge.address_id = address.id\r\nLEFT JOIN positions position ON charge.position_id = position.id\r\nLEFT JOIN geofences geofence ON charge.geofence_id = geofence.id\r\nWHERE $__timeFilter(charge.start_date) \r\nAND charge.car_id = $car_id\r\nGROUP BY COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city))\r\n) \r\nSELECT loc_nm\r\n\t,latitude\r\n\t,longitude\r\n\t,chg_total\r\n\t,chg_total * 1.0 / (SELECT sum(chg_total) FROM charge_data) * 100 AS pct\r\n\t,charges\r\nFROM charge_data", + "rawSql": "WITH converted_positions AS (\n\tSELECT\n\t\tcharge.id AS charge_id,\n\t\tCOALESCE(\n\t\t\tgeofence.name,\n\t\t\tCONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)\n\t\t) AS loc_nm,\n\t\t(wgs84_to_gcj02(position.latitude, position.longitude)).gcjLat AS gcj_latitude,\n\t\t(wgs84_to_gcj02(position.latitude, position.longitude)).gcjLon AS gcj_longitude,\n\t\tcharge.charge_energy_added\n\tFROM\n\t\tcharging_processes charge\n\tLEFT JOIN addresses address ON charge.address_id = address.id\n\tLEFT JOIN positions position ON charge.position_id = position.id\n\tLEFT JOIN geofences geofence ON charge.geofence_id = geofence.id\n\tWHERE\n\t\t$__timeFilter(charge.start_date)\n\t\tAND charge.car_id = $car_id\n),\ncharge_data AS (\n\tSELECT\n\t\tloc_nm,\n\t\tAVG(gcj_latitude) AS latitude,\n\t\tAVG(gcj_longitude) AS longitude,\n\t\tSUM(charge_energy_added) AS chg_total,\n\t\tCOUNT(*) AS charges\n\tFROM\n\t\tconverted_positions\n\tGROUP BY\n\t\tloc_nm\n)\nSELECT\n\tloc_nm,\n\tlatitude,\n\tlongitude,\n\tchg_total,\n\tchg_total * 1.0 / (SELECT SUM(chg_total) FROM charge_data) * 100 AS pct,\n\tcharges\nFROM\n\tcharge_data;", "refId": "A", "select": [ [ diff --git a/grafana/dashboards/internal/charge-details.json b/grafana/dashboards/internal/charge-details.json index fbc6345196..343a50d661 100644 --- a/grafana/dashboards/internal/charge-details.json +++ b/grafana/dashboards/internal/charge-details.json @@ -887,9 +887,11 @@ "maxDataPoints": 500, "options": { "basemap": { - "config": {}, + "config": { + "url":"https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}" + }, "name": "Layer 0", - "type": "osm-standard" + "type": "xyz" }, "controls": { "mouseWheelZoom": true, @@ -974,7 +976,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT\n\t$__time(date),\n\tunnest(ARRAY[latitude, latitude]) AS latitude,\n\tunnest(ARRAY[longitude, longitude]) AS longitude\nFROM\n\tcharging_processes c\n\tJOIN positions p ON c.position_id = p.id\nWHERE\n\t$__timeFilter(date)\n\tAND c.car_id = $car_id;", + "rawSql": "SELECT\n\t$__time(date),\n\tunnest(ARRAY[(wgs84_to_gcj02(p.latitude, p.longitude)).gcjLat, (wgs84_to_gcj02(p.latitude, p.longitude)).gcjLat]) AS latitude,\n\tunnest(ARRAY[(wgs84_to_gcj02(p.latitude, p.longitude)).gcjLon, (wgs84_to_gcj02(p.latitude, p.longitude)).gcjLon]) AS longitude\nFROM\n\tcharging_processes c\n\tJOIN positions p ON c.position_id = p.id\nWHERE\n\t$__timeFilter(date)\n\tAND c.car_id = $car_id;", "refId": "A", "select": [ [ @@ -2138,4 +2140,4 @@ "uid": "BHhxFeZRz", "version": 1, "weekStart": "" -} \ No newline at end of file +} diff --git a/grafana/dashboards/internal/drive-details.json b/grafana/dashboards/internal/drive-details.json index 643f7a607d..caf3b0b1ef 100644 --- a/grafana/dashboards/internal/drive-details.json +++ b/grafana/dashboards/internal/drive-details.json @@ -605,9 +605,11 @@ "maxDataPoints": 50000, "options": { "basemap": { - "config": {}, + "config": { + "url":"https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}" + }, "name": "Layer 0", - "type": "osm-standard" + "type": "xyz" }, "controls": { "mouseWheelZoom": true, @@ -741,7 +743,7 @@ "hide": false, "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT\n $__time(date),\n latitude,\n longitude\nFROM positions\nWHERE \n car_id = $car_id AND \n $__timeFilter(date)\nORDER BY \n date ASC", + "rawSql": "SELECT\n\t$__time(date),\n\t(wgs84_to_gcj02(latitude, longitude)).gcjLat AS latitude,\n\t(wgs84_to_gcj02(latitude, longitude)).gcjLon AS longitude\nFROM\n\tpositions\nWHERE\n\tcar_id = $car_id AND \n\t$__timeFilter(date)\nORDER BY \n\tdate ASC;", "refId": "A", "select": [ [ diff --git a/grafana/dashboards/trip.json b/grafana/dashboards/trip.json index 11749a411a..7261191275 100644 --- a/grafana/dashboards/trip.json +++ b/grafana/dashboards/trip.json @@ -164,9 +164,10 @@ "maxDataPoints": 500, "options": { "basemap": { - "config": {}, + "config": { + "url":"https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"}, "name": "Layer 0", - "type": "osm-standard" + "type": "xyz" }, "controls": { "mouseWheelZoom": true, @@ -285,7 +286,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT\n\t$__timeGroup(date, '5s') AS time,\n\tavg(latitude) AS latitude,\n\tavg(longitude) AS longitude\nFROM\n\tpositions\nWHERE\n car_id = $car_id AND\n\t$__timeFilter(date)\nGROUP BY\n\t1\nORDER BY\n\t1 ASC", + "rawSql": "WITH converted_positions AS (\n\tSELECT\n\t\t$__timeGroup(date, '5s') AS time,\n\t\t(wgs84_to_gcj02(latitude, longitude)).gcjLat AS gcj_latitude,\n\t\t(wgs84_to_gcj02(latitude, longitude)).gcjLon AS gcj_longitude\n\tFROM\n\t\tpositions\n\tWHERE\n\t\tcar_id = $car_id AND\n\t\t$__timeFilter(date)\n)\nSELECT\n\ttime,\n\tavg(gcj_latitude) AS latitude,\n\tavg(gcj_longitude) AS longitude\nFROM\n\tconverted_positions\nGROUP BY\n\ttime\nORDER BY\n\ttime ASC;", "refId": "A", "select": [ [ @@ -3028,4 +3029,4 @@ "uid": "FkUpJpQZk", "version": 1, "weekStart": "" -} \ No newline at end of file +} diff --git a/grafana/dashboards/visited.json b/grafana/dashboards/visited.json index 6b5a9171ed..9c5ebcf903 100644 --- a/grafana/dashboards/visited.json +++ b/grafana/dashboards/visited.json @@ -129,9 +129,11 @@ "maxDataPoints": 10000000, "options": { "basemap": { - "config": {}, + "config": { + "url": "https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}" + }, "name": "Layer 0", - "type": "osm-standard" + "type": "xyz" }, "controls": { "mouseWheelZoom": true, @@ -254,7 +256,7 @@ "format": "table", "hide": false, "rawQuery": true, - "rawSql": "SELECT\n date_trunc('minute', TIMEZONE('UTC', date)) as time,\n avg(latitude) as latitude,\n avg(longitude) as longitude\nFROM\n positions\nWHERE\n car_id = $car_id AND $__timeFilter(date) and ideal_battery_range_km is not null\nGROUP BY 1\nORDER BY 1", + "rawSql": "WITH converted_positions AS (\n\tSELECT\n\t\tdate_trunc('minute', TIMEZONE('UTC', date)) as time,\n\t\t(wgs84_to_gcj02(latitude, longitude)).gcjLat AS latitude,\n\t\t(wgs84_to_gcj02(latitude, longitude)).gcjLon AS longitude\n\tFROM\n\t\tpositions\n\tWHERE\n\t\tcar_id = $car_id AND $__timeFilter(date) and ideal_battery_range_km is not null\n)\nSELECT\n\ttime,\n\tavg(latitude) as latitude,\n\tavg(longitude) as longitude\nFROM\n\tconverted_positions\nGROUP BY\n\ttime\nORDER BY\n\ttime;", "refId": "Positions", "sql": { "columns": [ @@ -732,4 +734,4 @@ "uid": "RG_DxSmgk", "version": 1, "weekStart": "" -} \ No newline at end of file +} diff --git a/grafana/proc.sql b/grafana/proc.sql new file mode 100644 index 0000000000..c3e8ad424a --- /dev/null +++ b/grafana/proc.sql @@ -0,0 +1,66 @@ +CREATE OR REPLACE FUNCTION transformLat(x DOUBLE PRECISION, y DOUBLE PRECISION) +RETURNS DOUBLE PRECISION AS ' +DECLARE + ret DOUBLE PRECISION; +BEGIN + ret := -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x)); + ret := ret + (20.0 * sin(6.0 * x * pi()) + 20.0 * sin(2.0 * x * pi())) * 2.0 / 3.0; + ret := ret + (20.0 * sin(y * pi()) + 40.0 * sin(y / 3.0 * pi())) * 2.0 / 3.0; + ret := ret + (160.0 * sin(y / 12.0 * pi()) + 320 * sin(y * pi() / 30.0)) * 2.0 / 3.0; + RETURN ret; +END; +' LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION transformLon(x DOUBLE PRECISION, y DOUBLE PRECISION) +RETURNS DOUBLE PRECISION AS ' +DECLARE + ret DOUBLE PRECISION; +BEGIN + ret := 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x)); + ret := ret + (20.0 * sin(6.0 * x * pi()) + 20.0 * sin(2.0 * x * pi())) * 2.0 / 3.0; + ret := ret + (20.0 * sin(x * pi()) + 40.0 * sin(x / 3.0 * pi())) * 2.0 / 3.0; + ret := ret + (150.0 * sin(x / 12.0 * pi()) + 300.0 * sin(x / 30.0 * pi())) * 2.0 / 3.0; + RETURN ret; +END; +' LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION delta(lat DOUBLE PRECISION, lon DOUBLE PRECISION) +RETURNS TABLE (dLat DOUBLE PRECISION, dLon DOUBLE PRECISION) AS ' +DECLARE + a CONSTANT DOUBLE PRECISION := 6378245.0; + ee CONSTANT DOUBLE PRECISION := 0.00669342162296594323; + radLat DOUBLE PRECISION; + magic DOUBLE PRECISION; + sqrtMagic DOUBLE PRECISION; +BEGIN + radLat := lat / 180.0 * pi(); + magic := sin(radLat); + magic := 1 - ee * magic * magic; + sqrtMagic := sqrt(magic); + + dLat := transformLat(lon - 105.0, lat - 35.0); + dLon := transformLon(lon - 105.0, lat - 35.0); + + dLat := (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi()); + dLon := (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi()); + + RETURN QUERY SELECT dLat, dLon; +END; +' LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION wgs84_to_gcj02(wgsLat DOUBLE PRECISION, wgsLon DOUBLE PRECISION) +RETURNS TABLE (gcjLat DOUBLE PRECISION, gcjLon DOUBLE PRECISION) AS ' +DECLARE + dLat DOUBLE PRECISION; + dLon DOUBLE PRECISION; +BEGIN + IF wgsLat < 0 OR wgsLat > 60.0 OR wgsLon < 72.004 OR wgsLon > 137.8347 THEN + RETURN QUERY SELECT wgsLat, wgsLon; + ELSE + SELECT delta.dLat, delta.dLon INTO dLat, dLon FROM delta(wgsLat, wgsLon); + SELECT wgsLat + dLat, wgsLon + dLon INTO gcjLat, gcjLon; + RETURN QUERY SELECT gcjLat, gcjLon; + END IF; +END; +' LANGUAGE plpgsql; + diff --git a/grafana/run_init_sql.sh b/grafana/run_init_sql.sh new file mode 100644 index 0000000000..93e9a80046 --- /dev/null +++ b/grafana/run_init_sql.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# 等待PostgreSQL服务启动 +until pg_isready -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER"; do + echo "Waiting for PostgreSQL to start..." + sleep 2 +done + +# 执行初始化SQL脚本 +PGPASSWORD=$DATABASE_PASS psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "teslamate" -f /proc.sql + +# 启动Grafana +/run.sh