主要内容

地理数据结构

Mapping Toolbox™软件提供了一种简单的显示、提取和操作矢量地图特征集合的方法地理数据结构

地理数据结构是一个MATLAB®结构数组,每个地理特征有一个元素。每个特性都由坐标和属性表示。保存地理坐标(纬度和经度)的地理数据结构称为geostruct,和一个保存地图坐标(投影x而且y)称为mapstruct.地理数据结构仅保存矢量特征,不能用于保存栅格数据(规则或地理定位的数据网格或图像)。

或者,您可以使用地理空间表来表示矢量数据。地理空间表包括表格时间表对象具有形状变量和属性变量。有关地理空间表的更多信息,请参见创建地理空间表

shapefile

地理数据结构最常在从形状文件导入矢量地理数据时产生。环境系统研究所为矢量地理数据设计了shapefile格式。shapefile编码点、多点、线或多边形的坐标,以及非几何属性。

shapefile将属性和坐标存储在单独的文件中;它由一个主文件、一个索引文件和一个xBASE文件组成。所有三个文件都具有相同的基名,并通过扩展名进行区分.shp.shx,.dbf,分别。(例如,给定基本名称“concord_roads”shapefile文件名为“concord_roads.shp”“concord_roads.shx”,“concord_roads.dbf”).

地理数据结构的内容

shaperead函数从shapefile中读取矢量特征和属性,并返回地理数据结构数组。的shapereadfunction在运行时从shapefile xBASE表或用户指定的可选参数中确定属性字段的名称。如果shapefile属性名不能直接用作字段名,shaperead为字段指定一个经过适当修改的名称,通常用下划线代替空格。

地理数据结构中的字段

字段名 数据类型 描述 评论

几何

特征向量

以下形状类型之一:“点”“多点”“行”,或“多边形”

对于一个“多线”的值几何Field很简单“行”

BoundingBox

2 × 2数值数组

以以下形式指定每个维度的最小和最大特征坐标值:

最小值 X 最小值 Y 马克斯 X 马克斯 Y

形状类型省略“点”

XY,或纬度

类的1 × n数组

坐标向量。

Attr

字符向量或标量数

属性名称、类型和值。

可选的。通常有多个属性。

shaperead函数金宝app支持任何3d或“测量”形状类型:“博”“PointM”“MultipointZ”“MultipointM”“PolyLineZ”“PolyLineM”“PolygonZ”“PolylineM”,或“Multipatch”.此外,虽然“零形状”特性可以在“点”“多点”“多线”,或“多边形”Shapefile,它们会被忽略。

多段线而且多边形形状

在地理数据结构中使用多边形几何图形,单个特征可以有多个部分-不连接的线段和多边形环。这些部件可以包括逆时针的内环,勾勒出“孔”。有关这方面的说明,请参见创建并显示多边形.类中的NaN将每个断开连接的部分与下一个部分分开X而且Y(或纬度而且)向量。您可以使用isShapeMultipart函数来确定一个特征是否具有nan分离的部分。

每个多点或nan分隔的多部分线或多边形实体构成单个特征,因此每个属性字段具有一个字符向量或标量双值。不可能将不同的属性分配给这样一个特性的不同部分;与geostruct或mapstruct一起导入(或随后添加到)的任何字符向量或数值属性组合应用于特性的所有部分。

Mapstructs和Geostructs

默认情况下,shaperead返回包含X而且Y字段。如果数据集坐标已经被投影(在地图坐标系统中),这是合适的。否则,如果数据集坐标是未投影的(在地理坐标系中),则使用参数-值对“UseGeoCoords”,真的为了使shaperead返回一个具有的地理结构而且纬度字段。

协调类型.如果你不知道一个shapefile使用的是地理坐标还是地图坐标,你可以试试下面这些方法:

  • 如果shapefile包含投影文件(.prj),使用shapeinfo获取坐标参考系的信息。如果CoordinateReferenceSystem返回结构的字段为aprojcrs对象,你有地图坐标。如果字段为ageocrs目标,你有地理坐标。

  • 如果shapefile不包括投影文件,请使用shapeinfo要获得BoundingBox.通过观察坐标的范围,你可以知道你有什么样的坐标。

  • 询问您的数据提供商。

geoshow函数显示存储在地理结构中的地理特征mapshow函数显示存储在mapstructs中的地理特征。如果您尝试使用geoshow时,函数发出警告并调用mapshow.如果您尝试使用mapshow时,函数将坐标投影为Plate Carree投影,并发出警告。

检查地理数据结构

下面是返回的未过滤mapstruct的示例shaperead

S = shaperead('concord_roads.shp')

回显如下:

S = 609x1结构数组,包含字段:Geometry BoundingBox X Y STREETNAME RT_NUMBER CLASS ADMIN_TYPE LENGTH

shapefile包含609个特征。除了几何BoundingBox,和坐标字段(X而且Y),有五个属性字段:STREETNAMERT_NUMBERADMIN_TYPE,长度

看第10个元素

(10)

回显如下:

ans = Geometry: 'Line' BoundingBox: [2x2 double] X: [1x9 double] Y: [1x9 double] STREETNAME: 'WRIGHT FARM' RT_NUMBER: " CLASS: 5 ADMIN_TYPE: 0 LENGTH: 79.0347

这个mapstruct包含“行”特性。第十行有九个顶点。前两个属性的值是字符向量。第二个恰巧是一个空字符向量。最后三个属性是数字的。跨越元素年代X而且Y可以有不同的长度,但是STREETNAME而且RT_NUMBER必须始终包含字符向量,和ADMIN_TYPE而且长度必须始终包含标量双精度。

在这个例子中,shaperead返回一个未经过滤的mapstruct。如果要过滤掉某些属性,请参见选择要读取的Shapefile数据获取更多信息。

如何构建地理数据结构

函数如shapereadgshhs导入矢量地理数据时返回地理结构。但是,在某些情况下,您可能希望自己创建geostruct或mapstruct。例如,你可能会进口矢量地理数据,没有存储在一个shapefile(例如,从mat文件,从微软®Excel®电子表格,或通过读入分隔文本文件)。你也有可能计算矢量地理数据和属性通过调用各种MATLAB或映射工具箱函数。在这两种情况下,坐标和其他数据通常是工作空间中的向量或矩阵。将变量打包到geostruct或mapstruct中可以更容易地映射和导出它们,因为地理数据结构比坐标数组提供了几个优点:

  • 所有相关的地理数据变量都打包在一个容器中,即一个结构数组。

  • 该结构通过其字段名进行自文档化。

  • 属性,可以根据点、线和多边形的属性值改变它们的映射符号symbolspec用于显示geostruct或mapstruct。

  • 结构元素和地理特征之间存在一对一的对应关系,这种对应关系延伸到的子元素hggroupmapshow而且geoshow

实现这些好处并不困难。使用以下示例作为指南,将导入或创建的矢量地理数据打包到地理数据结构中。

制作点线土工结构

下面的示例首先创建一个点地球结构,其中包含不同大陆上的三个城市,并对其进行绘图geoshow.然后,它创建了一个包含连接这些城市的大圆导航轨道数据的线地质结构。最后,它使用符号规范绘制这些行。

  1. 从一小组点数据开始,三个大陆上三个城市的大致纬度和经度:

    Latparis = 48.87084;Lonparis = 2.41306;%巴黎坐标latsant = -33.36907;Lonsant = -70.82851;%圣地亚哥latnyc = 40.69746;Lonnyc = -73.93008;%纽约市

  2. 建立一个点土工结构;它需要有以下必填字段:

    • 几何(在这种情况下)“点”

    • 纬度(对于点,这是一个标量双精度)

    • (对于点,这是一个标量双精度)

    按照惯例,第一个字段是Geometry(维数)。几何体对于所有元素都是一样的,用deal: [Cities(1:3)。Geometry] = deal('Point');在地球结构中添加经纬度:Cities(1)。Lat = latparis;(1)城市。朗= lonparis; Cities(2).Lat = latsant; Cities(2).Lon = lonsant; Cities(3).Lat = latnyc; Cities(3).Lon = lonnyc; % Add city names as City fields. You can name optional fields % anything you like other than Geometry, Lat, Lon, X, or Y. Cities(1).Name = 'Paris'; Cities(2).Name = 'Santiago'; Cities(3).Name = 'New York'; % Inspect your completed geostruct and its first member Cities Cities = 1x3 struct array with fields: Geometry Lat Lon Name Cities(1) ans = Geometry: 'Point' Lat: 48.8708 Lon: 2.4131 Name: 'Paris'

  3. 在存储在。中的地球陆地块的墨卡托投影上显示地球结构landareas.shpShapefile,设置地图限制以排除极地地区:

    axesm(“墨卡托”、“网格”,“上”,“MapLatLimit”,75 [-75]);tightmap;使用大陆轮廓绘制地球结构geoshow('landarea .shp') %使用填充圆形标记绘制城市位置geoshow(Cities,'Marker','o',…“MarkerFaceColor”、“c”,“MarkerEdgeColor”、“k”);使用geostruct字段Name中的数据显示城市名称。注意,必须将Name字段视为单元格数组。textm([城市(:). lat],[城市(:).Lon],…{城市(:). name},‘FontWeight’,‘大胆’);

    纽约,圣地亚哥和巴黎标在世界地图上

  4. 接下来,建造一个Line地构来包裹三城之间的大圆航路:

    调用新的geostruct Tracks,并给它一个直线几何形状:[Tracks(1:3)。Geometry] = deal('Line');创建一个文本字段,标识每个条目的轨道类型。这里它们都将是大圆,标识为'gc' %(某些函数使用的字符向量来表示大圆弧)trackType = 'gc';(跟踪。Type = deal(trackType);给每个轨道一个标识名称轨道(1)。名称= '巴黎-圣地亚哥';((1)。纬度Tracks(1).Lon] = ... track2(trackType,latparis,lonparis,latsant,lonsant); Tracks(2).Name = 'Santiago-New York'; [Tracks(2).Lat Tracks(2).Lon] = ... track2(trackType,latsant,lonsant,latnyc,lonnyc); Tracks(3).Name = 'New York-Paris'; [Tracks(3).Lat Tracks(3).Lon] = ... track2(trackType,latnyc,lonnyc,latparis,lonparis);

  5. 计算大圆轨道的长度:

    距离函数计算给定点之间的距离和方位角,以度为单位。将两者都存储在地质结构中。for j = 1:numel(Tracks) [dist az] =…距离(trackType,跟踪(j) . lat(1)……跟踪(j) .Lon(1)……跟踪(j) . lat(结束),…跟踪(j) .Lon(结束));(跟踪(j)。长度]= dist;(跟踪(j)。Azimuth] = az; end % Inspect the first member of the completed geostruct Tracks(1) ans = Geometry: 'Line' Type: 'gc' Name: 'Paris-Santiago' Lat: [100x1 double] Lon: [100x1 double] Length: 104.8274 Azimuth: 235.8143

  6. 绘制线路地质结构中的三条轨道:

    在墨卡托这样的圆柱形投影上,大圆轨道是弯曲的,除了那些沿着赤道或子午线的轨道。%通过创建符号规范在图形上区分轨道;%键线颜色跟踪长度,使用'summer'色图。符号规格可以很容易地通过属性值改变颜色和线条类型。您还可以指定默认符号。colorRange = makesymbolspec('Line',…{“长度”,[min ([Tracks.Length])…马克斯([Tracks.Length])],……“颜色”,冬季(3)});geoshow(追踪,SymbolSpec colorRange);

    同样的世界地图,纽约到巴黎,纽约到圣地亚哥,巴黎到圣地亚哥

    您可以通过调用将刚才创建的地理结构保存为shapefileshapewrite使用您选择的文件名,例如:

    shapewrite(城市、“citylocs”);shapewrite (, ' citytracks ');

制作多边形结构

为多边形数据创建geostruct或mapstruct类似于为点或线数据创建geostruct或mapstruct。但是,如果您的多边形包含多个nan分隔的部分,请记住,每个属性只能有一个值,而不是每个部分只能有一个值。在这样一个多边形的结构元素中放置的每个属性都属于它的所有部分。这意味着,如果您定义了一组岛屿,例如,每个坐标都有一个以nan分隔的列表,那么该元素的所有属性都将岛屿描述为一组,而不是特定的岛屿。如果希望将属性与特定的岛相关联,则必须为该岛提供不同的结构元素。

注意多边形顶点的顺序很重要。映射多边形数据时,遍历多边形的方向对于函数如何渲染多边形具有重要意义,例如geoshow而且mapshow.如果多边形包含孔洞,正确的方向性尤为重要。Mapping Toolbox约定以顺时针顺序编码外环的坐标(例如,大陆和岛屿轮廓);内环(如湖泊和内海)按逆时针顺序排列。在坐标数组中,每个环都通过NaN与它前面的环分开。

当用mapshowgeoshow,顺时针环填充。逆时针环为空环;任何潜在的符号都可以通过这些孔显示出来。为了确保外环和内环按照上述约定正确编码,可以调用以下函数:

  • ispolycw-如果多边形轮廓顶点是顺时针排列,则为True

  • poly2cw-转换多边形轮廓顺时针顺序

  • poly2ccw-将多边形轮廓转换为逆时针顺序

  • poly2fv-将多边形区域转换为面-顶点形式用于补丁为了正确地渲染包含孔的多边形

其中三个函数检查或更改定义多边形的顶点的顺序,第四个函数将带孔的多边形转换为完全不同的表示形式。

有关使用多边形结构的示例,请参见将海岸线数据(GSHHG)转换为Shapefile格式

映射的工具箱版本1显示结构

在版本2之前,引入geostructs和mapstructs时,在从某些外部格式导入地理数据时使用了不同的数据结构,以便将其封装为地图显示功能。这些显示结构容纳栅格和矢量地图数据和其他类型的对象,但缺乏当前用于表示矢量特征的geostructs和mapstructs的通用性,并且正在逐步退出工具箱。但是,您可以使用以下方法将包含矢量地理数据的显示结构转换为地理结构形式updategeostruct.有关版本1显示结构及其用法的更多信息,请参见版本1显示结构在参考页中displaym.附加信息在参考页updategeostruct

另请参阅

|

相关的话题