主要内容

本页采用了机器翻译。点击此处可查看英文原文。

shaperead

从 shapefile 中读取矢量要素及其属性

说明

S = shaperead(filename) 读取由 filename 指定的 shapefile,并返回一个以投影地图坐标表示的地理数据结构体数组(一个 mapstruct)。地理数据结构结合了几何信息与要素属性信息。shaperead 支持常规的二维形状类型:'Point''Multipoint''PolyLine''Polygon'

示例

S = shaperead(filename,Name,Value) 根据名称-值对参数确定,返回 S 中 shapefile 内容的子集。使用 RecordNumbersBoundingBoxSelector 选择要读取的功能。若在同一调用中使用多个此类参数,则会得到符合各项规格的记录的交集。例如,若同时指定了 RecordNumbersBoundingBox 的值,则仅导入记录编号出现在列表中且边界框与指定边界框相交的特征。

若未指定任何参数,shaperead 将为每个非空特征返回一个条目,并为每个属性创建一个字段。

示例

[S,A] = shaperead(___) 返回一个 N×1 地理数据结构体数组 S,其中包含几何信息,以及一个并行的 N×1 属性结构体数组 A,其中包含要素属性信息。

示例

全部折叠

读取名为 concord_hydro_line.shp 的完整 shapefile 文件,包括 concord_hydro_line.dbf 中的属性。shaperead 函数返回一个 mapstruct,其坐标向量分别为 xy

S = shaperead('concord_hydro_line.shp')
S=237×1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    LENGTH

指定一个边界框以限制 shaperead 返回的数据。此外,请指定要读取的属性的名称。

bbox = [2.08 9.11; 2.09 9.12] * 1e5;
S = shaperead('concord_roads.shp','BoundingBox',bbox,...
              'Attributes',{'STREETNAME','CLASS'})
S=87×1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    STREETNAME
    CLASS

仅读取长度至少为 200 米的 4 级及以上道路路段的道路数据。请注意选择器中使用了匿名函数。

S = shaperead('concord_roads.shp','Selector',...
           {@(v1,v2) (v1 >= 4) && (v2 >= 200),'CLASS','LENGTH'})
S=115×1 struct array with fields:
    Geometry
    BoundingBox
    X
    Y
    STREETNAME
    RT_NUMBER
    CLASS
    ADMIN_TYPE
    LENGTH

确定每类道路的数量。

n = histcounts([S.CLASS],'BinLimits',[1 7],'BinMethod','integer')
n = 1×7

     0     0     0     7    93    15     0

显示每种长度类别中道路数量的直方图。

figure
histogram([S.LENGTH])

Figure contains an axes object. The axes object contains an object of type histogram.

使用名称-值对 `'UseGeoCoords'` 指定 shapefile 使用经纬度坐标。

例如,将 shapefile 的信息作为结构返回。通过查询 CoordinateReferenceSystem 字段,验证 shapefile 是否使用经纬度坐标。若字段包含 geocrs 对象,则 shapefile 将使用经纬度坐标。

info = shapeinfo('landareas.shp');
crs = info.CoordinateReferenceSystem
crs = 
  geocrs with properties:

             Name: "WGS 84"
            Datum: "World Geodetic System 1984"
         Spheroid: [1×1 referenceEllipsoid]
    PrimeMeridian: 0
        AngleUnit: "degree"

使用 shaperead 函数读取 shapefile。使用名称-值对 'UseGeoCoords' 标明该 shapefile 使用经纬度坐标。

S = shaperead('landareas.shp','UseGeoCoords',true)
S=537×1 struct array with fields:
    Geometry
    BoundingBox
    Lon
    Lat
    Name

请注意,shaperead 函数返回的地理数据结构包含纬度和经度字段(即 geostruct)。

输入参数

全部折叠

文件名,指定为字符串标量或字符向量。filename 指 shapefile 中某个组件文件的基础名称或完整名称。如果主文件(扩展名为 .shp)缺失,shaperead 将抛出错误。如果其他两个文件中的任何一个缺失,shaperead 将发出警告。

请确保您的计算机设置与要导入的数据采用相同的字符编码方案。例如,若您试图导入包含日文字符的 shapefile,请将您的计算机配置为支持 Shift-JIS 编码方案。

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'Attributes',{'STREETNAME','LENGTH'}

记录数,指定为逗号分隔对组,其中包含 'RecordNumbers' 和一个整数向量。使用参数 RecordNumbers 仅导入具有列出记录编号的特征。

数据类型: double

边界框,指定为逗号分隔对组,其中包含 'BoundingBox' 和一个 2×2 矩阵。BoundingBox 的形式为 [xmin,ymin;xmax,ymax](用于地图坐标)或 [lonmin,latmin;lonmax,latmax](用于地理坐标)。使用参数 BoundingBox 仅导入其边界框与指定边界框相交的特征。shaperead 函数不会修剪部分与边界框相交的特征。

数据类型: double

选择器,指定为由 'Selector' 和一个元胞数组组成的以逗号分隔的对,该元胞数组包含一个函数句柄和一个或多个属性名称。该函数必须返回一个 logical 标量。使用 Selector 参数仅导入那些对应属性值应用该函数后返回 true 的特征。有关函数句柄的更多信息,请参阅 创建函数句柄

属性名称,指定为逗号分隔对组,其中包含 'Attributes' 和一个属性名称元胞数组。使用参数 Attributes 包含列出的属性,并设置结构体数组中属性的顺序。使用 {} 可省略所有属性。

返回 shapefile 内容的 geostruct 标志,指定为由 'UseGeoCoords'falsetrue 组成的以逗号分隔的成对参数。

UseGeoCoords 设置为 true 时,shapefile 的内容将以 geostruct 格式返回。当您确定 shapefile 中的 x-y-坐标实际代表经纬度数据时,请使用此参数。

要确定 shapefile 是否使用经纬度数据,首先使用 shapeinfo 函数将 shapefile 信息作为结构体返回。然后查询该结构的 CoordinateReferenceSystem 字段。如果 CoordinateReferenceSystemgeocrs 对象,则 shapefile 使用地理坐标。

此代码演示了如何查询与 shapefile landareas.shp 关联的结构体中的 CoordinateReferenceSystem 字段。

info = shapeinfo('landareas.shp');
info.CoordinateReferenceSystem

输出参量

全部折叠

矢量地理特征,以 N×1 地理数据结构体数组形式返回,该数组为 shapefile 中每个非空空间特征包含一个元素。结构体数组包含以下字段:

字段描述
Geometry

形状类型,返回值为 'Point''Multipoint''Line''Polygon'

单个点、线和多边形可以包含多个部分。例如,线段可以包含不相连的线段,多边形可以包含环。个体形状的所有部分均共享由对应属性字段为该形状指定的属性。

当读取 PolyLine 形状时,shaperead 函数将返回该字段的值作为 'Line'

此函数不支持三维或测量形状类型(PointZ、PointM、MultipointZ、MultipointM、PolyLineZ、PolyLineM、PolygonZ、PolylineM 和 Multipatch)。该函数还会忽略空点形状。

BoundingBox

形状的最小和最大坐标值,以 2×2 数值矩阵形式返回,矩阵形式为 [min(X) min(Y); max(X) max(Y)]。当 Geometry'Point' 时,此字段不适用。

X

x 坐标,以数据类型为 double 的行向量形式返回。此字段仅适用于 mapstruct 数组。

Y

y 坐标,以数据类型为 double 的行向量形式返回。此字段仅适用于 mapstruct 数组。

Lon

经度坐标,以数据类型为 double 的行向量形式返回。此字段仅适用于地质结构体数组。

Lat

纬度坐标,以数据类型为 double 的行向量形式返回。此字段仅适用于地质结构体数组。

属性字段

属性字段,以字符向量或数值标量形式返回。

shaperead 函数从属性文件 (.dbf) 中确定属性字段的名称。shapefile 通常包含多个属性。如果属性名称不是有效的字段名称,则该函数会为字段分配不同的名称,通常通过将空格替换为下划线来实现。

默认情况下,shaperead 函数假定 shapefile 包含地图坐标,并将数据读取到 mapstruct 数组中。当您的 shapefile 包含地理坐标时,可通过将 UseGeoCoords 名称-值参数指定为 true,将数据读取到 geostruct 数组中。

有关地理数据结构、mapstruct 数组和 geostruct 数组的更多信息,请参阅Geographic Data Structures

特征属性信息,以与数组 S 对应的 N×1 属性结构体数组形式返回。

输出结构体数组 SA 中的字段取决于文件中包含的形状类型以及文件中包含的属性的名称和类型。shaperead 函数支持以下四种属性类型:numericfloating(在 MATLAB® 中以 double 类型存储)以及 characterdate(以 char array 类型存储)。

详细信息

全部折叠

提示

要获取与 shapefile 关联的坐标参考系 (CRS) 信息,请使用 shapeinfo 函数。

版本历史记录

在 R2006a 之前推出