地图的主要和次要刻度?

Posted

技术标签:

【中文标题】地图的主要和次要刻度?【英文标题】:Major and minor graticule for maps? 【发布时间】:2017-02-27 03:05:59 【问题描述】:

我创建了以下地图,它有一个均匀的灰色网格,经线和纬线的间隔均为 1°:

我还希望每 5° 间隔(同时保持 1° 网格)使经线和纬线更粗且黑色,以便网格线与纬度和经度标签匹配,如下所示:

我知道 MATLAB 有 major and minor grids 用于标准 2D 绘图,我过去曾使用过它们。但是,据我所知,地图没有这个功能。

我认为我想做的可以通过访问地图对象属性(使用gcmgetm)并为经络和纬线的特定子集指定黑色属性(使用setm)来实现.也许函数gridmaxesm 可以处理这个问题,但我不确定。

实际上,我不知道该怎么做,因为我对地图没有任何经验。非常感谢您的帮助。

代码:

注意:此代码需要Mapping Toolbox。

% Read vector features and attributes from shapefile.
landareas = shaperead('landareas.shp', 'UseGeoCoords', true);

% Define map axes and set map properties.
axesm ('lambert',...
    'MapLonLimit', [-70 10],...
    'MapLatLimit', [30 70],...
    'MapParallels', [38.00555556 71.01111111],...
    'Frame', 'on',...
    'FLineWidth', 1,...
    'Grid', 'on',...
    'GLineStyle', '-',...
    'GLineWidth', 0.1,...
    'GColor', [.7 .7 .7]);

% Display map latitude and longitude data.
geoshow(landareas, 'FaceColor', [1 1 .5], 'EdgeColor', [.3 .3 .3]);

% Toggle and control display of graticule lines.
gridm('MLineLocation', 1,...
    'MLabelLocation', 5,...
    'PLineLocation', 1,...
    'PLabelLocation', 5);

% Toggle and control display of meridian labels.
mlabel on;

% Toggle and control display of parallel labels.
plabel on;

axis off;

【问题讨论】:

确实存在一个Geographic Information Systems StackExchange 站点。 【参考方案1】:

这是一个非常简单的技巧:在同一个 'Position' 中创建第二个 axes,并在那里创建您想要的主要网格。

从您的代码开始,进行一些修改(我结合了axesmgridm):

landareas = shaperead('landareas.shp', 'UseGeoCoords', true);

% make the first axes and get the handle of it
ha = axes;

axesm ('lambert',...
    'MapLonLimit', [-70 10],...
    'MapLatLimit', [30 70],...
    'MapParallels', [38.00555556 71.01111111],...
    'Grid', 'on',...
    'GLineStyle', '-',...
    'GLineWidth', 0.1,...
    'GColor', [.7 .7 .7], ...
    'MLineLocation', 1,...
    'PLineLocation', 1);

geoshow(landareas, 'FaceColor', [1 1 .5], 'EdgeColor', [.3 .3 .3]);

axis off;

然后制作第二个轴:

% get the position of the first axes
L = get(ha, 'Position');

% make a new axes in the same position
axes('Position', L)

axesm ('lambert',...
    'MapLonLimit', [-70 10],...
    'MapLatLimit', [30 70],...
    'MapParallels', [38.00555556 71.01111111],...
    'Frame', 'on',...
    'FLineWidth', 2,...
    'Grid', 'on',...
    'GLineStyle', '-',...
    'GLineWidth', 2,...
    'GColor', [.2 .2 .2], ...
    'MLineLocation', 5,...
    'MLabelLocation', 5,...
    'PLineLocation', 5,...
    'PLabelLocation', 5);

mlabel on;
plabel on;
axis off;

你会得到这个结果:

甚至不需要获取和设置位置,因为它们都将在默认位置创建。

【讨论】:

有人可能会觉得这很有用:如果您希望同时缩放两个轴,请使用 linkaxes【参考方案2】:

TL;DR

使用这个稍微修改过的代码版本:

% Read vector features and attributes from shapefile.
landareas = shaperead('landareas.shp', 'UseGeoCoords', true);

% Define map axes and set map properties.
hAx = axesm ('lambert',...  <<<<<<<<<<<<<<<<<<<<<<<<< Change #1
    'MapLonLimit', [-70 10],...
    'MapLatLimit', [30 70],...
    'MapParallels', [38.00555556 71.01111111],...
    'Frame', 'on',...
    'FLineWidth', 1,...
    'Grid', 'on',...
    'GLineStyle', '-',...
    'GLineWidth', 0.1,...
    'GColor', [.7 .7 .7]);

% Display map latitude and longitude data.
geoshow(landareas, 'FaceColor', [1 1 .5], 'EdgeColor', [.3 .3 .3]);

% Toggle and control display of graticule lines.
hGrid = gridm(... <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Change #2
  'MLineLocation', 1,... 
  'PLineLocation', 1);

% Change #3:
hGridCopy = copyobj(hGrid,hAx); 
set(hGridCopy,'Tag','oldGrid');  % We use this to hide the grid from handlem,
gridm(...                          so that it doesn't get found and deleted.
  'MLineLocation', 5,...
  'MLabelLocation', 5,...
  'PLineLocation', 5,...
  'PLabelLocation', 5,...
  'GColor',[0,0,0],...
  'GLineWidth',3);

% Toggle and control display of meridian labels.
mlabel on;

% Toggle and control display of parallel labels.
plabel on;

axis off;

要了解这个 hacky 解决方案的来源,请参阅下面的部分。


axesm制作的句柄,我们可以了解到map plot的结构:

% Change from this:
axesm ('lambert',...
% To this:
hAx = axesm ('lambert',...

然后,hAx.Children 为我们提供以下信息:

ans = 

  30×1 graphics array:

  Text     (PLabel)
  ... 
  Text     (MLabel)
  Line     (Parallel)
  Line     (Meridian)
  Group
  Patch    (Frame)

由此我们了解到,每个行集合,即MeridianParallel,实际上是一个对象,这意味着某种类型的所有行必须具有完全相同的样式 - 与“传统”不同 minor 和 major grid 行(可能不同)。如果我们希望 一些 行不同,我们必须创建一个具有所需属性的新对象(行的子集)。

现在,创建这些极坐标网格线的最简单方法是再次调用gridm,但是,这会删除所有已绘制的网格。它是如何做到的? gridm 内部调用handlem('grid'),它查找具有TagParallelMeridian 的图形对象,找到的对象稍后将被删除并替换为具有新外观的对象。那么我们该怎么办?当然,我们从handlem“隐藏”网格(参见Change #3;通过更改这些对象的Tag 属性)!然后我们只需创建另一个网格就完成了。

【讨论】:

以上是关于地图的主要和次要刻度?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫时间序列图设置 x 轴主要和次要刻度和标签

在 matplotlib 颜色栏中设置次要刻度的数量

tableau的刻度线处理

Matplotlib:季度小刻度标签

Matplotlib 半对数图:当范围很大时,次要刻度线消失了

使用 tickInterval 时在 Highcharts 中的次要刻度上显示标签