{"id":46562,"date":"2018-01-04T00:00:00","date_gmt":"2018-01-04T08:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/geometry-data-application\/"},"modified":"2025-11-13T12:54:32","modified_gmt":"2025-11-13T20:54:32","slug":"geometry-data-application","status":"publish","type":"post","link":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/","title":{"rendered":"Geometry Data Application"},"content":{"rendered":"<h2 id=\"intro\">Introduction<\/h2>\n<p><a href=\"https:\/\/griddb.net\/newen\/docs\/documents\/1-2_griddb-edition.php\" title=\"GridDB SE Edition\">GridDB SE<\/a> brings support for spatial\/geometric data which can be useful for developers. We&#8217;ve already delved into some of the features in our <a href=\"https:\/\/griddb.net\/en\/blog\/using-geometry-values-griddb\/\" title=\"geometry columns in GridDB\">previous post<\/a> &#8212; we&#8217;re going to be demonstrating a few more real world examples in this one.<\/p>\n<p>Support for spatial\/geometric data means adding GEOMETRY column support and methods that allow developers to model and utilize many types of spatial data such as lines, shapes, and three-dimensional objects. Furthermore, these geometries can be created with points or equations. One of the most common domains for GIS (Geographic information systems) that use geometric data are for geographic applications; examples include geolocation, maps, and traffic systems. <\/p>\n<h2 id=\"spatial-query\">Creating Spatial Queries<\/h2>\n<p>A benefit that GEOMETRY columns can bring to modeling locations is providing many ways to filter for locations. In one example, the geometries used are <i>POINTS<\/i>, using the <i>ST_MBRIntersects()<\/i> TQL operation to find specific locations. For example, we use intersection queries to search for a point at 36.48 Latitude, 73.34 Longitude, and at 0.6 feet elevation above sea level. <\/p>\n<p>With geometry values, you can search for points within 3D volumes or 2D areas. Here these geometries can include quadratic surfaces, cubes, 3D objects, areas, and 3D geometric planes. GridDB offers filtering for all of these different types &#8212; all at once &#8212; with intersection functions in TQL.<\/p>\n<p>The most consistent way to check if any camera locations are within certain geometric range is by forming a <i>POLYHEDRALSURFACE<\/i>, then inserting that geometry into a TQL query. Begin by declaring the geometry in its <i>WKT<\/i> (Well-Known Text) form. Follow by checking if the geometry value intersects with the GEOMETRY-type column that you choose. You can convert the geometry text with the <i>ST_GeomFromText<\/i> operation. Let&#8217;s say you want to search for a camera that is located at 36.48&deg; Latitude, 73.34&deg; Longitude, and 16 ft. elevation. This location can be represented as: <code>POINT(36.48 73.34 16)<\/code>. Since the geometry is now established, you can issue the below TQL query.<\/p>\n<pre class=\"prettyprint\">\nSELECT * WHERE ST_MBRIntersects(geometry_column,ST_GeomFromText(\u00e2\u20ac\u02dcPOINT(36.48 73.34 16)\u00e2\u20ac\u2122))\n<\/pre>\n<h2 id=\"filter\">Filtering for Points or Areas<\/h2>\n<p>In these applications, the types of geometries used for querying were: <\/p>\n<ul id=\"geometry-types\" style=\"list-style: none;\">\n<li>&emsp;QUADRATICSURFACE<\/li>\n<li>&emsp;POINT<\/li>\n<li>&emsp;POLYGON<\/li>\n<li>&emsp;LINESTRING<\/li>\n<li>&emsp;POLYHEDRALSURFACE<\/li>\n<\/ul>\n<p>You should model individual locations or points with the <code>POINT<\/code> geometry.<\/p>\n<p>Geographic areas or 3D geometric planes can be modeled using a <code>POLYGON<\/code> geometry. <\/p>\n<p>On the other hand, 3D-objects like pyramids, cubes, and other polyhedrons can be used with <code>POLYHEDRALSURFACE<\/code>. Polyhedrons can be formed by creating each of its sides or faces in the <code>POLYGON<\/code> format. (All the sides must connect together to form a closed object). <\/p>\n<p>More complex surfaces or shapes can be created with <code>QUADRATICSURFACE<\/code> WKT or <code>ST_MakeQSF()<\/code> and <code>ST_QSFMBRIntersects()<\/code> TQL functions.<\/p>\n<h2 id=\"traffic-cameras\">Smart Traffic Cameras<\/h2>\n<p>In the first small program, <b>StreetLightApplication.java<\/b>, all the rows in our database represent street cameras. The initial container of this application will be a collection. The <code>@RowKey<\/code> will be a STRING id. Every row in this collection contains the location, installation date, id, and other information of each camera. <\/p>\n<p><b>Row Schema<\/b> (StreetCamera.java)<\/p>\n<pre class=\"prettyprint\">\npublic class StreetCamera {\n  @RowKey\n  public String cameraId;\n  public Geometry coordinates;\n  public Date installation;\n  public int carsSeen;\n  public int violations;\n  \/\/(snip)\n<\/pre>\n<p>When put into a real-world scenario, someone might be in charge of maintaining street cameras. This person may want to select cameras as a function of their location. This may translate to filtering for cameras that are in an exact location or within a geographic range or within an elevation range. Users might also want to create more complex spatial ranges that might not be easily visualized as squares or bounding boxes. All these different range queries can be executed using intersection statements.<\/p>\n<p><b>Sample Code<\/b><\/p>\n<pre class=\"prettyprint\">\nGeometry point = Geometry.valueOf(\"POINT(40.98 76.43 1.6)\");\ngeometryLogic.getSearchResults(point);\ngeometryLogic.searchZRange(0.8,0.3);\ngeometryLogic.searchArea(40,79,45,85,true);\ngeometryLogic.searchVolume(36,73,0.6,42,77,1.7,true);\n\/\/(snip)\ndouble matrix[] = {0.8,0,0,0,0,0.8,0,0,0,0,0.8,0,0,0,0,-1};\ngeometryLogic.searchQuadraticSurface(matrix,true);\n<\/pre>\n<h2 id=\"helper-functions\">Helper Functions<\/h2>\n<p>As you can see from the code above, there are some predefined helper functions used by a helper object called a <code>GeometryLogic<\/code>. This object takes in a <i>GridDB Collection<\/i> and one of its <i>Geometry<\/i> columns as inputs. From there this object will use one of its many functions to issue spatial queries on that container.<\/p>\n<p><b>Example Code<\/b><\/p>\n<pre class=\"prettyprint\">\nCollection&lt;String,StreetCamera&gt; streetCollection = gridstore.putCollection(\"TrafficApplication_101\",StreetCamera.class);\nGeometryLogic geometryLogic = new GeometryLogic(streetCollection,\"coordinates\");\n<\/pre>\n<p>Listed below are the class methods used by <b>GeometryLogic.java<\/b> that can be useful for issuing Geometry queries in GridDB. The details on their implementation and functionality are described in later sections.<\/p>\n<ul id=\"function-list\" style=\"list-style: none;\">\n<li>&emsp;formPoint()<\/li>\n<li>&emsp;searchArea()<\/li>\n<li>&emsp;searchVolume()<\/li>\n<li>&emsp;formSurfaceWkt()<\/li>\n<li>&emsp;searchXRange(), searchYRange(), searchZRange()<\/li>\n<li>&emsp;searchQuadraticSurface()<\/li>\n<li>&emsp;searchPlane()<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"search-points\">Searching for Points<\/h4>\n<p>The simplest query that might be made against a spatial database would be for points. Users may want to search for points with either 2 or 3 values &#8212; 2 values for two-dimensional points and 3 values for three-dimensional points. The method in <b>GeometryLogic.java<\/b> that uses this functionality is <code>formPoint()<\/code>.<\/p>\n<pre class=\"prettyprint\">\npublic Geometry formPoint(double x, double y){\n  String wkt = String.format(\"POINT(%.9f %.9f)\",x,y);\n  Geometry point = Geometry.valueOf(wkt);\n  return point;\n}\npublic Geometry formPoint(double x, double y, double z){\n  String wkt = String.format(\"POINT(%.9f %.9f %.9f)\",x,y,z);\n  Geometry point = Geometry.valueOf(wkt);\n  return point;\n}\n<\/pre>\n<h4 id=\"3d-range\">Setting up a 3D Spatial Range<\/h4>\n<p>For this application, there are no real limits as to how far a user can query for in the <i>x<\/i>, <i>y<\/i>, and <i>z<\/i> directions. Since <b>INF<\/b> and <b>-INF<\/b> values are not allowed in GridDB, we substitute them with <code>Double.MAX_VALUE<\/code> and <code>-1 * Double.MAX_VALUE<\/code> for the default minimum and maximum values respectively; the ranges can then be modified by the users at will. For example, if you want to search for cameras that have a latitude greater than the 35.5&deg;. The bounding box for your spatial range would have minimum x of 35.5 and have the maximum x, minimum x, minimum and maximum y, and minimum and maximum z values as their defaults. As stated before, bounding boxes are <code>POLYHEDRALSURFACE<\/code>. Its WKT form is <\/p>\n<ul>\n<li>1.79x<i>e<\/i><sup>308<\/sup> is the value for Double.MAX_VALUE)<\/li>\n<\/ul>\n<p><b>Example Bounding Box<\/b><\/p>\n<pre class=\"prettyprint\">\nPOLYHEDRALSURFACE(\n((35.5 -1.79e308 -1.79e308,35.5 1.79e308 -1.79e308,1.79e308 1.79e308 -1.79e308,1.79e308 -1.79e308 -1.79e308,35.5 -1.79e308 -1.79e308)),\n((35.5 -1.79e308 -1.79e308,35.5 1.79e308 -1.79e308,35.5 1.79e308 1.79e308,35.5 -1.79e308 1.79e308,35.5 -1.79e308 -1.79e308)),\n((35.5 -1.79e308 -1.79e308,1.79e308 -1.79e308 -1.79e308,1.79e308 -1.79e308 1.79e308,35.5 -1.79e308 1.79e308,35.5 -1.79e308 -1.79e308)),\n((1.79e308 1.79e308 1.79e308,1.79e308 -1.79e308 1.79e308,35.5 -1.79e308 1.79e308,35.5 1.79e308 1.79e308,1.79e308 1.79e308 1.79e308)),\n((1.79e308 1.79e308 1.79e308,1.79e308 -1.79e308 1.79e308,1.79e308 -1.79e308 -1.79e308,1.79e308 1.79e308 -1.79e308,1.79e308 1.79e308 1.79e308)),\n((1.79e308 1.79e308 1.79e308,1.79e308 1.79e308 -1.79e308,35.5 1.79e308 -1.79e308,35.5 1.79e308 1.79e308,1.79e308 1.79e308 1.79e308)))\n<\/pre>\n<p>There are many points to declare and organizing is a tedious task. The number of points to create this geometry is 30. In reality, you only really need 6 points. Luckily in this application, there is a class (located in GeometryLogic.java) with functions that can make this easier.<\/p>\n<pre class=\"prettyprint\">\npublic String formSurfaceWkt(double minX,double minY,double minZ,double maxX,double maxY,double maxZ){\n  String bottomFace = String.format(\"((%.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f))\",minX,minY,minZ,minX,maxY,minZ,maxX,maxY,minZ,maxX,minY,minZ,minX,minY,minZ);\n  String leftFace = String.format(\"((%.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f))\",minX,minY,minZ,minX,maxY,minZ,minX,maxY,maxZ,minX,minY,maxZ,minX,minY,minZ);\n  String frontFace = String.format(\"((%.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f, %.9f %.9f %.9f))\",minX,minY,minZ,maxX,minY,minZ,maxX,minY,maxZ,minX,minY,maxZ,minX,minY,minZ);\n  \/\/(snip)\n  String wkt =  \n String.format(\"POLYHEDRALSURFACE(%s,%s,%s,%s,%s,%s)\",bottomFace,leftFace,frontFace,topFace,rightFace,backFace);\n  return wkt;\n}\n<\/pre>\n<h4 id=\"query-range\">Querying an Axis Range<\/h4>\n<p>Sometimes even having to create a surface with 6 points can be tedious. Other methods that the <i>GeometryLogic<\/i> class in this application can be used for is to simply set limits on the x,y, or z axises. <\/p>\n<p>The function(s) <code>setXRange()<\/code>, <code>setYRange()<\/code>, or <code>setZRange()<\/code> can create spatial ranges with just one or two parameters. If you choose to use only one numerical value, you must specify an additional parameter in the form of an <i>enum<\/i> called <code>BoundingOption<\/code>. <\/p>\n<p><i>BoundingOptions<\/i> simply state whether the value should be set as a minimum or maximum for the bounding box. <code>BoundingOption.GREATER<\/code> means set the value as the range&#8217;s minimums. <code>BoundingOption.LESSER<\/code> means set the value as the range&#8217;s maximum. <\/p>\n<p>For example, if you want to select only street cameras that have a latitude of 32&deg; or greater, you would issue:<\/p>\n<pre class=\"prettyprint\">\nGeometryLogic geometryLogic = new GeometryLogic(collection,column);\ngeometryLogic.searchXRange(32,BoundingOption.GREATER);\n<\/pre>\n<p>If you want to select for cameras with latitudes of 32&deg; or lesser, issue: <\/p>\n<pre class=\"prettyprint\">\ngeometryLogic.searchXRange(32,BoundingOption.LESSER);\n<\/pre>\n<p>In the case you want to set the minimum and the maximum of a range, call the function with two numerical values. If you want to select only street cameras that are between 116&deg; and 132&deg; longitude, execute: <\/p>\n<pre class=\"prettyprint\">\ngeometryLogic.searchYRange(116.0,132.0);\n<\/pre>\n<pre class=\"prettyprint\">\npublic void searchXRange(double firstX, double secondX) {\n  Geometry box = Geometry.valueOf(\"LINESTRING(EMPTY)\");\n  if(firstX == secondX){\n    getSearchResults(box);\n    return;\n  }\n  double min = firstX;\n  double max = secondX;\n  if(firstX > secondX){\n    min = secondX;\n    max = firstX;\n  }\n  minY = min;\n  maxY = max;\n  box = formBoundingSurface(Dimension.THREE_DIMENSIONAL);\n  getSearchResults(box);\n  setInitialRanges();\n}\n<\/pre>\n<h4 id=\"2d-queries\">Two-Dimensional Areas<\/h4>\n<p>Users may also want to filter for cameras that are within certain geographic ranges. These ranges might be used to filter for areas like cities, counties, streets, etc. Let&#8217;s say we want to select all cameras that are in a city that are between 40&deg; and 45&deg; latitude and 79&deg; and 85&deg; longitude. <\/p>\n<pre class=\"prettyprint\">\ngeometryLogic.searchArea(40,79,45,85,true);\n<\/pre>\n<p>All that is needed to execute this search is to create the <code>POLYGON<\/code> shape for the intersection queries are 4 unique values. Those 4 values will be used to make the corners of the area. From there all the corners can be connected together to make the closed shape. The method that implements this is <code>formBoundingSquare()<\/code>.<\/p>\n<pre class=\"prettyprint\">\npublic String formBoundingSquare(double minX, double minY,  \n double maxX, double maxY){\n  String bottomLeft = String.format(\"%.9f %.9f\",minX,minY);\n  String bottomRight = String.format(\"%.9f %.9f\",maxX,minY);\n  String topLeft = String.format(\"%.9f %.9f\",minX,maxY);\n  String topRight = String.format(\"%.9f %.9f\",maxX,maxY);\n  String wkt =  String.format(\"POLYGON((%s,%s,%s,%s,%s))\",\n    bottomLeft,bottomRight,topRight,topLeft,bottomLeft);\n  return wkt;\n}\n<\/pre>\n<h4 id=\"planes\">Searching Against a Geometric Plane<\/h4>\n<p>There are times when areas need to be in three dimensions. They also may not be constrained to four sided squares. You may want to search for cameras in an area that could form a triangle and is limited to a certain height. In this example, the height will be 0.6.<\/p>\n<pre class=\"prettyprint\">\nList&lt;Double&gt; planePoints = new ArrayList&lt;Double&gt;();\n\nplanePoints.add(38.23);\nplanePoints.add(74.34);\nplanePoints.add(0.6);\nplanePoints.add(43.11);\nplanePoints.add(78.67);\nplanePoints.add(0.6);\nplanePoints.add(40.98);\nplanePoints.add(76.43);\nplanePoints.add(0.6);\n\nSystem.out.println();\ngeometryLogic.searchPlane(planePoints,Dimension.THREE_DIMENSIONAL,true);\n<\/pre>\n<pre class=\"prettyprint\">\npublic String formPlane(List&lt;Double&gt; points, Dimension dimension){\n  String polygon = \"POLYGON((\";\n  int stopIndex = 2;\n  if(dimension == Dimension.THREE_DIMENSIONAL){\n    stopIndex = 3;\n  }\n  double value;\n  \/\/(snip)\n    value = (double) points.get(i);\n  \/\/(snip)\n  return polygon;\n}\n<\/pre>\n<h4 id=\"quadratic\">Quadratic Queries<\/h4>\n<p>Generally the ranges that users may want to check against can be created by individual points. However, there will be times that the ranges may be formed by quadratic curves. As mentioned in the last post <a href=\"https:\/\/griddb.net\/newen\/blog\/using-geometry-values-griddb\/#quadraticsurface\" title=\"quadratic surfaces\">about Geometries<\/a>, all that is needed is a <b>16-element<\/b> matrix of numbers.<\/p>\n<p>The below function, <code>makeQSFTql()<\/code> forms a geometric-intersection TQL query. Its inputs take in the matrix of coefficients and uses them to help make a <code>QUADRATICSURFACE<\/code> geometry on-the-fly. This geometry is the one that will be used to test for intersections.<\/p>\n<pre class=\"prettyprint\">\npublic String formQSFTql(String column,double matrix[],boolean include){\n  int max = 16;\n  int stopIndex = matrix.length &gt; 16 ? max : matrix.length;\t\t\n  String wkt = \"\";\n  String exclude = include ? \" \" : \" NOT\";\n  \/\/(snip)\n      wkt += (String.valueOf(matrix[i]));\n  \/\/(snip)\n  }\n  String tql = String.format(\"%s %s \n ST_QSFMBRIntersects(ST_MakeQSF(%s),%s)\",  \n QUERY_PREFIX,exclude,wkt,column);\n  return tql;\n}\n<\/pre>\n<h2 id=\"building-zones\">Smart Buildings<\/h2>\n<p>The second program in the application folder deals with rooms in a building. All the rooms may have their own specific function that may need to be monitored. Some rooms that might have their own function in one area may relate to each other in some other area. One example could be a hotel suite building. Many rooms may share the same plumbing or electrical connections or circuitry. The way that these rooms intersect depend on how the building is laid out or what schematic is used. This makes being able to store spatial data and make spatial queries very useful. <\/p>\n<p><b>Row Schema<\/b> (SmartBuilding.java)<\/p>\n<pre class=\"prettyprint\">\npublic class SmartBuilding {\n  @RowKey\n  public String buildingId;\n  public Geometry layout;\n  public double volume;\n  public Date installation;\n  public String name;\n\/\/(snip)\n<\/pre>\n<p><b>Intersection Queries<\/b> (BuildingApplication.java)<\/p>\n<pre class=\"prettyprint\">\ngeometryLogic.searchVolume(0,5,0,5,0,5,true);\ngeometryLogic.searchXRange(-5,-2);\ngeometryLogic.searchArea(10,0,15,12,true);\ndouble matrix[] = {0.5,0,0,0,0.5,0,0,0,0.5,0,0,0,-1,0,0,0};\t\tgeometryLogic.searchQuadraticSurface(matrix,true);\n<\/pre>\n<h2 id=\"pipe-monitors\">IoT Pipe Monitors<\/h2>\n<p>Another small application that is provided is related to pipes. These pipes might be underground pipes that are monitored by a maintenance crew. The pipe geometries are represented as <code>LINESTRING<\/code> geometries. Data that could be relevant to these pipes might be their radius and their elevation below ground level. The row schema is located in <code>PipeMonitor.java<\/code><\/p>\n<p><b>Row Schema<\/b> (PipeMonitor.java)<\/p>\n<pre class=\"prettyprint\">\npublic class PipeMonitor {\n  @RowKey\n  public String id; \/\/ Sensor Tag and Container RowKey\n  public Geometry pipe; \/\/ Multi-Part Vector \n  public Date installation; \/\/ When the sensor was installed and first connected to GridDB\n  public double radius; \/\/ Radius of the pipe\n  public double elevation; \/\/ Location in reference to sea level\n<\/pre>\n<p>Now that the schema is defined, the GridDB collection can be inserted. From there, users can search for pipes that are within a certain area. They also are able to search for pipes by their individual geometries or elevations. <\/p>\n<p><b>Sample Queries<\/b><\/p>\n<pre class=\"prettyprint\">\nCollection&lt;String,PipeMonitor&gt; pipeCollection = gridstore.putCollection(name,PipeMonitor.class);\nQuery&lt;PipeMonitor&gt; apiQuery = pipeCollection.query(column,Geometry.valueOf(\"LINESTRING(1 1 1, 1 0 1, 1 0 0)\"),GeometryOperator.INTERSECT);\n\/\/(snip)\nString tql = \"SELECT * WHERE NOT ST_MBRIntersects(pipe,ST_GeomFromText('LINESTRING(7 2 0, 7 2 4)')) AND elevation &gt; -5.3\";\n<\/pre>\n<h2 id=\"camera-timeseries\">Traffic Camera Timeseries<\/h2>\n<p>This timeseries program uses Geometry values to represent areas of a camera&#8217;s image. Moreover, this container can be thought of containing the images that a camera has taken of traffic over time. Each row in this timeseries contains the timestamp of the image, the image&#8217;s url and its data, the Geometric area of traffic the image represents, the amount of cars in the image, and the elevation the image was taken at it. The row schema file is <code>TrafficCamera.java<\/code>.<\/p>\n<p><b>Row Schema<\/b><\/p>\n<pre class=\"prettyprint\">\npublic class TrafficCamera {\n  @RowKey\n  public Date timestamp;\n  public String id;\n  public String url;\n  public Geometry area;\n  public int cars;\n  public double elevation;\n  public Blob image;\n<\/pre>\n<p>Once all the <code>TimeSeries<\/code> rows have been inserted into GridDB, spatial queries can be made. Most of all, users will then create 2D areas to see any of the image&#8217;s areas that intersect.<\/p>\n<p><b>Intersection Queries<\/b><\/p>\n<pre class=\"prettyprint\">\nString name = \"CameraTs121\";\nTimeSeries&lt;TrafficCamera&gt; timeseries = gridstore.putTimeSeries(name,TrafficCamera.class);\nString tql = \"SELECT * WHERE ST_MBRIntersects(area,ST_GeomFromText('POLYGON((8 8, 9 8, 9 9, 8 9, 8 8))'))\";\nQuery&lt;TrafficCamera&gt; query = timeseries.query(tql);\n<\/pre>\n<h2 id=\"source-code\">Source Code<\/h2>\n<p>All the code used for this post is available for download below.<br \/>\n<a href=\"https:\/\/griddb.net\/en\/download\/18663\/\" title=\"source code\">geometry-sample.tar.gz<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We&#8217;ve already delved into some of the features in our previous post &#8212; we&#8217;re going to be demonstrating a few more real world examples in this one. Support for spatial\/geometric data means adding GEOMETRY column support and methods that allow developers [&hellip;]<\/p>\n","protected":false},"author":123,"featured_media":22058,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-46562","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Geometry Data Application | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We&#039;ve already delved into some of the features in our\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Geometry Data Application | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We&#039;ve already delved into some of the features in our\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-04T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-13T20:54:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/griddb.net\/wp-content\/uploads\/2018\/01\/blog_title_19.png\" \/>\n\t<meta property=\"og:image:width\" content=\"870\" \/>\n\t<meta property=\"og:image:height\" content=\"490\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Joshua Pascascio\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joshua Pascascio\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\"},\"author\":{\"name\":\"Joshua Pascascio\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/ca72185e9a3778df765a76313f789fd8\"},\"headline\":\"Geometry Data Application\",\"datePublished\":\"2018-01-04T08:00:00+00:00\",\"dateModified\":\"2025-11-13T20:54:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\"},\"wordCount\":1694,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2018\/01\/blog_title_19.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\",\"url\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\",\"name\":\"Geometry Data Application | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2018\/01\/blog_title_19.png\",\"datePublished\":\"2018-01-04T08:00:00+00:00\",\"dateModified\":\"2025-11-13T20:54:32+00:00\",\"description\":\"Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We've already delved into some of the features in our\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2018\/01\/blog_title_19.png\",\"contentUrl\":\"\/wp-content\/uploads\/2018\/01\/blog_title_19.png\",\"width\":870,\"height\":490},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/griddb.net\/en\/#website\",\"url\":\"https:\/\/griddb.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/griddb.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/griddb.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/griddb.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/ca72185e9a3778df765a76313f789fd8\",\"name\":\"Joshua Pascascio\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/872ef8be79cb5117c256feb4c279ac41b954bfba599d647db925185c449aff1c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/872ef8be79cb5117c256feb4c279ac41b954bfba599d647db925185c449aff1c?s=96&d=mm&r=g\",\"caption\":\"Joshua Pascascio\"},\"url\":\"https:\/\/griddb.net\/en\/author\/joshua\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Geometry Data Application | GridDB: Open Source Time Series Database for IoT","description":"Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We've already delved into some of the features in our","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/","og_locale":"en_US","og_type":"article","og_title":"Geometry Data Application | GridDB: Open Source Time Series Database for IoT","og_description":"Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We've already delved into some of the features in our","og_url":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2018-01-04T08:00:00+00:00","article_modified_time":"2025-11-13T20:54:32+00:00","og_image":[{"width":870,"height":490,"url":"https:\/\/griddb.net\/wp-content\/uploads\/2018\/01\/blog_title_19.png","type":"image\/png"}],"author":"Joshua Pascascio","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"Joshua Pascascio","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#article","isPartOf":{"@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/"},"author":{"name":"Joshua Pascascio","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/ca72185e9a3778df765a76313f789fd8"},"headline":"Geometry Data Application","datePublished":"2018-01-04T08:00:00+00:00","dateModified":"2025-11-13T20:54:32+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/"},"wordCount":1694,"commentCount":0,"publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2018\/01\/blog_title_19.png","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/","url":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/","name":"Geometry Data Application | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2018\/01\/blog_title_19.png","datePublished":"2018-01-04T08:00:00+00:00","dateModified":"2025-11-13T20:54:32+00:00","description":"Introduction GridDB SE brings support for spatial\/geometric data which can be useful for developers. We've already delved into some of the features in our","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb.net\/en\/blog\/geometry-data-application\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/blog\/geometry-data-application\/#primaryimage","url":"\/wp-content\/uploads\/2018\/01\/blog_title_19.png","contentUrl":"\/wp-content\/uploads\/2018\/01\/blog_title_19.png","width":870,"height":490},{"@type":"WebSite","@id":"https:\/\/griddb.net\/en\/#website","url":"https:\/\/griddb.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/griddb.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/griddb.net\/en\/#organization","name":"Fixstars","url":"https:\/\/griddb.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/ca72185e9a3778df765a76313f789fd8","name":"Joshua Pascascio","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/872ef8be79cb5117c256feb4c279ac41b954bfba599d647db925185c449aff1c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/872ef8be79cb5117c256feb4c279ac41b954bfba599d647db925185c449aff1c?s=96&d=mm&r=g","caption":"Joshua Pascascio"},"url":"https:\/\/griddb.net\/en\/author\/joshua\/"}]}},"_links":{"self":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/46562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/users\/123"}],"replies":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/comments?post=46562"}],"version-history":[{"count":1,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/46562\/revisions"}],"predecessor-version":[{"id":51254,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/46562\/revisions\/51254"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media\/22058"}],"wp:attachment":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media?parent=46562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/categories?post=46562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/tags?post=46562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}