纬度半径与米之间的关系(底图)

时间:2015-01-28 11:11:28

标签: python matplotlib matplotlib-basemap

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np


plt.figure(1)
map = Basemap(projection='merc',
resolution='l',
llcrnrlat=44.0,
llcrnrlon=5.0,
urcrnrlat=57.0,
urcrnrlon=17)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color='lightgray')
map.drawmapboundary()

long1 = np.array([ 13.404954,  11.581981,   9.993682,   8.682127,   6.960279,
6.773456,   9.182932,  12.373075,  13.737262,  11.07675 ,
7.465298,   7.011555,  12.099147,   9.73201 ,   7.628279,
8.801694,  10.52677 ,   8.466039,   8.239761,  10.89779 ,
8.403653,   8.532471,   7.098207,   7.216236,   9.987608,
7.626135,  11.627624,   6.852038,  10.686559,   8.047179,
8.247253,   6.083887,   7.588996,   9.953355,  10.122765])

lat1 = np.array([ 52.520007,  48.135125,  53.551085,  50.110922,  50.937531,
51.227741,  48.775846,  51.339695,  51.050409,  49.45203 ,
51.513587,  51.455643,  54.092441,  52.375892,  51.36591 ,
53.079296,  52.268874,  49.487459,  50.078218,  48.370545,
49.00689 ,  52.030228,  50.73743 ,  51.481845,  48.401082,
51.960665,  52.120533,  51.47512 ,  53.865467,  52.279911,
49.992862,  50.775346,  50.356943,  49.791304,  54.323293])

x, y = map(long1, lat1)
map.plot(x,y,'o')
plt.show()

nylat = 52.520007; nylon = 13.404954
lonlat = 48.135125; lonlon = 11.581981
m.drawgreatcircle(nylon,nylat,lonlon,lonlat,linewidth=2,color='b')
我可以画两点之间的直线。这是正确的方法吗?

问题是如何在一个点周围绘制一个圆圈。我想用浅红色填充圆圈的内部,所以我可以看到圆圈下面的所有点和线。

我希望能够调整圆的半径。一个例子就是半径为60公里!

更新

我需要tissot功能:

来自mpl_toolkits.basemap导入底图

x0, y0 = 35, -50
R = 5

m = Basemap(width=8000000,height=7000000, resolution='l',projection='aea', 
    lat_1=-40.,lat_2=-60,lon_0=35,lat_0=-50)
m.drawcoastlines()
m.tissot(x0, y0, R, 100, facecolor='g', alpha=0.5)

在纪录片中写道:

  

tissot(lon_0,lat_0,radius_deg,npts,ax = None,** kwargs)

     

绘制以lon_0,lat_0为中心的多边形。多边形近似a   半径为radius_deg度的地球表面上的圆   沿经度lon_0的纬度,由npts顶点组成。多边形   代表天梭的指标   (http://en.wikipedia.org/wiki/Tissot's_Indicatrix),绘制时   在地图上显示地图投影中固有的扭曲。

我需要得到radius_deg与公里或米之间的关系。关系怎么样,有人知道吗?

1 个答案:

答案 0 :(得分:3)

这种关系称为Haversine公式;它给出了球面上两点之间的关系以及它们之间的球面距离。

它的实现是elsewhere on stackoverflow

要使用Basemap tissot绘制投影圈子,您需要为所需半径(lon, lat)对解决Haversine远离中心(c_lon, c_lat)对的圆圈。由于tissot的定义,在等式lat中更容易求解radius = Haversine(c_lon, c_lat, c_lon, lat),因此使用相等的经度因为绘制的圆将具有等于该纬度的半径差。

在您的情况下,这很简单:

def radius_for_tissot(dist_km):
    return np.rad2deg(dist_km/6367.)

lon0, lat0 = 11, (44+57)/2.
mymap.tissot(lon0, lat0, radius_for_tissot(100),
    256, facecolor='b', alpha=0.5)  # places a Tissot circle with radius 100km in Germany