使用mapshow+shapefile的方法:
%% mapchina clc;clear;clf % shapefile中都包含了国界和省界 fnshp_L='E:\ChinaMap\国界与省界\bou2_4l.shp';%ShapeType: 'PolyLine' fnshp_P='E:\ChinaMap\国界与省界\bou2_4p.shp';%ShapeType: 'Polygon' infoL = shapeinfo(fnshp_L); infoP = shapeinfo(fnshp_P); readL=shaperead(fnshp_L); readP=shaperead(fnshp_P); subplot(121);mapshow(readL);title('PolyLine of China') subplot(122);mapshow(readP);title('Polygon of China')
第二种方法使用geoshow+shapefile的方法:
%% geoshow+shapefile clc;clear;clf % shapefile中都包含了国界和省界 fnshp_L='E:\ChinaMap\国界与省界\bou2_4l.shp';%ShapeType: 'PolyLine' fnshp_P='E:\ChinaMap\国界与省界\bou2_4p.shp';%ShapeType: 'Polygon' readL=shaperead(fnshp_L);%该文件中没有每个省的名称 readP=shaperead(fnshp_P);%该文件中有每个省的名称 subplot(121);worldmap('China');geoshow(fnshp_L);title('PolyLine of China') subplot(122);worldmap('China');geoshow(fnshp_P);title('Polygon of China')绘制的图形如下:
注意如果上面没有加worldmap的命令,那么和第一种方法绘制出来的图形是一样的.
如果只想显示安徽省的,那么可以这样做:
%bbox=[114,29;120,35];%安徽的地理位置 %S = shaperead(fnshp_P,'BoundingBox',bbox); S = shaperead(fnshp_P); n=1; while (n>=1 && n<=numel(S)) sname=S(n).NAME; if ( ~strcmp(sname,'安徽省')) S(n)=[]; n=n-1; end n=n+1; end mapshow(S);显示的结果如下:
如果使用geoshow,最好将数据中(X,Y)坐标转为(lon,lat):
bbox=[114,29;120,35];%安徽的地理位置 S = shaperead(fnshp_P,'BoundingBox',bbox,'UseGeoCoords', true);%只读一部分数据 n=1; while (n>=1 && n<=numel(S)) sname=S(n).NAME; if ( ~strcmp(sname,'安徽省')) S(n)=[]; n=n-1; end n=n+1; end worldmap([29 35],[114 120]) %worldmap(latlim, lonlim) geoshow(S)绘制的地图为:
其实,上面的绘制任意省的地图方式还可以进一步简化:读取shapefile文件时使用'selector'选择你想要的省份就可以了:
S = shaperead(fnshp_P, 'UseGeoCoords', true,... 'Selector',{@(NAME) strcmp(NAME,'安徽省'), 'NAME'}); worldmap([29 35],[114 120]) %worldmap(latlim, lonlim) geoshow(S)
绘制的结果和上面的图是一样的.
有时我们希望修改地图的某些属性,例如投影方式,那么可是使用getm和setm来实现,请看下面的例子:
S = shaperead(fnshp_P, 'UseGeoCoords', true,'Selector',{@(NAME) strcmp(NAME,'安徽省'), 'NAME'}); wm=worldmap([29 35],[114 120]); %worldmap(latlim, lonlim) %getm(wm)%查看当期地图的所有属性 setm(wm,'mapprojection','eqacylin');%可以使用maps查看所有的地图投影方式 gs=geoshow(S);绘制的图形如下:
如果不想使用额外的shapefile绘图,matlab自带的shapefile也可:
wm=worldmap('world'); land=shaperead('landareas','UseGeoCoords',true); geoshow(wm,land,'FaceColor',[0.5 0.7 0.5]); lakes=shaperead('worldlakes','UseGeoCoords',true); geoshow(lakes,'FaceColor','blue'); rivers=shaperead('worldrivers','UseGeoCoords',true); geoshow(rivers,'Color','blue'); cities=shaperead('worldcities','UseGeoCoords',true); geoshow(cities,'Marker','.','Color','red');绘制的结果如下:
下面再给出一个例子:
maps %查看当前可用的地图投影方式 %% 导入数据,全球海岸线 load coast %% 绘图 axesm robinson patchm(lat,long,'g'); %% 设置属性 setm(gca);%查看当前可以设置的所有图形坐标轴(map axes)的属性 setm(gca,'Frame','on');%使框架可见 getm(gca,'Frame');%使用getm可以获取指定的图形坐标轴的属性 setm(gca,'Grid','on');%打开网格 setm(gca,'MLabelLocation',60);%标上经度刻度标签,每隔60度 setm(gca,'MeridianLabel','on');%设置经度刻度标签可见 setm(gca,'PLabelLocation',[-90:30:90])%标上经度刻度标签,[-90:30:90] setm(gca,'ParallelLabel','on');%设置经度刻度标签可见 setm(gca,'MLabelParallel','south');%将经度刻度标签放在南方,即下部 setm(gca,'Origin',[0,90,0]);%设置地图的中心位置和绕中心点和地心点的轴旋转角度[latitude longitude orientation]
绘制的图形如下: