经纬度点的重采样列表
Resample list of lat lon points
下面的代码读取有关全球有效 ASOS(气象观测站)位置的数据。我想在未来使用该列表作为点列表来绘制数据,但是很多站点靠得太近以至于无法在国家甚至州一级查看。我想减少地图上绘制的站点的密度。下面是一些绘制 US/southern 加拿大所有站点的代码:
import re
fh = open('../498/stations.txt', 'r')
lines = fh.readlines()
data = []
for line in lines:
comment_match = re.search('^!', line)
blank_match = re.search('^\s*$', line)
header_match = re.search('\d{2}-\w{3}-\d{2}|CD\s+STATION', line)
if comment_match or blank_match or header_match:
None
else:
ICAO = line[20:24].strip()
if len(ICAO) == 4:
CD = line[0:3].strip()
if len(CD) == 0:
CD = None
STATION = line[3:20].strip()
LATLON = line[39:54]
if LATLON[5] == 'S':
LAT = float("{0:.2f}".format(-(float(LATLON[0:2])+float(LATLON[3:5])/60.)))
if LATLON[5] == 'N':
LAT = float("{0:.2f}".format((float(LATLON[0:2])+float(LATLON[3:5])/60.)))
if LATLON[14] == 'W':
LON = float("{0:.2f}".format(-(float(LATLON[8:11])+float(LATLON[12:14])/60.)))
if LATLON[14] == 'E':
LON = float("{0:.2f}".format((float(LATLON[8:11])+float(LATLON[12:14])/60.)))
ELEV = int(line[54:59].strip())
C = line[81:-1]
stn_dict = {'name':STATION, 'id':ICAO, 'state':CD, 'country':C, 'lat':LAT, 'lon':LON, 'elev':ELEV}
data.append(stn_dict)
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
extent = [-130,-60,20,60]
fig = plt.figure(figsize=(15,12))
ax = fig.add_subplot(111,projection=ccrs.Miller())
ax.coastlines(resolution='50m')
ax.add_feature(cfeature.STATES.with_scale('50m'))
ax.set_extent(extent,crs=ccrs.Miller())
for stndict in data:
if stndict['lon'] > extent[0] and stndict['lon'] < extent[1] and stndict['lat'] > extent[2] and stndict['lat'] < extent[3]:
plt.plot(stndict['lon'], stndict['lat'], color='blue', marker='o',
transform=ccrs.PlateCarree())
Here is the output of the code.
在此地图比例下,您可以看到许多地块相互重叠。理想情况下,我希望具有更改绘制点之间距离的功能,例如 100 公里。
是否有任何库可以简化此任务?
MetPy has a function reduce_point_density
即能为所欲为。此函数将您的站点位置作为(点数)x 维度(例如 2 或 3)数组,以及半径,到结果中最近点的最小距离。结果是一个布尔数组,您可以将其用作 select 兴趣点的掩码。你像这样使用它:
from metpy.calc import reduce_point_density
import numpy as np
point_locs = np.array([(10, 50), (11, 49), (35, 40)])
mask = reduce_point_density(point_locs, 4.)
keep_points = point_locs[mask]
您还可以选择传递一组优先级值,这允许控制优先 select 保留哪些点。使用 reduce_point_density
的一个更大的例子是 here.
下面的代码读取有关全球有效 ASOS(气象观测站)位置的数据。我想在未来使用该列表作为点列表来绘制数据,但是很多站点靠得太近以至于无法在国家甚至州一级查看。我想减少地图上绘制的站点的密度。下面是一些绘制 US/southern 加拿大所有站点的代码:
import re
fh = open('../498/stations.txt', 'r')
lines = fh.readlines()
data = []
for line in lines:
comment_match = re.search('^!', line)
blank_match = re.search('^\s*$', line)
header_match = re.search('\d{2}-\w{3}-\d{2}|CD\s+STATION', line)
if comment_match or blank_match or header_match:
None
else:
ICAO = line[20:24].strip()
if len(ICAO) == 4:
CD = line[0:3].strip()
if len(CD) == 0:
CD = None
STATION = line[3:20].strip()
LATLON = line[39:54]
if LATLON[5] == 'S':
LAT = float("{0:.2f}".format(-(float(LATLON[0:2])+float(LATLON[3:5])/60.)))
if LATLON[5] == 'N':
LAT = float("{0:.2f}".format((float(LATLON[0:2])+float(LATLON[3:5])/60.)))
if LATLON[14] == 'W':
LON = float("{0:.2f}".format(-(float(LATLON[8:11])+float(LATLON[12:14])/60.)))
if LATLON[14] == 'E':
LON = float("{0:.2f}".format((float(LATLON[8:11])+float(LATLON[12:14])/60.)))
ELEV = int(line[54:59].strip())
C = line[81:-1]
stn_dict = {'name':STATION, 'id':ICAO, 'state':CD, 'country':C, 'lat':LAT, 'lon':LON, 'elev':ELEV}
data.append(stn_dict)
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
extent = [-130,-60,20,60]
fig = plt.figure(figsize=(15,12))
ax = fig.add_subplot(111,projection=ccrs.Miller())
ax.coastlines(resolution='50m')
ax.add_feature(cfeature.STATES.with_scale('50m'))
ax.set_extent(extent,crs=ccrs.Miller())
for stndict in data:
if stndict['lon'] > extent[0] and stndict['lon'] < extent[1] and stndict['lat'] > extent[2] and stndict['lat'] < extent[3]:
plt.plot(stndict['lon'], stndict['lat'], color='blue', marker='o',
transform=ccrs.PlateCarree())
Here is the output of the code. 在此地图比例下,您可以看到许多地块相互重叠。理想情况下,我希望具有更改绘制点之间距离的功能,例如 100 公里。
是否有任何库可以简化此任务?
MetPy has a function reduce_point_density
即能为所欲为。此函数将您的站点位置作为(点数)x 维度(例如 2 或 3)数组,以及半径,到结果中最近点的最小距离。结果是一个布尔数组,您可以将其用作 select 兴趣点的掩码。你像这样使用它:
from metpy.calc import reduce_point_density
import numpy as np
point_locs = np.array([(10, 50), (11, 49), (35, 40)])
mask = reduce_point_density(point_locs, 4.)
keep_points = point_locs[mask]
您还可以选择传递一组优先级值,这允许控制优先 select 保留哪些点。使用 reduce_point_density
的一个更大的例子是 here.