地图的主要和次要标线?
Major and minor graticule for maps?
我创建了以下地图,它具有统一的灰色网格,经线和纬线的间隔均为 1°:
我还希望每 5° 间隔(同时保持 1° 网格)的经线和纬线更粗并显示为黑色,以便网格线与纬度和经度标签匹配,如下所示:
我知道 MATLAB 有 major and minor grids 标准二维绘图,我过去也用过。但是,据我所知,地图没有这个功能。
我认为我想做的事情可以通过访问地图对象属性来实现(使用 gcm
or getm
) and specifying a black color property to the specific subset of meridians and parallels (using setm
). Maybe the functions gridm
or axesm
可以处理这个,但我不确定。
实际上,我不知道该怎么做,因为我对地图没有任何经验。非常感谢您的帮助。
代码:
Note: This code requires the 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;
这是一个非常简单的技巧:在同一个 'Position'
中制作第二个 axes
并在那里制作您想要的主要网格。
从您的代码开始并进行一些修改(我结合了 axesm
和 gridm
):
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;
你会得到这样的结果:
甚至不需要获取和设置位置,因为它们都将在默认位置创建。
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
生成的handle,我们可以了解到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)
从这里我们了解到每个线条集合,即 Meridian
和 Parallel
,实际上是一个单独的对象,这意味着某种类型的所有线条必须具有完全相同的样式- 不同于 "traditional" minor 和 major grid
行(可能不同)。如果我们想要 一些 行不同,我们必须创建一个具有所需属性的新对象(行的子集)。
现在,创建这些极坐标网格线的最简单方法是再次调用 gridm
,但是,唉,这会删除所有已经绘制的网格。它是怎么做到的? gridm
内部调用 handlem('grid')
查找具有 Parallel
或 Meridian
的 Tag
的图形对象,找到的对象随后被删除并替换为具有新外观。那么我们该怎么办?我们 "hide" 来自 handlem
的网格(参见 Change #3
;通过更改这些对象的 Tag
属性),当然!然后我们创建另一个网格就完成了。
我创建了以下地图,它具有统一的灰色网格,经线和纬线的间隔均为 1°:
我还希望每 5° 间隔(同时保持 1° 网格)的经线和纬线更粗并显示为黑色,以便网格线与纬度和经度标签匹配,如下所示:
我知道 MATLAB 有 major and minor grids 标准二维绘图,我过去也用过。但是,据我所知,地图没有这个功能。
我认为我想做的事情可以通过访问地图对象属性来实现(使用 gcm
or getm
) and specifying a black color property to the specific subset of meridians and parallels (using setm
). Maybe the functions gridm
or axesm
可以处理这个,但我不确定。
实际上,我不知道该怎么做,因为我对地图没有任何经验。非常感谢您的帮助。
代码:
Note: This code requires the 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;
这是一个非常简单的技巧:在同一个 'Position'
中制作第二个 axes
并在那里制作您想要的主要网格。
从您的代码开始并进行一些修改(我结合了 axesm
和 gridm
):
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;
你会得到这样的结果:
甚至不需要获取和设置位置,因为它们都将在默认位置创建。
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
生成的handle,我们可以了解到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)
从这里我们了解到每个线条集合,即 Meridian
和 Parallel
,实际上是一个单独的对象,这意味着某种类型的所有线条必须具有完全相同的样式- 不同于 "traditional" minor 和 major grid
行(可能不同)。如果我们想要 一些 行不同,我们必须创建一个具有所需属性的新对象(行的子集)。
现在,创建这些极坐标网格线的最简单方法是再次调用 gridm
,但是,唉,这会删除所有已经绘制的网格。它是怎么做到的? gridm
内部调用 handlem('grid')
查找具有 Parallel
或 Meridian
的 Tag
的图形对象,找到的对象随后被删除并替换为具有新外观。那么我们该怎么办?我们 "hide" 来自 handlem
的网格(参见 Change #3
;通过更改这些对象的 Tag
属性),当然!然后我们创建另一个网格就完成了。