title: 工具

weight: 5

最近邻点

  1. points = codes_grib_find_nearest (gid, inlat, inlon, is_lsm=False, npoints=1)
  2. point = points[0]
  3. # point : {
  4. # lat: lat, lon: lon, index: index, value: value, distance: distance
  5. # }

寻找给定经纬度点的最近邻点的 tuple。当 npoints=4 时将返回 4 个最近邻点的tuple。

示例

下面的示例寻找北京(39.92,116.46)的 1 个最近邻点。

  1. from __future__ import print_function
  2. import click
  3. import eccodes
  4. @click.command()
  5. @click.argument('file_path')
  6. def cli(file_path):
  7. with open(file_path, 'rb') as f:
  8. handle = eccodes.codes_grib_new_from_file(f, headers_only=False)
  9. while handle is not None:
  10. date = eccodes.codes_get(handle, "dataDate")
  11. type_of_level = eccodes.codes_get(handle, "typeOfLevel")
  12. level = eccodes.codes_get(handle, "level")
  13. points = eccodes.codes_grib_find_nearest(handle, 39.92, 116.46, False, 1)
  14. point = points[0]
  15. print(date, type_of_level, level, " :", point.lat, point.lon, point.value, point.distance)
  16. eccodes.codes_release(handle)
  17. handle = eccodes.codes_grib_new_from_file(f, headers_only=False)
  18. if __name__ == "__main__":
  19. cli()

部分输出结果:

  1. 20180113 isobaricInhPa 10 : 39.9375 116.4375 226.705515625 2.73275631598
  2. 20180113 isobaricInhPa 20 : 39.9375 116.4375 226.627828125 2.73275631598
  3. 20180113 isobaricInhPa 30 : 39.9375 116.4375 220.17278125 2.73275631598
  4. ...

迭代器

ecCodes 的迭代器用于读取数据值,每次调用返回经纬度坐标和数据值。

创建迭代器

  1. iter_id = codes_grib_iterator_new (gid,mode)

获取数据值

  1. [lat,lon,value] = codes_grib_iterator_next (iterid)

释放迭代器

  1. codes_grib_iterator_delete (iter_id)

示例

  1. from __future__ import print_function
  2. import click
  3. import eccodes
  4. @click.command()
  5. @click.argument('file_path')
  6. def cli(file_path):
  7. with open(file_path, 'rb') as f:
  8. handle = eccodes.codes_grib_new_from_file(f, headers_only=False)
  9. date = eccodes.codes_get(handle, "dataDate")
  10. type_of_level = eccodes.codes_get(handle, "typeOfLevel")
  11. level = eccodes.codes_get(handle, "level")
  12. iter_id = eccodes.codes_grib_iterator_new(handle, 0)
  13. while 1:
  14. result = eccodes.codes_grib_iterator_next(iter_id)
  15. if not result:
  16. break
  17. [lat, lon, value] = result
  18. print(lat, lon, value)
  19. eccodes.codes_grib_iterator_delete(iter_id)
  20. eccodes.codes_release(handle)
  21. if __name__ == "__main__":
  22. cli()