首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在底图中绘制格网数据并沿特定方位角查找网格点

如何在底图中绘制格网数据并沿特定方位角查找网格点
EN

Stack Overflow用户
提问于 2013-02-20 20:39:20
回答 1查看 1.7K关注 0票数 0

更新:我正在尝试映射一些数据。我有一组从网格中的参考点测量的后方位角(baz)。我想要找到网格上的所有点,沿着baz的一个大圆圈将会交叉。为此,我迭代网格中的每个点,计算该点和参考点之间的预期后方位角,并与每个测量的baz进行比较。如果两者之间的差异很小(小于2度),我会对该点进行加权。然后我把它们都放在地图上。我使用的代码如下,但结果看起来有点奇怪,有人知道我哪里出错了吗,或者有没有比我做的更好的方法(更快)?

代码语言:javascript
复制
from matplotlib.colorbar import ColorbarBase
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
import mpl_toolkits.basemap.pyproj as pyproj


llcrnrlon = -30.0
llcrnrlat = 45.0
urcrnrlon = 0.0
urcrnrlat = 65.0
lon_0 = (urcrnrlon + llcrnrlon) / 2.
lat_0 = (urcrnrlat + llcrnrlat) / 2.

lat = 51.58661577  # reference point
lon = -9.18822525


# Generate random back-azimuths.
baz = zeros((20))
for i in xrange(len(baz)):
  baz[i] = random.randint(200,230)


####################################################################
## Set up the map background.
m = Basemap(llcrnrlon=llcrnrlon,llcrnrlat=llcrnrlat,urcrnrlon=urcrnrlon,urcrnrlat=urcrnrlat,
    resolution='i',projection='lcc',lon_0=lon_0,lat_0=lat_0)
m.drawcoastlines()
m.fillcontinents() 

# draw parallels
m.drawparallels(np.arange(10,70,10),labels=[1,0,0,0])
# draw meridians
m.drawmeridians(np.arange(-80, 25, 10),labels=[0,0,0,1])

# Plot station locations.
x, y = m(lon, lat)            # array ref points
m.plot(x,y,'ro', ms=5)


####################################################################
## Set up the grids etc.
glons = np.linspace(llcrnrlon, urcrnrlon, 100)
glats = np.linspace(llcrnrlat, urcrnrlat, 100)

# Convert to map coords.
xlons, ylats = m(glons, glats)

# create grid for pcolormesh.
grid_lon, grid_lat = np.meshgrid(xlons, ylats)

# create weights for pcolormesh.
weights = np.zeros(np.shape(grid_lon))

# create grid of lat-lon coords for baz calculation.
gln, glt = np.meshgrid(glons, glats)


####################################################################
## calculate baz from grid_lon, grid_lat to lon, lat. If less 
## than error weight grid point.

# method for BAZ calculation via pyproj.
def get_baz(lon1, lat1, lon2, lat2):
  g = pyproj.Geod(ellps='WGS84')
  az, baz, dist = g.inv(lon1, lat1, lon2, lat2)
  return baz

# BAZ calcultion for each point in grid.
ll=0
for mBAZ in baz:
  for i in xrange(len(gln)):
    for k in xrange(len(gln[i])):
      nbaz = get_baz(lon, lat, gln[i][k], glt[i][k])
      nbaz += 180
      if abs(nbaz - mBAZ) < 2:
    weights[i][k] = 1
  ll+=1


# plot grid.
m.pcolormesh(grid_lon, grid_lat, weights, cmap=plt.cm.YlOrBr)
plt.colorbar()
plt.show()

下面的原始问题,现在已经过时了。

我正在尝试映射一些数据。我有一个数据集,它给出了每个方向的值(频率)的范围。我想在网格上绘制它们,这样沿着特定方位的每个网格点就会被特定频率的功率加权。我已经创建了一个带有底图的地图,并在上面绘制了一个网格,如下所示,

代码语言:javascript
复制
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
from shoot import *

llcrnrlon = -20.0
llcrnrlat = 45.0
urcrnrlon = 10.0
urcrnrlat = 65.0
lon_0 = (urcrnrlon + llcrnrlon) / 2.
lat_0 = (urcrnrlat + llcrnrlat) / 2.

m = Basemap(llcrnrlon=llcrnrlon,llcrnrlat=llcrnrlat,urcrnrlon=urcrnrlon,urcrnrlat=urcrnrlat,
        resolution='i',projection='lcc',lon_0=lon_0,lat_0=lat_0)

## Set up the grid.
glons = np.linspace(-20,10,50)
glats = np.linspace(45, 65, 50)
xlons, ylats = m(glons, glats)
grid_lon, grid_lat = np.meshgrid(xlons, ylats) 
pwr = np.zeros((50,50))

m.drawcoastlines()
m.fillcontinents() 

# draw parallels
m.drawparallels(np.arange(10,70,10),labels=[1,0,0,0])
# draw meridians
m.drawmeridians(np.arange(-80, 25, 10),labels=[0,0,0,1])

lats = [54.8639587, 51.5641564]
lons = [-8.1778180, -9.2754284]

x, y = m(lons, lats)            # array ref points

# Plot station locations.
m.plot(x,y,'ro', ms=5)
m.pcolormesh(grid_lon, grid_lat, pwr)

然后,我使用在这个漂亮的site中找到的一些函数来画出我想要的大圆圈

代码语言:javascript
复制
glon1 = lons[0]
glat1 = lats[0]
azimuth = 280.
maxdist = 200.
great(m, glon1, glat1, azimuth, color='orange', lw=2.0)
plt.show()

然而,绘制直线是不够的,我希望能够找到大圆相交的网格点,这样我就可以为它们赋值。有人知道该怎么做吗??

EN

回答 1

Stack Overflow用户

发布于 2013-05-30 00:32:55

你能详细说明你指的是哪个交叉点吗?运行你的代码只返回一行...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14980070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档