---
title: "Create, Construct, and Query geometry Instances | Microsoft Docs"
ms.date: "03/14/2017"
ms.prod: sql
ms.prod_service: "database-engine, sql-database"
ms.reviewer: ""
ms.technology:
ms.topic: conceptual
helpviewer_keywords:
- "planar spatial data [SQL Server], getting started"
- "geometry data type [SQL Server], getting started"
ms.assetid: c6b5c852-37d2-48d0-a8ad-e43bb80d6514
author: MladjoA
ms.author: mlandzic
monikerRange: "=azuresqldb-current||>=sql-server-2016||=sqlallproducts-allversions||>=sql-server-linux-2017||=azuresqldb-mi-current"
---
# Create, Construct, and Query geometry Instances
[!INCLUDE[appliesto-ss-asdb-xxxx-xxx-md](../../includes/appliesto-ss-asdb-xxxx-xxx-md.md)]
The planar spatial data type, **geometry**, represents data in a Euclidean (flat) coordinate system. This type is implemented as a common language runtime (CLR) data type in [!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)].
The **geometry** type is predefined and available in each database. You can create table columns of type **geometry** and operate on **geometry** data in the same manner as you would use other CLR types.
The **geometry** data type (planar) supported by [!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)] conforms to the Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0.
For more information on OGC specifications, see the following:
- [OGC Specifications, Simple Feature Access Part 1 - Common Architecture](https://go.microsoft.com/fwlink/?LinkId=93628)
- [OGC Specifications, Simple Feature Access Part 2 - SQL Options](https://go.microsoft.com/fwlink/?LinkId=93629)
[!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)] supports a subset of the existing GML 3.1 standard which is defined in the following schema: [https://schemas.microsoft.com/sqlserver/profiles/gml/SpatialGML.xsd](https://go.microsoft.com/fwlink/?LinkId=230959).
## Creating or constructing a new geometry instance
### Creating a New geometry Instance from an Existing Instance
The **geometry** data type provides numerous built-in methods you can use to create new **geometry** instances based on existing instances.
**To create a buffer around a geometry**
[STBuffer (geometry Data Type)](../../t-sql/spatial-geometry/stbuffer-geometry-data-type.md)
[BufferWithTolerance (geometry Data Type)](../../t-sql/spatial-geometry/bufferwithtolerance-geometry-data-type.md)
**To create a simplified version of a geometry**
[Reduce (geometry Data Type)](../../t-sql/spatial-geometry/reduce-geometry-data-type.md)
**To create the convex hull of a geometry**
[STConvexHull (geometry Data Type)](../../t-sql/spatial-geometry/stconvexhull-geometry-data-type.md)
**To create a geometry from the intersection of two geometries**
[STIntersection (geometry Data Type)](../../t-sql/spatial-geometry/stintersection-geometry-data-type.md)
**To create a geometry from the union of two geometries**
[STUnion (geometry Data Type)](../../t-sql/spatial-geometry/stunion-geometry-data-type.md)
**To create a geometry from the points where one geometry does not overlap another**
[STDifference (geometry Data Type)](../../t-sql/spatial-geometry/stdifference-geometry-data-type.md)
**To create a geometry from the points where two geometries do not overlap**
[STSymDifference (geometry Data Type)](../../t-sql/spatial-geometry/stsymdifference-geometry-data-type.md)
**To create an arbitrary Point instance that lies on an existing geometry**
[STPointOnSurface (geometry Data Type)](../../t-sql/spatial-geometry/stpointonsurface-geometry-data-type.md)
### Constructing a geometry Instance from Well-Known Text Input
The **geometry** data type provides several built-in methods that generate a geometry from the Open Geospatial Consortium (OGC) WKT representation. The WKT standard is a text string that allows geometry data to be exchanged in textual form.
**To construct any type of geometry instance from WKT input**
[STGeomFromText (geometry Data Type)](../../t-sql/spatial-geometry/stgeomfromtext-geometry-data-type.md)
[Parse (geometry Data Type)](../../t-sql/spatial-geometry/parse-geometry-data-type.md)
**To construct a geometry Point instance from WKT input**
[STPointFromText (geometry Data Type)](../../t-sql/spatial-geometry/stpointfromtext-geometry-data-type.md)
**To construct a geometry MultiPoint instance from WKT input**
[STMPointFromText (geometry Data Type)](../../t-sql/spatial-geometry/stmpointfromtext-geometry-data-type.md)
**To construct a geometry LineString instance from WKT input**
[STLineFromText (geometry Data Type)](../../t-sql/spatial-geometry/stlinefromtext-geometry-data-type.md)
**To construct a geometry MultiLineString instance from WKT input**
[STMLineFromText (geometry Data Type)](../../t-sql/spatial-geometry/stmlinefromtext-geometry-data-type.md)
**To construct a geometry Polygon instance from WKT input**
[STPolyFromText (geometry Data Type)](../../t-sql/spatial-geometry/stpolyfromtext-geometry-data-type.md)
**To construct a geometry MultiPolygon instance from WKT input**
[STMPolyFromText (geometry Data Type)](../../t-sql/spatial-geometry/stmpolyfromtext-geometry-data-type.md)
**To construct a geometry GeometryCollection instance from WKT input**
[STGeomCollFromText (geometry Data Type)](../../t-sql/spatial-geometry/stgeomcollfromtext-geometry-data-type.md)
### Constructing a geometry Instance from Well-Known Binary Input
WKB is a binary format specified by the Open Geospatial Consortium (OGC) that permits **geometry** data to be exchanged between a client application and an SQL database. The following functions accept WKB input to construct geometries:
**To construct any type of geometry instance from WKB input**
[STGeomFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stgeomfromwkb-geometry-data-type.md)
**To construct a geometry Point instance from WKB input**
[STPointFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stpointfromwkb-geometry-data-type.md)
**To construct a geometry MultiPoint instance from WKB input**
[STMPointFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stmpointfromwkb-geometry-data-type.md)
**To construct a geometry LineString instance from WKB input**
[STLineFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stlinefromwkb-geometry-data-type.md)
**To construct a geometry MultiLineString instance from WKB input**
[STMLineFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stmlinefromwkb-geometry-data-type.md)
**To construct a geometry Polygon instance from WKB input**
[STPolyFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stpolyfromwkb-geometry-data-type.md)
**To construct a geometry MultiPolygon instance from WKB input**
[STMPolyFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stmpolyfromwkb-geometry-data-type.md)
**To construct a geometry GeometryCollection instance from WKB input**
[STGeomCollFromWKB (geometry Data Type)](../../t-sql/spatial-geometry/stgeomcollfromwkb-geometry-data-type.md)
### Constructing a geometry Instance from GML Text Input
The **geometry** data type provides a method that generates a **geometry** instance from GML, an XML representation of geometric objects. [!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)] supports a subset of GML.
**To construct any type of geometry instance from GML input**
[GeomFromGml (geometry Data Type)](../../t-sql/spatial-geometry/geomfromgml-geometry-data-type.md)
## Returning Well-Known Text and Well-Known Binary from a geometry Instance
You can use the following methods to return either the WKT or WKB format of a **geometry** instance:
**To return the WKT representation of a geometry instance**
[STAsText (geometry Data Type)](../../t-sql/spatial-geometry/stastext-geometry-data-type.md)
[ToString (geometry Data Type)](../../t-sql/spatial-geometry/tostring-geometry-data-type.md)
**To return the WKT representation of a geometry instance including any Z and M values**
[AsTextZM (geometry Data Type)](../../t-sql/spatial-geometry/astextzm-geometry-data-type.md)
**To return the WKB representation of a geometry instance**
[STAsBinary (geometry Data Type)](../../t-sql/spatial-geometry/stasbinary-geometry-data-type.md)
**To return a GML representation of a geometry instance**
[AsGml (geometry Data Type)](../../t-sql/spatial-geometry/asgml-geometry-data-type.md)
## Querying the Properties and Behaviors of geometry Instances
All **geometry** instances have a number of properties that can be retrieved through methods that [!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)] provides. The following topics define the properties and behaviors of geometry types, and the methods for querying each one.
### Validity, Instance Type, and GeometryCollection Information
Once a **geometry** instance is constructed, you can use the following methods to determine if it is well-formed, return the instance type, or, if it is a collection instance, return a specific **geometry** instance.
**To return the instance type of a geometry**
[STGeometryType (geometry Data Type)](../../t-sql/spatial-geometry/stgeometrytype-geometry-data-type.md)
**To determine if a geometry is a given instance type**
[InstanceOf (geometry Data Type)](../../t-sql/spatial-geometry/instanceof-geometry-data-type.md)
**To determine if a geometry instance is well-formed for its instance type**
[STIsValid (geometry Data Type)](../../t-sql/spatial-geometry/stisvalid-geometry-data-type.md)
**To convert a geometry instance to a well-formed geometry instance with an instance type**
[MakeValid (geometry Data Type)](../../t-sql/spatial-geometry/makevalid-geometry-data-type.md)
**To return the number of geometries in a geometry collection instance**
[STNumGeometries (geometry Data Type)](../../t-sql/spatial-geometry/stnumgeometries-geometry-data-type.md)
To return a specific geometry in a geometry collection instance
[STGeometryN (geometry Data Type)](../../t-sql/spatial-geometry/stgeometryn-geometry-data-type.md)STGeometryN (geometry Data type)
### Number of Points
All nonempty **geometry** instances are comprised of *points*. These points represent the X- and Y-coordinates of the plane on which the geometries are drawn. **geometry** provides numerous built-in methods for querying the points of an instance.
**To return the number of points that comprise an instance**
[STNumPoints (geometry Data Type)](../../t-sql/spatial-geometry/stnumpoints-geometry-data-type.md)
**To return a specific point in an instance**
[STPointN](../../t-sql/spatial-geometry/stpointn-geometry-data-type.md)
**To return an arbitrary point that lies on an instance**
[STPointOnSurface](../../t-sql/spatial-geometry/stpointonsurface-geometry-data-type.md)
**To return the start point of an instance**
[STStartPoint](../../t-sql/spatial-geometry/ststartpoint-geometry-data-type.md)
**To return the end point of an instance**
[STEndpoint](../../t-sql/spatial-geometry/stendpoint-geometry-data-type.md)
**To return the X-coordinate of a Point instance**
[STX (geometry Data Type)](../../t-sql/spatial-geometry/stx-geometry-data-type.md)
**To return the Y-coordinate of a Point instance**
[STY](../../t-sql/spatial-geometry/sty-geometry-data-type.md)
**To return the geometric center point of a Polygon, CurvePolygon, or MultiPolygon instance**
[STCentroid](../../t-sql/spatial-geometry/stcentroid-geometry-data-type.md)
### Dimension
A nonempty **geometry** instance can be 0-, 1-, or 2-dimensional. Zero-dimensional **geometries**, such as **Point** and **MultiPoint**, have no length or area. One-dimensional objects, such as **LineString, CircularString, CompoundCurve**, and **MultiLineString**, have length. Two-dimensional instances, such as **Polygon**, **CurvePolygon**, and **MultiPolygon**, have area and length. Empty instances will report a dimension of -1, and a **GeometryCollection** will report an area dependent on the types of its contents.
**To return the dimension of an instance**
[STDimension](../../t-sql/spatial-geometry/stdimension-geometry-data-type.md)
**To return the length of an instance**
[STLength](../../t-sql/spatial-geometry/stlength-geometry-data-type.md)
**To return the area of an instance**
[STArea](../../t-sql/spatial-geometry/starea-geometry-data-type.md)
### Empty
An _empty_**geometry** instance does not have any points. The length of empty **LineString, CircularString**, **CompoundCurve**, and **MultiLineString** instances is zero. The area of empty **Polygon**, **CurvePolygon**, and **MultiPolygon** instances is 0.
**To determine if an instance is empty**
[STIsEmpty](../../t-sql/spatial-geometry/stisempty-geometry-data-type.md).
### Simple
For a **geometry** of the instance to be *simple*, it must meet both of these requirements:
- Each figure of the instance must not intersect itself, except at its endpoints.
- No two figures of the instance can intersect each other at a point that is not in both of their boundaries.
> [!NOTE]
> Empty geometries are always simple.
**To determine if an instance is simple**
[STIsSimple](../../t-sql/spatial-geometry/stissimple-geometry-data-type.md).
### Boundary, Interior, and Exterior
The *interior* of a **geometry** instance is the space occupied by the instance, and the *exterior* is the space not occupied it.
*Boundary* is defined by the OGC as follows:
- **Point** and **MultiPoint** instances do not have a boundary.
- **LineString** and **MultiLineString** boundaries are formed by the start points and end points, removing those that occur an even number of times.
```sql
DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');
SELECT @g.STBoundary().ToString();
```
The boundary of a **Polygon** or **MultiPolygon** instance is the set of its rings.
```sql
DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');
SELECT @g.STBoundary().ToString();
```
**To return the boundary of an instance**
[STBoundary](../../t-sql/spatial-geometry/stboundary-geometry-data-type.md)
### Envelope
The *envelope* of a **geometry** instance, also known as the *bounding box*, is the axis-aligned rectangle formed by the minimum and maximum (X,Y) coordinates of the instance.
**To return the envelope of an instance**
[STEnvelope](../../t-sql/spatial-geometry/stenvelope-geometry-data-type.md)
### Closure
A _closed_**geometry** instance is a figure whose start points and end points are the same. **Polygon** instances are considered closed. **Point** instances are not closed.
A ring is a simple, closed **LineString** instance.
**To determine if an instance is closed**
[STIsClosed](../../t-sql/spatial-geometry/stisclosed-geometry-data-type.md)
**To determine if an instance is a ring**
[STIsRing](../../t-sql/spatial-geometry/stisring-geometry-data-type.md)
**To return the exterior ring of a Polygon instance**
[STExteriorRing](../../t-sql/spatial-geometry/stexteriorring-geometry-data-type.md)
**To return the number of interior rings in a Polygon**
[STNumInteriorRing](../../t-sql/spatial-geometry/stnuminteriorring-geometry-data-type.md)
**To return a specified interior ring of a Polygon**
[STInteriorRingN](../../t-sql/spatial-geometry/stinteriorringn-geometry-data-type.md)
### Spatial Reference ID (SRID)
The spatial reference ID (SRID) is an identifier specifying which coordinate system the **geometry** instance is represented in. Two instances with different SRIDs are incomparable.
**To set or return the SRID of an instance**
[STSrid](../../t-sql/spatial-geometry/stsrid-geometry-data-type.md)
> [!NOTE]
> This property can be modified.
## Determining Relationships between geometry Instances
The **geometry** data type provides many built-in methods you can use to determine relationships between two **geometry** instances.
**To determine if two instances comprise the same point set**
[STEquals](../../t-sql/spatial-geometry/stequals-geometry-data-type.md)
**To determine if two instances are disjoint**
[STDisjoint](../../t-sql/spatial-geometry/stdisjoint-geometry-data-type.md)
**To determine if two instances intersect**
[STIntersects](../../t-sql/spatial-geometry/stintersects-geometry-data-type.md)
**To determine if two instances touch**
[STTouches](../../t-sql/spatial-geometry/sttouches-geometry-data-type.md)
**To determine if two instances overlap**
[STOverlaps](../../t-sql/spatial-geometry/stoverlaps-geometry-data-type.md)
**To determine if two instances cross**
[STCrosses](../../t-sql/spatial-geometry/stcrosses-geometry-data-type.md)
**To determine if one instance is within another**
[STWithin](../../t-sql/spatial-geometry/stwithin-geometry-data-type.md)
**To determine if one instance contains another**
[STContains](../../t-sql/spatial-geometry/stcontains-geometry-data-type.md)
**To determine if one instance overlaps another**
[STOverlaps](../../t-sql/spatial-geometry/stoverlaps-geometry-data-type.md)
**To determine if two instances are spatially related**
[STRelate](../../t-sql/spatial-geometry/strelate-geometry-data-type.md)
**To determine the shortest distance between points in two geometries**
[STDistance](../../t-sql/spatial-geometry/stdistance-geometry-data-type.md)
## geometry Instances Default to Zero SRID
The default SRID for **geometry** instances in [!INCLUDE[ssNoVersion](../../includes/ssnoversion-md.md)] is 0. With **geometry** spatial data, the specific SRID of the spatial instance is not required to perform calculations; thus, instances can reside in undefined planar space. To indicate undefined planar space in the calculations of **geometry** data type methods, the [!INCLUDE[ssDEnoversion](../../includes/ssdenoversion-md.md)] uses SRID 0.
## Examples
The following two examples show how to add and query geometry data.
### Example A.
This example creates a table with an identity column and a `geometry` column `GeomCol1`. A third column renders the `geometry` column into its Open Geospatial Consortium (OGC) Well-Known Text (WKT) representation, and uses the `STAsText()` method. Two rows are then inserted: one row contains a `LineString` instance of `geometry`, and one row contains a `Polygon` instance.
```sql
IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL
DROP TABLE dbo.SpatialTable;
GO
CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeomCol1 geometry,
GeomCol2 AS GeomCol1.STAsText()
);
GO
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
GO
```
### Example B.
This example uses the `STIntersection()` method to return the points where the two previously inserted `geometry` instances intersect.
```sql
DECLARE @geom1 geometry;
DECLARE @geom2 geometry;
DECLARE @result geometry;
SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;
SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;
SELECT @result = @geom1.STIntersection(@geom2);
SELECT @result.STAsText();
```
## See Also
[Spatial Data (SQL Server)](../../relational-databases/spatial/spatial-data-sql-server.md)