分享个2个月前的小作业,部分代码暂无法公开,但我想我说的已经很明白了 AIS数据 NOAA Office for Coastal Management 提供了2009-2021年美国海岸周边的AIS数据,截止目前更新到21年3月份。 网址:https://coast.noaa.gov/htdata/CMSP/AISDataHandler/2020/
网站详情如下:
以20年数据为例,是按天提供的压缩包,解压后是.csv格式文件。 数据格式如下: 解析入库,这里我只是考虑获取尽可能多的不重复的船舶数据,没有考虑时间线的问题。
数据库sql脚本:
DROP TABLE IF EXISTS `ais`;
CREATE TABLE `ais` (
`MMSI` varchar(255) NOT NULL,
`BaseDateTime` varchar(255) DEFAULT NULL,
`LAT` double DEFAULT NULL,
`LON` double DEFAULT NULL,
`SOG` double DEFAULT NULL,
`COG` double DEFAULT NULL,
`Heading` double DEFAULT NULL,
`VesselName` varchar(255) DEFAULT NULL,
`IMO` varchar(255) DEFAULT NULL,
`CallSign` varchar(255) DEFAULT NULL,
`VesselType` varchar(255) DEFAULT NULL,
`Status` varchar(255) DEFAULT NULL,
`Length` varchar(255) DEFAULT NULL,
`Width` varchar(255) DEFAULT NULL,
`Draft` varchar(255) DEFAULT NULL,
`Cargo` varchar(255) DEFAULT NULL,
PRIMARY KEY (`MMSI`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
处理csv文件的python脚本
import pandas as pd
import pymysql
import time
class Ais:
def __init__(self):
self.conn = pymysql.connect(user="",password="",host="",database="",port=3306)
self.cursor=self.conn.cursor()
def aisSelect(self,MMSI):
sql = "select * from ais where MMSI = %s"
res_num = self.cursor.execute(sql,MMSI)
self.conn.commit()
return res_num
def aisInsert(self,message):
sql = "insert into ais values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
res_num = self.cursor.execute(sql,(message.MMSI,message.BaseDateTime,message.LAT,message.LON,message.SOG,message.COG,message.Heading,
message.VesselName,message.IMO,message.CallSign,message.VesselType,message.Status,message.Length,message.Width,
message.Draft,message.Cargo))
self.conn.commit()
return res_num
def close(self):
self.cursor.close()
self.conn.close()
if __name__ == '__main__':
start_time = time.strftime("%Y-%m-%d %H:%M:%S")
print(start_time)
ais = Ais()
ais_cav_filePath = "G:/AIS_2020_01_01.csv"
ais_csv = pd.read_csv(ais_cav_filePath)
ais_num = 0
for i in range(len(ais_csv)):
s = ais_csv.loc[i].copy()
s[pd.isna(s)] = "-"
mmsi = s.MMSI
insert_flag = ais.aisSelect(mmsi)
if insert_flag == 0:
ais.aisInsert(s)
ais_num+=1
ais.close()
end_time = time.strftime("%Y-%m-%d %H:%M:%S")
print(ais_num)
print(end_time)
Web 服务:主要基于 Sringboot+Mybatis+Redis+Mapbox 等组成。 显示效果: 一共显示了12000条船舶,随着地图缩放等级船舶由亮点转变为类似箭头的图标,箭头指向依据船舶的COG设置。
|