【问题标题】:Download weather data by zip code tabulate area in R在R中按邮政编码列表区域下载天气数据
【发布时间】:2015-01-01 20:19:09
【问题描述】:

我想弄清楚如何按邮政编码制表区(ZCTA)下载天气(温度、辐射等)。虽然人口普查数据有 ZCTA 的人口普查信息,但天气数据并非如此。

我尝试从http://cdo.ncdc.noaa.gov/qclcd/QCLCD?prior=N 查找信息 但无法弄清楚。

你们中有人下载过 ZCTA 的天气数据吗?如果没有,有没有人有将气象观测站信息转换为 ZCTA 的经验?

【问题讨论】:

    标签: r download weather


    【解决方案1】:

    国家气象局提供两个基于 Web 的 API,用于从国家数字预报数据库 (NDFD) 中提取天气预报信息:SOAP interfaceREST interface。两者都以Digital Weather Markup Language (DWML) 形式返回数据,这是一种 XML 方言。可以返回的数据元素列在here

    目前为止,IMO REST 接口更易于使用。下面是一个示例,我们提取邮政编码 10001(曼哈顿下城)未来 5 天以 3 小时为增量的预测温度、相对湿度和风速。

    # NOAA NWS REST API Example
    # 3-hourly forecast for Lower Mannhattan (Zip Code: 10001)
    library(httr)
    library(XML)
    url <- "http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php"
    response <- GET(url,query=list(zipCodeList="10001",
                                   product="time-series",
                                   begin=format(Sys.Date(),"%Y-%m-%d"),
                                   Unit="e",
                                   temp="temp",rh="rh",wspd="wspd"))
    doc   <- content(response,type="text/xml")   # XML document with the data
    # extract the date-times
    dates <- doc["//time-layout/start-valid-time"]
    dates <- as.POSIXct(xmlSApply(dates,xmlValue),format="%Y-%m-%dT%H:%M:%S")
    # extract the actual data
    data   <- doc["//parameters/*"]
    data   <- sapply(data,function(d)removeChildren(d,kids=list("name")))
    result <- do.call(data.frame,lapply(data,function(d)xmlSApply(d,xmlValue)))
    colnames(result) <- sapply(data,xmlName)
    # combine into a data frame
    result <- data.frame(dates,result)
    head(result)
    #                 dates temperature wind.speed humidity
    # 1 2014-11-06 19:00:00          52          8       96
    # 2 2014-11-06 22:00:00          50          7       86
    # 3 2014-11-07 01:00:00          50          7       83
    # 4 2014-11-07 04:00:00          47         11       83
    # 5 2014-11-07 07:00:00          45         14       83
    # 6 2014-11-07 10:00:00          50         16       61
    

    可以在单个请求中查询多个邮政编码,但这会使解析返回的 XML 变得复杂。

    【讨论】:

    • 感谢分享您的代码!我的问题是我需要超过 16 年的每小时温度(辐射)数据超过 400 zcta。我可能需要弄清楚如何将气象站与zcta匹配以及如何按月批量下载数据。
    【解决方案2】:

    要将 NOAA QCLCD 数据转换为邮政编码,您需要使用 station.txt 文件中的纬度/经度值,并将其与人口普查中的数据进行比较。这只能通过 GIS 相关工具来完成。我的解决方案是使用启用PostGIS 的数据库,这样您就可以使用ST_MakePoint 函数:

    ST_MakePoint(longitude, latitude)
    

    然后,您还需要将人口普查局的 ZCTA 加载到数据库中,以确定哪些邮政编码包含哪些站点。 ST_Contains 函数将对此有所帮助。

    ST_Contains(zip_way, ST_MakePoint(longitude, latitude))
    

    完整的查询可能如下所示:

    SELECT s.wban, z.zip5, s.state, s.location
       FROM public.station s
       INNER JOIN public.zip z 
           ON ST_Contains(z.way, ST_MakePoint(s.longitude, s.latitude)
    

    我显然是在对列名做出假设,但以上应该是一个很好的起点。

    您也应该能够使用 QGIS(免费)或 ArcGIS(昂贵)完成相同的任务。这消除了安装启用 PostGIS 的数据库的开销,但我对这些软件包中所需的步骤并不熟悉。

    【讨论】:

      【解决方案3】:

      天气数据仅适用于气象站,每个 ZCTA 没有一个气象站(ZCTA 比气象站覆盖的区域小得多)。

      我在 noaa 网站上看到了一些选项,您可以在其中输入纬度和经度,它会从相应的气象站找到天气。因此,如果您可以将您感兴趣的 ZCTA 转换为纬度/经度对(中心、随机角等),您可以将其提交到网站。但请注意,如果您对大量靠近的 ZCTA 执行此操作,您将下载冗余信息。最好将ZCTA与气象站进行一次匹配,然后从每个站只下载一次气象信息,然后与ZCTA数据合并。

      【讨论】:

      • 谢谢!好建议!将 400 多个 ZCTA 匹配到气象站可能会很痛苦,但如果将来可以重复使用,则值得。
      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多