• AIS数据下载并处理(python)


    最近由于项目需求,需要下载AIS数据,其实也就是船舶位置数据。

    首先通过百度发现目前一些网站下载的AIS数据都是收费的,如船达通等等。

    船达通是只能查找近一个月的船舶轨迹信息,下载需要支付收费。

    但是最后我终于找到了一个免费下载AIS数据的网站,并且下面附上了处理说明,可以通过python代码批量处理

    通过以下的文档可以详细了解如何下载数据,将AIS数据中的时间、经度、纬度、航速提取出来。

    最后通过ArcMap处理成为shp,方便可视化。

    我是从中国海洋卫星数据网站下载的。

    网站地址:https://osdds.nsoas.org.cn/#/

    需要注册后使用。

    有关网站注册和注册登录不上的问题,可以去邮件网络官方,我当时用没问题,不了解。

    另外不方便借账号。

    一、数据说明文档

    首先从首页的下载AIS 0-1级产品数据格式说明V1.0.pdf

    打开后可以看到,HY-C/D的L1A产品是可以直接使用的,因此从网站上下载该产品

    二、数据下载

    点击网站首页的数据获取,点击左边的海洋水色卫星数据获取可以得到右边这个界面。

    按需求选择。

    加入订单,下载即可,我觉得有点麻烦的是,批量勾选,每勾选一次自动跳回第一页= =。

    最后就等等审批(应该很快,几分钟?),然后就可以下载了/

    推荐使用DownThemAll批量下载器,火狐的插件。

    三、数据处理

    数据下载下来,压缩包格式,解压后,L1A后缀文件才是AIS数据,是csv格式的,并且用逗号分隔,可以用excel打开。

    那么批量处理我主要是分成两个程序了。

    1、解压

    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Sat Feb 6 22:02:47 2021
    4. 解压tar.gz文件
    5. @author: 就是一只白
    6. """
    7. import tarfile
    8. import os
    9. import glob
    10. def untar(fname, dirs):
    11. t = tarfile.open(fname)
    12. t.extractall(path = dirs)
    13. rootdir = "H:\\AIS\\20210104_20210119\\"
    14. outfolder='H:\\AIS\\20210104_20210119\\process\\'
    15. files = glob.glob(rootdir+"*.tar.gz")
    16. #filelist = os.listdir(rootdir)
    17. for file in files:
    18. print(file)
    19. untar(file,outfolder)

    2、提取时间、位置等数据

    报文的解析可以看pdf文件,CSV文件每行代表一个报文消息,每一列是该条信息的一个字段(如速度、时间)。一共有27个报文类型,不同类型的报文后面的信息字段不同。

    我下面的代码只筛选了几种进行处理,因为通过excel表筛选发现其他的我这边没有。

    以下代码可以获取两个csv文件,代码注释写了两个文件的区别。

    最后其实只需要用position的文件即可,数据有四项:时间、航速、经度、纬度

    通过修改下方的mmsi号修改查找的船舶

    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Sun Feb 7 10:24:29 2021
    4. @author: jiushiyizhibai
    5. """
    6. import os
    7. import glob
    8. from pandas.core.frame import DataFrame
    9. import csv
    10. import numpy as np
    11. import datetime
    12. #按照mmsi号查找报文信息
    13. rootdir = "H:\\AIS\\20210104_20210119\\process\\"
    14. outfolder='H:\\AIS\\20210104_20210119\\csv\\'
    15. mmsi='309351666'
    16. files = glob.glob(rootdir+"*.l1a")
    17. result=[]
    18. #filelist = os.listdir(rootdir)
    19. for file in files:
    20. print(file)
    21. table=open(file,'r')
    22. s = [i[:-1].split(',') for i in table.readlines()]
    23. s=[n for n in s if n[5]==mmsi]
    24. print(len(s))
    25. if len(s)>0 :
    26. for i in s:
    27. result.append(i)
    28. data=DataFrame(result)
    29. time=[]
    30. speed=[]
    31. lon=[]
    32. lat=[]
    33. for row in data.itertuples():
    34. if row[4]=='1' or row[4]=='3':
    35. time.append(datetime.datetime.strptime(row[1],'%Y-%m-%d %H:%M:%S'))
    36. speed.append(float(row[9]))
    37. lon.append(float(row[11]))
    38. lat.append(float(row[12]))
    39. elif row[4]=='27':
    40. time.append(datetime.datetime.strptime(row[1],'%Y-%m-%d %H:%M:%S'))
    41. speed.append(float(row[12]))
    42. lon.append(float(row[10]))
    43. lat.append(float(row[11]))
    44. else:
    45. print("没有查到此类报文:",row[4])
    46. presult = DataFrame({'time':time,
    47. 'speed':speed,
    48. 'lon':lon,
    49. 'lat':lat})
    50. presult=presult.sort_values(by='time')
    51. #['time','speed','lon','lat']
    52. #print(data)
    53. data=data.values
    54. #输出文件csv,这里是只输出时间速度和位置
    55. presult.to_csv(outfolder+mmsi+'_AIS_position.csv',index = False)
    56. #输出所有报文信息的文件
    57. csvfile = open(outfolder+mmsi+'_AIS.csv', 'w') #打开方式还可以使用file对象
    58. writer = csv.writer(csvfile)
    59. writer.writerows(data)
    60. csvfile.close()

    3、将csv转成点和线的shapefile轨迹文件(ArcMap)

    如何将Excel经纬度坐标数据导入ArcGIS

    看上面的即可,点转线用的是点集转线这个功能。

    PS:XY建立点数据的时候,选择坐标系统,不要选择投影系统!!不然就会出现点不知在哪的情况

  • 相关阅读:
    GPT实战系列-LangChain如何构建基通义千问的多工具链
    TM-30 计算软件 (Excel图表显示版本)
    Apache Hop Pipeline Transforms【持续完善中】
    session 反序列化
    【毕业设计】基于单片机的酒驾检测仪 - stm32 物联网 酒精检测
    路由事件2
    C++基础知识1 入门基础
    Windows&Linux文件传输方式总结
    老师设计的库CRC计算
    Centos7 yum安装git服务器
  • 原文地址:https://blog.csdn.net/XinemaChen/article/details/113815478