一、实验目的
1. 盘算出租车出行OD表
2. 绘制城市热门区域
二、实验步骤
2.1 提取出租车的出行行程
1. 提取出租车轨迹
先将实验2处置惩罚好的出租车数据,按照出租车ID从小到大举行分组,再按照日期DATE、时间TIME举行升序排序,就可以得到某辆出租车的轨迹了。具体实现步骤:
(1)首先创建一个数据表test3_trace,与traffic_data结构一样,用于存储出租车轨迹,SQL代码:
- use traffic_data;
- CREATE TABLE `test3_trace` (
- `GPS_ID` int AUTO_INCREMENT,
- `DATE` date ,
- `TIME` time ,
- `ID` varchar(15) ,
- `LONGTITUDE` DECIMAL(9, 6) ,
- `LATITUDE` DECIMAL(8, 6) ,
- `SPEED` float,
- `ALTITUDE` int ,
- `PASSENGER` bit(1),
- PRIMARY KEY (`GPS_ID`)
- );
复制代码 (2)其次从整个数据表中获取全部出租车的ID,并从小到大排列,存储在ids列表中。然后用for循环遍历ids列表,对于每一个出租车ID再遍历整个数据表,找到该ID对应的全部数据记录,并按日期DATE、时间TIME从小到大举行排列。最后将这些数据记录依次插入到test3_trace表中,由于在该表中GPS_ID是从1开始自增的序列,不需要插入数据,当每插入一条数据记录,其就会自增,这里用executemany() 批量插入,加快速率。因此在数据表test3_trace中就提取出了出租车轨迹,即全部GPS记录依次按照车牌号ID、日期DATE和时间TIME从小到大举行排序。Python代码:
- import pymysql
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': '数据库用户名',
- 'password': '密码',
- 'db': 'traffic_data',
- 'charset': 'utf8',
- 'cursorclass': pymysql.cursors.DictCursor
- }
- # 连接数据库
- try:
- db = pymysql.connect(**db_config)
- cursor = db.cursor()
- # 获取所有唯一的 ID 列表
- cursor.execute("SELECT DISTINCT `ID` FROM `traffic_data` ORDER BY `ID`")
- ids = [row['ID'] for row in cursor.fetchall()]
- # 遍历每个 ID
- for current_id in ids:
- # 获取当前 ID 的所有记录,并按 DATE 和 TIME 排序
- cursor.execute("""
- SELECT `DATE`, `TIME`, `ID`, `LONGTITUDE`, `LATITUDE`, `SPEED`, `ALTITUDE`, `PASSENGER`
- FROM `traffic_data`
- WHERE `ID` = %s
- ORDER BY `DATE`, `TIME`
- """, (current_id,))
- # 获取排序后的数据
- sorted_records = cursor.fetchall()
- # 构建用于 executemany() 的参数列表
- # 不包括 GPS_ID,因为这是自增的,可以表示整个排序
- insert_values = [(row['DATE'], row['TIME'], row['ID'], row['LONGTITUDE'], row['LATITUDE'], row['SPEED'],
- row['ALTITUDE'], row['PASSENGER']) for row in sorted_records]
- # 构建插入语句
- insert_query = "INSERT INTO test3_trace (DATE, TIME, ID, LONGTITUDE, LATITUDE, SPEED, ALTITUDE, PASSENGER)" \
- " VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
- # 使用 executemany() 执行批量插入
- cursor.executemany(insert_query, insert_values)
- db.commit() # 提交事务
- print(current_id + "出租车的数据已经复制完成")
- print("所有数据已成功复制。")
- except Exception as e:
- print("更新失败:", e)
- db.rollback()
- finally:
- cursor.close()
- db.close()
复制代码 执行步伐效果:

test3_trace表效果部分数据展示:

2. 提取出租车的乘客行程
出租车出现需求通常指出出租车乘客出行需求。在出租车数据记录中,字段PASSENGER记录了该出租车的载客状态,当载客状态字段PASSENGER为0时,表示没有乘客;当载客状态字段PASSENGER为1时,表示有乘客。因此根据该字段信息状态的变更,来提取乘客的上下车点。
将上面提取出来的出租车轨迹数据,检测每一辆出租车载客状态字段PASSENGER的厘革,当其由0变为1,表示乘客上车点,再由1变为0时,表示乘客下车点,将如许一组厘革界说为该辆出租车的一条出行行程数据。将其输出格式为<出租车车牌号,上车位置经度,上车位置纬度,上车时间,下车位置经度,下车位置纬度,下车时间>的数据记录。具体步骤:
(1)先在test3_trace表新建一列DATE_TIME,用于将表中的日期DATE和时间TIME归并成一列DATE_TIME,python代码:
- # 合并日期和时间
- import pymysql
- from pymysql import cursors
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '123456',
- 'db': 'traffic_data',
- 'charset': 'utf8',
- 'cursorclass': pymysql.cursors.DictCursor
- }
- # 分批处理的批大小
- batch_size = 1000 # 你可以根据实际情况调整这个值
- # 连接到数据库
- try:
- db = pymysql.connect(**db_config)
- cursor = db.cursor()
- # 添加 DATE_TIME 列
- cursor.execute("ALTER TABLE `test3_trace` ADD COLUMN `DATE_TIME` DATETIME NULL DEFAULT NULL;")
- # 获取表中的所有记录的ID
- cursor.execute("SELECT GPS_ID FROM test3_trace")
- ids = cursor.fetchall()
- # 分批更新数据
- for i in range(0, len(ids), batch_size):
- batch_ids = ids[i:i + batch_size]
- # 构建SQL语句
- update_query = """
- UPDATE test3_trace
- SET DATE_TIME = CONCAT(DATE, ' ', TIME)
- WHERE GPS_ID IN ({})
- """.format(', '.join(['%s'] * len(batch_ids)))
- # 准备参数
- params = tuple(id['GPS_ID'] for id in batch_ids)
- # 执行更新操作
- cursor.execute(update_query, params)
- db.commit() # 提交事务
- print("所有数据已成功更新。")
- except Exception as e:
- print("数据更新失败:", e)
- db.rollback()
- finally:
- cursor.close()
- db.close()
复制代码 运行效果,部分数据展示:

(2)创建表test3_travel_running,用于存储出租车的乘客行程数据,SQL代码:
- use traffic_data;
- CREATE TABLE `test3_travel_running` (
- `travel_ID` int AUTO_INCREMENT,
- `ID` varchar(15) , #出租车ID
- `LONGTITUDE1` DECIMAL(9, 6) , #上车位置
- `LATITUDE1` DECIMAL(8, 6) ,
- `DATE_TIME1` datetime ,
- `LONGTITUDE0` DECIMAL(9, 6) , #下车位置
- `LATITUDE0` DECIMAL(8, 6) ,
- `DATE_TIME0` datetime ,
- PRIMARY KEY (`travel_ID`)
- );
复制代码 表test3_travel_running展示:

(3)然后将提取出来的乘客行程轨迹,插入到数据表test3_travel_running中:
- import pymysql
- from pymysql import cursors
- from decimal import Decimal
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '123456',
- 'db': 'traffic_data',
- 'charset': 'utf8mb4',
- 'cursorclass': cursors.SSDictCursor # 使用服务器端游标
- }
- # 定义插入查询
- insert_query = """
- INSERT INTO test3_travel_running (ID, LONGTITUDE1, LATITUDE1, DATE_TIME1, LONGTITUDE0, LATITUDE0, DATE_TIME0)
- VALUES (%s, %s, %s, %s, %s, %s, %s)
- """
- try:
- # 连接到数据库
- db = pymysql.connect(**db_config)
- cursor = db.cursor()
- # 初始化变量
- batch_size = 1000 # 设置每批处理的记录数
- insert_data = []
- previous_record = None
- start_trip = None # 存储上车记录
- current_id = None # 当前记录的ID
- # 从test3_trace表中按顺序获取数据
- cursor.execute(
- "SELECT `ID`, `LONGTITUDE`, `LATITUDE`, `DATE_TIME`, `PASSENGER` "
- "FROM `test3_trace` "
- "ORDER BY `ID`, `GPS_ID`"
- )
- # 分批处理数据
- more_results = True
- while more_results:
- records = cursor.fetchmany(batch_size) # 获取一批数据
- if not records:
- more_results = cursor.nextset() # 检查是否还有其他结果集
- if more_results:
- continue
- break # 如果没有更多的数据,结束循环
- for record in records:
- record_id = record['ID']
- passenger_status = record['PASSENGER']
- is_passenger_on = passenger_status == b'\x01'
- # 上车逻辑
- if is_passenger_on and (previous_record is None or previous_record['PASSENGER'] == b'\x00'):
- start_trip = record # 记录上车信息
- current_id = record_id # 更新当前ID
- # 下车逻辑
- if start_trip and (start_trip['ID'] == record_id):
- if not is_passenger_on:
- # 如果当前记录与上车记录ID相同,且乘客下车
- insert_data.append((
- record_id,
- start_trip['LONGTITUDE'],
- start_trip['LATITUDE'],
- start_trip['DATE_TIME'],
- record['LONGTITUDE'],
- record['LATITUDE'],
- record['DATE_TIME']
- ))
- start_trip = None # 重置上车记录
- current_id = None # 重置当前ID
- elif start_trip and (start_trip['ID'] != record_id):
- # 如果当前记录与上车记录ID不同,将上一条记录视为下车记录
- insert_data.append((
- previous_record['ID'],
- start_trip['LONGTITUDE'],
- start_trip['LATITUDE'],
- start_trip['DATE_TIME'],
- previous_record['LONGTITUDE'],
- previous_record['LATITUDE'],
- previous_record['DATE_TIME']
- ))
- start_trip = None # 更新上车记录为当前记录
- current_id = None # 重置当前ID
- previous_record = record # 更新previous_record为当前记录
- # 执行批量插入,如果insert_data列表满了
- if len(insert_data) >= batch_size:
- cursor.executemany(insert_query, insert_data)
- db.commit()
- print(f"Batch inserted {len(insert_data)} records.")
- insert_data = [] # 清空列表为下一批数据做准备
- # 最后一批插入,如果insert_data非空
- if insert_data:
- cursor.executemany(insert_query, insert_data)
- db.commit()
- print(f"Inserted remaining {len(insert_data)} records.")
- print("Data processing complete.")
- except Exception as e:
- print("Error occurred, rolling back transaction:", e)
- db.rollback()
- finally:
- cursor.close()
- db.close()
复制代码 运行效果部分展示:

共提取出220594条乘客行程轨迹
2.2 城市交通小区划分
利用网格划分的划分交通小区。首先获得全部出租车轨迹的最大经纬度与最小经纬度坐标,(latmax, lngmax)与(latmin, lngmin)
- SELECT
- MAX(LONGTITUDE1) AS max_start_lng,MAX(LONGTITUDE0) AS max_end_lng,
- MIN(LONGTITUDE1) AS min_start_lng,MIN(LONGTITUDE0) AS min_end_lng,
- MAX(LATITUDE1) AS max_start_lat,MAX(LATITUDE0) AS max_end_lat,
- MIN(LATITUDE1) AS min_start_lat,MIN(LATITUDE0) AS min_end_lat
- FROM test3_travel_running;
复制代码 效果:
从效果来看出租车(latmax, lngmax)=(34.067192,118.86900),(latmin, lngmin)=(0.970307,0.132128),经度的跨度为117.899493,纬度的跨度为33.935064,明显可知经度的跨度大于纬度的跨度。因此将经度划分为10份,纬度划分成3份,将全部出租车所到达的面积划分为30份,即小区编号可以界说从01L01到03L10,前两位数字表示网格的纬度坐标,后两位数字表示网格的经度坐标。
2.3 出租车行程分配到对应交通小区
设出租车上车点为(lat1,lng1)与下车点(lat0,lng0),假设通过盘算得到上车点对应的交通小区为01L02、下车点对应的交通小区为03L05,那么将该行程分配给交通小区对[01L02,03L05]。
2.4 并盘算出行OD表
利用pandas对OD表数据举行存储,表的横纵坐标名分别为小区的编号。对表A举行初始化,表中的全部数据都为0,读取一条行程数据,并找到其所对应的交通小区对,在表中对应交通小区对的数值上加1,对全部行程执行该操作。Python代码:
- import pandas as pd
- import pymysql
- import pymysql.cursors
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '123456',
- 'db': 'traffic_data',
- 'charset': 'utf8mb4',
- 'cursorclass': pymysql.cursors.DictCursor
- }
- # 连接数据库
- connection = pymysql.connect(**db_config)
- # 划分网格
- lng_min = 0.132128 # 经度
- lng_max = 118.86900
- lat_min = 0.970307
- lat_max = 34.067192
- lng_interval = (lng_max - lng_min) / 10
- lat_interval = (lat_max - lat_min) / 3
- grid_bounds = {}
- for lat_idx in range(1, 4):
- for lng_idx in range(1, 11):
- grid_id = f"{lat_idx:02d}L{lng_idx:02d}"
- grid_bounds[grid_id] = {
- 'min_lng': lng_min + (lng_idx - 1) * lng_interval,
- 'max_lng': lng_min + lng_idx * lng_interval,
- 'min_lat': lat_min + (lat_idx - 1) * lat_interval,
- 'max_lat': lat_min + lat_idx * lat_interval
- }
- print(f"交通小区编号: {grid_id}, 边界: ({grid_bounds[grid_id]['min_lng']}, {grid_bounds[grid_id]['min_lat']}) to ({grid_bounds[grid_id]['max_lng']}, {grid_bounds[grid_id]['max_lat']})")
- # 获取行程数据
- query = "SELECT LONGTITUDE1, LATITUDE1, LONGTITUDE0, LATITUDE0 FROM test3_travel_running"
- cursor = connection.cursor()
- cursor.execute(query)
- trips = cursor.fetchall()
- # 初始化OD矩阵
- od_matrix = pd.DataFrame(0, index=grid_bounds.keys(), columns=grid_bounds.keys())
- # 分配行程到网格
- def get_traffic_zone(lng, lat):
- for zone, bounds in grid_bounds.items():
- if bounds['min_lng'] <= lng <= bounds['max_lng'] and bounds['min_lat'] <= lat <= bounds['max_lat']:
- return zone
- return None
- for trip in trips:
- pickup_zone = get_traffic_zone(trip['LONGTITUDE1'], trip['LATITUDE1'])
- dropoff_zone = get_traffic_zone(trip['LONGTITUDE0'], trip['LATITUDE0'])
- if pickup_zone and dropoff_zone:
- od_matrix.at[pickup_zone, dropoff_zone] += 1
- # 保存到Excel
- with pd.ExcelWriter('traffic_zones_and_od_matrix.xlsx') as writer:
- od_matrix.to_excel(writer, sheet_name='OD_Matrix')
- pd.DataFrame(grid_bounds).T.to_excel(writer, sheet_name='Grid_Bounds')
- cursor.close()
- connection.close()
复制代码 运行效果:

划分的效果并不抱负,有出租车行程数据的为[01L01,01L01],[02L10,02L10],[03L09,03L09],[03L10,03L09],[03L10,03L10],查看其经纬度范围:

出租车行程数据主要会合在的经度范围为[106.9953,95.12163],纬度范围为[34.06719,23.0349],在将这个经纬度范围举行细划分网格,代码:
- import pymysql
- import pandas as pd
- import pymysql.cursors
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '123456',
- 'db': 'traffic_data',
- 'charset': 'utf8mb4',
- 'cursorclass': pymysql.cursors.DictCursor
- }
- # 连接数据库
- connection = pymysql.connect(**db_config)
- # 获取行程数据
- query = "SELECT LONGTITUDE1, LATITUDE1, LONGTITUDE0, LATITUDE0 FROM test3_travel_running"
- cursor = connection.cursor()
- cursor.execute(query)
- trips = cursor.fetchall()
- # 原始网格边界03L09
- grid_bounds = {
- '03L09': {'min_lng': 95.1216256, 'max_lng': 106.99531280000001, 'min_lat': 23.034897, 'max_lat': 34.067192}
- }
- # 细分特定网格
- def subdivide_grid(grid_id, bounds, subdivisions=6):
- """细分特定网格"""
- lat_range = bounds['max_lat'] - bounds['min_lat']
- lng_range = bounds['max_lng'] - bounds['min_lng']
- lat_step = lat_range / subdivisions
- lng_step = lng_range / subdivisions
- new_bounds = {}
- for i in range(subdivisions):
- print(i)
- for j in range(subdivisions):
- new_id = f"{grid_id}_{i + 1:02d}{j + 1:02d}"
- new_bounds[new_id] = {
- 'min_lat': bounds['min_lat'] + i * lat_step,
- 'max_lat': bounds['min_lat'] + (i + 1) * lat_step,
- 'min_lng': bounds['min_lng'] + j * lng_step,
- 'max_lng': bounds['min_lng'] + (j + 1) * lng_step
- }
- return new_bounds
- # 更新网格边界信息
- new_grids = subdivide_grid('03L09', grid_bounds['03L09'])
- grid_bounds.update(new_grids)
- # 重新计算行程对应的网格
- def get_traffic_zone(lng, lat, grid_bounds):
- """计算给定经纬度对应的网格"""
- for grid_id, bounds in grid_bounds.items():
- if bounds['min_lng'] <= lng <= bounds['max_lng'] and bounds['min_lat'] <= lat <= bounds['max_lat']:
- return grid_id
- return None
- # 初始化新的OD矩阵
- od_matrix = pd.DataFrame(0, index=new_grids.keys(), columns=new_grids.keys())
- print("OD")
- # 分配行程到网格
- for trip in trips:
- pickup_zone = get_traffic_zone(trip['LONGTITUDE1'], trip['LATITUDE1'], new_grids)
- dropoff_zone = get_traffic_zone(trip['LONGTITUDE0'], trip['LATITUDE0'], new_grids)
- if pickup_zone and dropoff_zone:
- od_matrix.at[pickup_zone, dropoff_zone] += 1
- # 保存到Excel
- with pd.ExcelWriter('subdivided_traffic_zones_and_od_matrix.xlsx') as writer:
- od_matrix.to_excel(writer, sheet_name='Subdivided_OD_Matrix')
- pd.DataFrame(new_grids).T.to_excel(writer, sheet_name='Subdivided_Grid_Bounds')
- cursor.close()
- connection.close()
复制代码 这里出来的效果也不抱负,于是我又尝试一次,每次缩小范围,运行效果:

从上面的效果来看,可以将整个行程数据划分到几个交通小区中。
2.5 绘制聚类图和热力图
本实验使用K-Means聚类方法提取出租车的出行热门区域,即对出租车行程的出发点和终点举行聚类分析,并通过百度舆图大概python中的舆图可视化工具对热门区域举行可视化展示。将上面的路径的出发点、终点转换成百度坐标系,并输出到point.js文件中,代码:
- import pymysql
- import json
- import urllib.request
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '123456',
- 'db': 'traffic_data',
- 'charset': 'utf8',
- 'cursorclass': pymysql.cursors.DictCursor
- }
- # 百度API密钥
- baidu_ak = 'XNeLiUBdjxiq7miI5pB7nzZqLvqdSFAy'
- # 定义坐标转换函数
- def convert_to_baidu(lat, lng):
- url = f"http://api.map.baidu.com/geoconv/v1/?coords={lng},{lat}&from=1&to=5&ak={baidu_ak}"
- try:
- response = urllib.request.urlopen(url)
- data = json.loads(response.read())
- if data['status'] == 0:
- return data['result'][0]['x'], data['result'][0]['y']
- else:
- print(f"坐标转换失败: {lat}, {lng}")
- return None, None
- except Exception as e:
- print(f"坐标转换异常: {e}")
- return None, None
- # 连接数据库
- db = pymysql.connect(**db_config)
- cursor = db.cursor()
- # 查询坐标点
- cursor.execute("SELECT LONGTITUDE1, LATITUDE1 FROM test3_travel_running")
- results = cursor.fetchall()
- # 准备热力图数据
- points = []
- for coord in results:
- converted_lng, converted_lat = convert_to_baidu(coord['LATITUDE1'], coord['LONGTITUDE1'])
- if converted_lng is not None and converted_lat is not None:
- points.append({"lng": converted_lng, "lat": converted_lat, "count": 1})
- print(converted_lng)
- else:
- print(f"Skipping coordinate conversion failed: {coord}")
- # 将坐标点写入 JavaScript 文件
- with open('points.js', 'w', encoding='utf-8') as js_file:
- js_content = "var points = " + json.dumps(points, ensure_ascii=False) + ";"
- js_file.write(js_content)
- # 关闭数据库连接
- cursor.close()
- db.close()
复制代码 将出租车出行路径的出发点、终点提取出来,然后使用K-Means聚类方法提取出租车的出行热门区域,代码:
- import numpy as np
- import pandas as pd
- import folium
- from folium.plugins import HeatMap
- import pymysql
- from pymysql import cursors
- from sklearn.cluster import KMeans
- # 数据库连接配置
- db_config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '123456',
- 'db': 'traffic_data',
- 'charset': 'utf8mb4',
- 'cursorclass': cursors.SSDictCursor # 使用服务器端游标
- }
- db = pymysql.connect(**db_config)
- cursor = db.cursor()
- cursor.execute("SELECT LONGTITUDE1, LATITUDE1, LONGTITUDE0, LATITUDE0 FROM test3_travel_running")
- results = cursor.fetchall()
- df = pd.DataFrame(results, columns=['LONGTITUDE1', 'LATITUDE1', 'LONGTITUDE0', 'LATITUDE0'])
- # 提取起点和终点坐标,并合并到一个数组中
- pickup_coords = df[['LONGTITUDE1', 'LATITUDE1']].values
- dropoff_coords = df[['LONGTITUDE0', 'LATITUDE0']].values
- X = np.concatenate((pickup_coords, dropoff_coords), axis=0)
- # 使用K-Means聚类
- '''
- kmeans = KMeans(n_clusters=10, n_init=10, random_state=0) # 显式设置n_init的值
- kmeans.fit(X)
- labels = kmeans.labels_
- # 可视化聚类结果
- plt.figure(figsize=(10, 8))
- sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=labels, palette='viridis', s=50, edgecolor='none')
- plt.title('K-Means Clustering of Taxi Trips with 10 Clusters')
- plt.xlabel('Longitude')
- plt.ylabel('Latitude')
- plt.legend(title='Cluster', loc='upper left')
- plt.grid(False)
- plt.show()
- '''
- cursor.close()
- db.close()
复制代码 运行代码,得到聚类效果:
聚类的效果通过散点图可视化,不同的聚类用不同的颜色表示,以便直观地查看哪些区域的出租车活动较为麋集。从聚类效果来看,出租车行程麋集在经度范围为(103,116)之间,纬度范围在(25,32)之间。
利用上面得到的出租车百度舆图的轨迹点,绘制出租车出行轨迹热力图,HTML代码:
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
- <style type="text/css">
- body, html {width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}
- #allmap{width:700px;height:100%;}
- p{margin-left:5px; font-size:14px;}
- </style>
- <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=XNeLiUBdjxiq7miI5pB7nzZqLvqdSFAy"></script>
- <script type="text/javascript" src="point.js"></script>
- <title>个性化地图设置页</title>
- </head>
- <body>
- <div id="allmap"></div>
- <div style="width:70px;height:280px;border:#ccc solid 0px;position:absolute; top:420px; left:630px" >
- <img src="tu.png" width="64" height="276" />
- </div>
- </body>
- </html>
- <script type="text/javascript">
- var map = new BMap.Map('allmap');
- map.centerAndZoom(new BMap.Point(106.568056104,28.5432091717), 12);
- map.addControl(new BMap.NavigationControl()); // 添加平移缩放控件
- map.addControl(new BMap.ScaleControl()); // 添加比例尺控件
- map.addControl(new BMap.OverviewMapControl()); //添加缩略地图控件
- map.enableScrollWheelZoom(); //启用滚轮放大缩小
- map.disable3DBuilding();
- //个性化在线编辑器地址:http://lbsyun.baidu.com/custom/
- var styleJson = [
- {
- "featureType": "land",
- "elementType": "all",
- "stylers": {
- "lightness": 100,
- "saturation": -100}
- },
- {
- "featureType": "water",
- "elementType": "all",
- "stylers": {
- "lightness": 47}
- },
- {
- "featureType": "manmade",
- "elementType": "geometry",
- "stylers": {
- "lightness": 28}
- },
- {
- "featureType": "road",
- "elementType": "geometry.fill",
- "stylers": {
- "lightness": 82}
- },
- {
- "featureType": "road",
- "elementType": "geometry.stroke",
- "stylers": {
- "lightness": -76}
- },
- {
- "featureType": "green",
- "elementType": "all",
- "stylers": {
- "lightness": 63,
- "saturation": -100}
- },
- {
- "featureType": "boundary",
- "elementType": "geometry.fill",
- "stylers": {
- "lightness": 80,
- "saturation": 1}
- },
- {
- "featureType": "boundary",
- "elementType": "geometry.stroke",
- "stylers": {
- "lightness": -75,
- "saturation": -100}
- }
- ]
- map.setMapStyle({styleJson:styleJson});
- //添加覆盖物
- function add_overlay(){
- for( var i=0;i<data_set1.length;i++){
- var d_temp=data_set1[i].point;
- var point_set=new Array();
- for (var j=0;j<d_temp.length;j++){
- point_set[j]=new BMap.Point(d_temp[j].split(",")[0],d_temp[j].split(",")[1]);
- }
- var rectangle = new BMap.Polygon(point_set, {strokeColor:"none", fillColor:"green", strokeWeight:1,fillOpacity:0.7, strokeOpacity:0.3}); //创建矩形
- map.addOverlay(rectangle);
- //增加矩形
- }
- for( var i=0;i<data_set2.length;i++){
- var d_temp=data_set2[i].point;
- var point_set=new Array();
- for (var j=0;j<d_temp.length;j++){
- point_set[j]=new BMap.Point(d_temp[j].split(",")[0],d_temp[j].split(",")[1]);
- }
- var rectangle = new BMap.Polygon(point_set, {strokeColor:"none", fillColor:"orange", strokeWeight:1,fillOpacity:0.7, strokeOpacity:0.3}); //创建矩形
- map.addOverlay(rectangle);
- //增加矩形
- }
- for( var i=0;i<data_set3.length;i++){
- var d_temp=data_set3[i].point;
- var point_set=new Array();
- for (var j=0;j<d_temp.length;j++){
- point_set[j]=new BMap.Point(d_temp[j].split(",")[0],d_temp[j].split(",")[1]);
- }
- var rectangle = new BMap.Polygon(point_set, {strokeColor:"none", fillColor:"red", strokeWeight:1,fillOpacity:0.7, strokeOpacity:0.3}); //创建矩形
- map.addOverlay(rectangle);
- //增加矩形
- }
- }
- add_overlay()
- </script>
复制代码 运行,得到热力图:

从上面的热力图可以看出,哪些地方的交通流量比较大,哪些相对比较少,有利于相关部门对交通举行监管。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |