Skip to content

Commit 87934ff

Browse files
committed
Use amap instead of OSM
1 parent 83f9de2 commit 87934ff

8 files changed

+112
-19
lines changed

grafana/Dockerfile

+7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ ENV GF_ANALYTICS_REPORTING_ENABLED=false \
1515
DATABASE_PORT=5432 \
1616
DATABASE_SSL_MODE=disable
1717

18+
USER root
19+
RUN apk update && apk add --no-cache postgresql-client
20+
1821
USER grafana
1922

2023
COPY logo.svg /usr/share/grafana/public/img/grafana_icon.svg
@@ -26,5 +29,9 @@ COPY dashboards.yml /etc/grafana/provisioning/dashboards/
2629
COPY dashboards/internal/*.json /dashboards_internal/
2730
COPY dashboards/reports/*.json /dashboards_reports/
2831
COPY dashboards/*.json /dashboards/
32+
COPY proc.sql /proc.sql
33+
COPY run_init_sql.sh /run_init_sql.sh
34+
35+
ENTRYPOINT ["bash", "/run_init_sql.sh"]
2936

3037
EXPOSE 3000

grafana/dashboards/charging-stats.json

+5-3
Original file line numberDiff line numberDiff line change
@@ -1396,10 +1396,12 @@
13961396
"maxDataPoints": 1,
13971397
"options": {
13981398
"basemap": {
1399-
"config": {},
1399+
"config": {
1400+
"url": "https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
1401+
},
14001402
"name": "Layer 0",
14011403
"tooltip": true,
1402-
"type": "osm-standard"
1404+
"type": "xyz"
14031405
},
14041406
"controls": {
14051407
"mouseWheelZoom": true,
@@ -1484,7 +1486,7 @@
14841486
"group": [],
14851487
"metricColumn": "none",
14861488
"rawQuery": true,
1487-
"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",
1489+
"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;",
14881490
"refId": "A",
14891491
"select": [
14901492
[

grafana/dashboards/internal/charge-details.json

+6-4
Original file line numberDiff line numberDiff line change
@@ -883,9 +883,11 @@
883883
"maxDataPoints": 500,
884884
"options": {
885885
"basemap": {
886-
"config": {},
886+
"config": {
887+
"url":"https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
888+
},
887889
"name": "Layer 0",
888-
"type": "osm-standard"
890+
"type": "xyz"
889891
},
890892
"controls": {
891893
"mouseWheelZoom": true,
@@ -970,7 +972,7 @@
970972
"group": [],
971973
"metricColumn": "none",
972974
"rawQuery": true,
973-
"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;",
975+
"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;",
974976
"refId": "A",
975977
"select": [
976978
[
@@ -2074,4 +2076,4 @@
20742076
"uid": "BHhxFeZRz",
20752077
"version": 3,
20762078
"weekStart": ""
2077-
}
2079+
}

grafana/dashboards/internal/drive-details.json

+6-4
Original file line numberDiff line numberDiff line change
@@ -604,9 +604,11 @@
604604
"maxDataPoints": 50000,
605605
"options": {
606606
"basemap": {
607-
"config": {},
607+
"config": {
608+
"url":"https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
609+
},
608610
"name": "Layer 0",
609-
"type": "osm-standard"
611+
"type": "xyz"
610612
},
611613
"controls": {
612614
"mouseWheelZoom": true,
@@ -697,7 +699,7 @@
697699
"hide": false,
698700
"metricColumn": "none",
699701
"rawQuery": true,
700-
"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",
702+
"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;",
701703
"refId": "A",
702704
"select": [
703705
[
@@ -2773,4 +2775,4 @@
27732775
"uid": "zm7wN6Zgz",
27742776
"version": 6,
27752777
"weekStart": ""
2776-
}
2778+
}

grafana/dashboards/trip.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,10 @@
164164
"maxDataPoints": 500,
165165
"options": {
166166
"basemap": {
167-
"config": {},
167+
"config": {
168+
"url":"https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"},
168169
"name": "Layer 0",
169-
"type": "osm-standard"
170+
"type": "xyz"
170171
},
171172
"controls": {
172173
"mouseWheelZoom": true,
@@ -242,7 +243,7 @@
242243
"group": [],
243244
"metricColumn": "none",
244245
"rawQuery": true,
245-
"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",
246+
"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;",
246247
"refId": "A",
247248
"select": [
248249
[
@@ -2878,4 +2879,4 @@
28782879
"uid": "FkUpJpQZk",
28792880
"version": 2,
28802881
"weekStart": ""
2881-
}
2882+
}

grafana/dashboards/visited.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@
130130
"options": {
131131
"basemap": {
132132
"config": {
133-
"server": "streets"
133+
"url": "https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
134134
},
135135
"name": "Layer 0",
136-
"type": "esri-xyz"
136+
"type": "xyz"
137137
},
138138
"controls": {
139139
"mouseWheelZoom": true,
@@ -213,7 +213,7 @@
213213
"format": "table",
214214
"hide": false,
215215
"rawQuery": true,
216-
"rawSql": "SELECT\n date_trunc('minute', 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",
216+
"rawSql": "WITH converted_positions AS (\n\tSELECT\n\t\tdate_trunc('minute', 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;",
217217
"refId": "Positions",
218218
"sql": {
219219
"columns": [
@@ -768,4 +768,4 @@
768768
"uid": "RG_DxSmgk",
769769
"version": 5,
770770
"weekStart": ""
771-
}
771+
}

grafana/proc.sql

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
CREATE OR REPLACE FUNCTION transformLat(x DOUBLE PRECISION, y DOUBLE PRECISION)
2+
RETURNS DOUBLE PRECISION AS '
3+
DECLARE
4+
ret DOUBLE PRECISION;
5+
BEGIN
6+
ret := -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));
7+
ret := ret + (20.0 * sin(6.0 * x * pi()) + 20.0 * sin(2.0 * x * pi())) * 2.0 / 3.0;
8+
ret := ret + (20.0 * sin(y * pi()) + 40.0 * sin(y / 3.0 * pi())) * 2.0 / 3.0;
9+
ret := ret + (160.0 * sin(y / 12.0 * pi()) + 320 * sin(y * pi() / 30.0)) * 2.0 / 3.0;
10+
RETURN ret;
11+
END;
12+
' LANGUAGE plpgsql;
13+
14+
CREATE OR REPLACE FUNCTION transformLon(x DOUBLE PRECISION, y DOUBLE PRECISION)
15+
RETURNS DOUBLE PRECISION AS '
16+
DECLARE
17+
ret DOUBLE PRECISION;
18+
BEGIN
19+
ret := 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
20+
ret := ret + (20.0 * sin(6.0 * x * pi()) + 20.0 * sin(2.0 * x * pi())) * 2.0 / 3.0;
21+
ret := ret + (20.0 * sin(x * pi()) + 40.0 * sin(x / 3.0 * pi())) * 2.0 / 3.0;
22+
ret := ret + (150.0 * sin(x / 12.0 * pi()) + 300.0 * sin(x / 30.0 * pi())) * 2.0 / 3.0;
23+
RETURN ret;
24+
END;
25+
' LANGUAGE plpgsql;
26+
27+
CREATE OR REPLACE FUNCTION delta(lat DOUBLE PRECISION, lon DOUBLE PRECISION)
28+
RETURNS TABLE (dLat DOUBLE PRECISION, dLon DOUBLE PRECISION) AS '
29+
DECLARE
30+
a CONSTANT DOUBLE PRECISION := 6378245.0;
31+
ee CONSTANT DOUBLE PRECISION := 0.00669342162296594323;
32+
radLat DOUBLE PRECISION;
33+
magic DOUBLE PRECISION;
34+
sqrtMagic DOUBLE PRECISION;
35+
BEGIN
36+
radLat := lat / 180.0 * pi();
37+
magic := sin(radLat);
38+
magic := 1 - ee * magic * magic;
39+
sqrtMagic := sqrt(magic);
40+
41+
dLat := transformLat(lon - 105.0, lat - 35.0);
42+
dLon := transformLon(lon - 105.0, lat - 35.0);
43+
44+
dLat := (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi());
45+
dLon := (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi());
46+
47+
RETURN QUERY SELECT dLat, dLon;
48+
END;
49+
' LANGUAGE plpgsql;
50+
51+
CREATE OR REPLACE FUNCTION wgs84_to_gcj02(wgsLat DOUBLE PRECISION, wgsLon DOUBLE PRECISION)
52+
RETURNS TABLE (gcjLat DOUBLE PRECISION, gcjLon DOUBLE PRECISION) AS '
53+
DECLARE
54+
dLat DOUBLE PRECISION;
55+
dLon DOUBLE PRECISION;
56+
BEGIN
57+
IF wgsLat < 0 OR wgsLat > 60.0 OR wgsLon < 72.004 OR wgsLon > 137.8347 THEN
58+
RETURN QUERY SELECT wgsLat, wgsLon;
59+
ELSE
60+
SELECT delta.dLat, delta.dLon INTO dLat, dLon FROM delta(wgsLat, wgsLon);
61+
SELECT wgsLat + dLat, wgsLon + dLon INTO gcjLat, gcjLon;
62+
RETURN QUERY SELECT gcjLat, gcjLon;
63+
END IF;
64+
END;
65+
' LANGUAGE plpgsql;
66+

grafana/run_init_sql.sh

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
# 等待PostgreSQL服务启动
4+
until pg_isready -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U "$DATABASE_USER"; do
5+
echo "Waiting for PostgreSQL to start..."
6+
sleep 2
7+
done
8+
9+
# 执行初始化SQL脚本
10+
PGPASSWORD=$DATABASE_PASS psql -h "$DATABASE_HOST" -U "$DATABASE_USER" -d "teslamate" -f /proc.sql
11+
12+
# 启动Grafana
13+
/run.sh

0 commit comments

Comments
 (0)