iT邦幫忙

1

PHP網頁設計 GOOGLE MAP API 標記多點 經緯度重複 如何使用最新的資料

1021241112 1 年前2076 瀏覽

各位大大 小弟在寫PHP的網頁 要做一個在MAP上顯示多點位置 且點下去有資訊視窗 因為地點有相同的 但都只抓到最早的資料

例如有兩筆資料 1.經緯度20,30 PM2.5=10 10:10 2.經緯度20,30 PM2.5=50 10:30 但每次系統都只顯示 第一筆 也就是最先被抓到的資訊 請各位大大幫幫忙 如何使地圖成呈現出都是最後最新的資訊

程式碼如下

http://203.64.167.212/ex0/map(test).php

1021241112 iT邦新手 5 級 ‧ 1 年前 檢舉
不好意思 無法直接點 要複製網址去上面網址列

1 個回答

1
planetoid
iT邦新手 3 級 ‧ 1 年前
最佳解答

因為樓主沒有提供資料庫結構,所以自己建了一個資料表。從原始碼看將日期跟時間分開兩個欄位,其實可以合併在一起。

CREATE TABLE air
(id INT AUTO_INCREMENT, latlng varchar(50), pm int, datestamp datetime, PRIMARY KEY (id) )
;
INSERT INTO air
(latlng, pm, datestamp)
values
('20,30',	10	,	'2016-05-22 00:00:00')	,
('20,30',	50	,	'2016-05-22 10:10:00')	,
('20,30',	40	,	'2016-05-22 10:30:00')	;
-- 原查詢語法: 舊紀錄在前
-- SELECT * FROM `air`;

-- 查詢語法2: 新紀錄在前
SELECT tmp.* FROM 
( SELECT * FROM `air` ORDER BY `datestamp`
) tmp GROUP BY `latlng` ;

可以直接看線上 demo: http://ideone.com/WHeIwg

看更多先前的回應...收起先前的回應...
1021241112 iT邦新手 5 級 ‧ 1 年前 檢舉

我試了大大的語法 發現有問題

因為我的感測器 GPS的經緯度 和日期時間都是分開的
就是經度GPS1 緯度GPS2 日期DATE 時間TIME的資料庫

這樣就無法用你的方式 是否還有可以不用合併就可以排序顯示的方法??

感謝你的回答

planetoid iT邦新手 3 級 ‧ 1 年前 檢舉
-- 建立資料表

CREATE TABLE `air` (
  `id` int(11) NOT NULL,
  `latitude` varchar(50) NOT NULL,
  `longitude` varchar(50) NOT NULL,
  `pm` int(11) DEFAULT NULL,
  `date` date NOT NULL,
  `time` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


--
-- 資料表索引 `air`
--
ALTER TABLE `air`
  ADD PRIMARY KEY (`id`);
	
--
-- 資料表資料 `air`
--

INSERT INTO `air` (`id`, `latitude`, `longitude`, `pm`, `date`, `time`) VALUES
(1, '20', '30', 10, '2016-05-22', '00:00:00'),
(2, '20', '30', 50, '2016-05-22', '10:10:00'),
(3, '20', '30', 40, '2016-05-22', '10:30:00'),
(4, '20', '30', 50, '2016-05-23', '10:10:00'),
(5, '20', '40', 60, '2016-05-23', '10:10:00');

-- 查詢不同經緯度最新 pm 資料
SELECT latest.latitude, latest.latitude, raw.pm, latest.date, latest.time
FROM
(
	SELECT  latitude, longitude, CONCAT(`latitude`, ',', `longitude`)  AS latlng, MAX(CONCAT(`date`, ' ', `time`)) AS date_time,
		TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', 1)) AS 'date',
		TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', -1)) AS 'time'
	FROM `air` 
	GROUP BY CONCAT(`latitude`, ',', `longitude`)

) AS latest
INNER JOIN 
(
	SELECT *, CONCAT(`latitude`, ',', `longitude`)  AS latlng, CONCAT(`date`, ' ', `time`) AS date_time
	FROM `air` 
) AS raw
ON raw.latlng = latest.latlng
AND raw.date_time = latest.date_time;


1021241112 iT邦新手 5 級 ‧ 1 年前 檢舉

http://203.64.167.212/ex0/data1.png
http://203.64.167.212/ex0/data2.png
不好意思 我貼了你下面那些語法 改成我的結構 還是無法欸 而且連舊的也無法出現了
上面的圖片 分別是我的 資料和結構

謝謝你的解答

planetoid iT邦新手 3 級 ‧ 1 年前 檢舉
SELECT latest.`gps-1`, latest.`gps-2`, raw.pm2_5, latest.date, latest.time
FROM
(
	SELECT  `gps-1`, `gps-2`, CONCAT(`gps-1`, ',', `gps-2`)  AS latlng, MAX(CONCAT(`date`, ' ', `time`)) AS date_time,
		TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', 1)) AS 'date',
		TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', -1)) AS 'time'
	FROM `air` 
	GROUP BY CONCAT(`gps-1`, ',', `gps-2`)

) AS latest
INNER JOIN 
(
	SELECT *, CONCAT(`gps-1`, ',', `gps-2`)  AS latlng, CONCAT(`date`, ' ', `time`) AS date_time
	FROM `air` 
) AS raw
ON raw.latlng = latest.latlng
AND raw.date_time = latest.date_time;

1021241112 iT邦新手 5 級 ‧ 1 年前 檢舉

太感謝你了~大大 成功了 感恩感恩~超厲害的

我要發表回答

立即登入回答