Main Content


Read vector features and attributes from shapefile



S = shaperead(filename) reads the shapefile, filename, and returns an N-by-1 geographic data structure array in projected map coordinates (a mapstruct). The geographic data structure combines geometric and feature attribute information. shaperead supports the ordinary 2-D shape types: 'Point', 'Multipoint', 'PolyLine', and 'Polygon'.


S = shaperead(filename,Name,Value) returns a subset of the shapefile contents in S, as determined by the name-value pair arguments. Use RecordNumbers, BoundingBox, and Selector to select which features to read. If you use more than one of these parameters in the same call, you receive the intersection of the records that match the individual specifications. For instance, if you specify values for both RecordNumbers and BoundingBox, you import only those features with record numbers that appear in your list and that also have bounding boxes intersecting the specified bounding box.

If you do not specify any parameters, shaperead returns an entry for every non-null feature and creates a field for every attribute.

[S,A] = shaperead(___) returns an N-by-1 geographic data structure array, S, containing geometric information, and a parallel N-by-1 attribute structure array, A, containing feature attribute information.


collapse all

Read the entire shapefile called concord_hydro_line.shp, including the attributes in concord_hydro_line.dbf. The shaperead function returns a mapstruct with x and y coordinate vectors.

S = shaperead('concord_hydro_line.shp')
S=237×1 struct array with fields:

Specify a bounding box to limit the data returned by shaperead . In addition, specify the names of the attributes you want to read.

bbox = [2.08 9.11; 2.09 9.12] * 1e5;
S = shaperead('concord_roads.shp','BoundingBox',bbox,...
S=87×1 struct array with fields:

Read road data only for class 4 and higher road segments that are at least 200 meters in length. Note the use of an anonymous function in the selector.

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

Determine the number of roads of each class.

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

     0     0     0     7    93    15     0

Display a histogram of the number of roads that fall in each category of length.


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

Specify that a shapefile uses latitude and longitude coordinates using the 'UseGeoCoords' name-value pair.

For instance, return information about a shapefile as a structure. Verify the shapefile uses latitude and longitude coordinates by querying the CoordinateReferenceSystem field. The shapefile uses latitude and longitude coordinates if the field contains a geocrs object.

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

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

Read the shapefile by using the shaperead function. Indicate that the shapefile uses latitude and longitude coordinates using the 'UseGeoCoords' name-value pair.

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

Note that the shaperead function returns a geographic data structure with latitude and longitude fields (a geostruct).

Input Arguments

collapse all

File name, specified as a string scalar or character vector. filename refers to the base name or full name of one of the component files in a shapefile. If the main file (with extension .shp) is missing, shaperead throws an error. If either of the other files is missing, shaperead issues a warning.

Make sure that your machine is set to the same character encoding scheme as the data you are importing. For example, if you are trying to import a shapefile that contains Japanese characters, configure your machine to support the Shift-JIS encoding scheme.

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: 'Attributes',{'STREETNAME','LENGTH'}

Record numbers, specified as the comma-separated pair consisting of 'RecordNumbers' and a vector of integers. Use the parameter RecordNumbers to import only features with listed record numbers.

Data Types: double

Bounding box, specified as the comma-separated pair consisting of 'BoundingBox' and a 2-by-2 matrix. BoundingBox has the form [xmin,ymin;xmax,ymax], for map coordinates, or [lonmin,latmin;lonmax,latmax] for geographic coordinates. Use the parameter BoundingBox to import only features whose bounding boxes intersect the specified box. The shaperead function does not trim features that partially intersect the box.

Data Types: double

Selector, specified as the comma-separated pair consisting of 'Selector' and a cell array containing a function handle and one or more attribute names. The function must return a logical scalar. Use the Selector parameter to import only features for which the function, when applied to the corresponding attribute values, returns true. For more information about function handles, see Create Function Handle.

Attribute names, specified as the comma-separated pair consisting of 'Attributes' and a cell array of attribute names. Use the parameter Attributes to include listed attributes and set the order of attributes in the structure array. Use {} to omit all attributes.

Flag to return shapefile contents in a geostruct, specified as the comma-separated pair consisting of 'UseGeoCoords' and false or true.

When UseGeoCoords is set to true, the shapefile contents are returned in a geostruct. Use this parameter when you know that the x- and y- coordinates in the shapefile actually represent longitude and latitude data.

To determine whether a shapefile uses latitude and longitude data, first use the shapeinfo function to return information about the shapefile as a structure. Then query the CoordinateReferenceSystem field of the structure. The shapefile uses geographic coordinates if CoordinateReferenceSystem is a geocrs object.

This code shows how to query the CoordinateReferenceSystem field of a structure associated with the shapefile landareas.shp.

info = shapeinfo('landareas.shp');

Output Arguments

collapse all

Vector geographic features, returned as an N-by-1 map geographic data structure array. Unless UseGeoCoords is true, S is a mapstruct and contains an element for each non-null, spatial feature in the shapefile.

Feature attribute information, returned as an N-by-1 attribute structure array corresponding to array S.

The fields in the output structure arrays S and A depend on the type of shape contained in the file and the names and types of attributes included in the file. The shaperead function supports the following four attribute types: numeric and floating (stored as type double in MATLAB®) and character and date (stored as char array).


To get information about the coordinate reference system (CRS) associated with a shapefile, use the shapeinfo function.

Version History

Introduced before R2006a