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与公里或米之间的关系。关系怎么样,有人知道吗?
答案 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