{"id":55036,"date":"2026-02-26T16:10:10","date_gmt":"2026-02-27T00:10:10","guid":{"rendered":"https:\/\/griddb.net\/?p=55036"},"modified":"2026-03-30T11:10:20","modified_gmt":"2026-03-30T18:10:20","slug":"precision-agriculture-with-griddb","status":"publish","type":"post","link":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/","title":{"rendered":"Precision Agriculture with GridDB"},"content":{"rendered":"<h2><strong>Introduction<\/strong><\/h2>\n<p>As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and real-time data analytics, offers a solution by optimizing crop management through actionable insights. However, traditional relational databases struggle with the velocity and volume of agricultural time-series data, creating performance bottlenecks when farmers need immediate analysis of crop conditions, weather patterns, and soil metrics.<\/p>\n<p>GridDB&#8217;s specialized time-series architecture addresses these challenges through efficient storage, high-speed ingestion, and optimized query performance for temporal data patterns. Its ability to handle mixed-frequency sensor data\u2014from hourly weather readings to daily satellite imagery\u2014makes it particularly well-suited for agricultural monitoring systems.<\/p>\n<p>This article explores a simple Spring Boot application that leverages GridDB Cloud to monitor crop health predicatively. Our implementation integrates real-time weather data from NASA&#8217;s POWER API, stores environmental time-series in GridDB, and exposes analytics through REST APIs for dashboard visualization.<\/p>\n<h2>Time-Series Database Requirements for Agricultural IoT<\/h2>\n<p>An ideal time-series database platform must efficiently ingest, store, and analyze data from diverse sources to enable data-driven decisions in crop health monitoring, irrigation management, and yield prediction. Meeting these demands involves addressing several critical data characteristics and infrastructure requirements, such as:<\/p>\n<ul>\n<li><strong>High Cardinality<\/strong>\n<ul>\n<li>Numerous unique time series generated by varied sensor types, farm locations, and devices.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Multi-Frequency Data Streams<\/strong>\n<ul>\n<li><strong>Environmental sensors<\/strong>: Updates every 15 minutes.<\/li>\n<li><strong>Weather APIs<\/strong>: Typically provide hourly updates.<\/li>\n<li><strong>Satellite imagery<\/strong>: Collected daily or at intervals of 1 to 7 days.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Sensor Metrics<\/strong>\n<ul>\n<li>Each sensor point typically captures <strong>four distinct metrics<\/strong> (e.g., temperature, humidity, soil moisture, and light intensity).<\/li>\n<\/ul>\n<\/li>\n<li><strong>Ingestion Volume<\/strong>\n<ul>\n<li><strong>Per farm<\/strong>:\n<ul>\n<li>100 sensors \u00d7 4 metrics \u00d7 96 readings\/day = <strong>~38,400 records daily<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Across 500+ farms<\/strong>:\n<ul>\n<li>500 farms \u00d7 ~38.4K records = <strong>~19 million inserts per day<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Timestamp Precision<\/strong>\n<ul>\n<li>Data is recorded with <strong>microsecond-level precision<\/strong> to support fine-grained temporal analysis.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Query and Storage Requirements<\/strong>\n<ul>\n<li>Optimized for frequent time-based queries (e.g., daily or weekly trends).<\/li>\n<li>Requires efficient data compression and long-term retention strategies to manage continuous high-volume ingestion.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>These patterns demand a robust time-series database like <strong>GridDB<\/strong>, designed to handle high-ingest rates, granular timestamps, and complex queries, all essential for scalable agricultural IoT solutions.<\/p>\n<h4>Project Overview: Building the Predictive Crop Health Monitoring Farmers<\/h4>\n<p>In this project, we focus on real-time crop health monitoring by processing environmental data and displaying important insights through visual dashboards, built with Spring Boot, GridDB Cloud, Thymeleaf, and Chart.js.<\/p>\n<h3><strong>System Workflow<\/strong><\/h3>\n<ol>\n<li><strong>Collection<\/strong>\n<ul>\n<li>Fetches environmental metrics from NASA&#8217;s POWER API.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Storage<\/strong>\n<ul>\n<li>Stores data in GridDB using a time-series model (<code>CropHealthData<\/code> container).<\/li>\n<\/ul>\n<\/li>\n<li><strong>Analysis<\/strong>\n<ul>\n<li>Processes raw data into actionable stress indicators using <code>CropHealthService<\/code><\/li>\n<\/ul>\n<\/li>\n<li><strong>Visualization<\/strong>\n<ul>\n<li>Displays daily, weekly, and monthly trends on a web-based dashboard.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>Setting Up GridDB Cluster and Spring Boot Integration<\/h2>\n<h3><strong>Project Structure<\/strong><\/h3>\n<p>Here&#8217;s a suggested project structure for this application:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">\n\u251c\u2500\u2500 pom.xml\n\u251c\u2500\u2500 src\n\u2502   \u251c\u2500\u2500 main\n\u2502   \u2502   \u251c\u2500\u2500 java\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 mycode\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 controller\n\u2502   \u2502   \u2502       \u2502   \u2514\u2500\u2500 CropHealthController.java\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 dto\n\u2502   \u2502   \u2502       \u2502   \u2514\u2500\u2500 CropHealthData.java\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 MySpringBootApplication.java\n\u2502   \u2502   \u2502       \u2514\u2500\u2500 service\n\u2502   \u2502   \u2502           \u251c\u2500\u2500 CollectionService.java\n\u2502   \u2502   \u2502           \u251c\u2500\u2500 CropHealthService.java\n\u2502   \u2502   \u2502           \u2514\u2500\u2500 RestTemplateConfig.java\n\u2502   \u2502   \u2514\u2500\u2500 resources\n\u2502   \u2502       \u251c\u2500\u2500 application.properties\n\u2502   \u2502       \u2514\u2500\u2500 templates\n\u2502   \u2502           \u2514\u2500\u2500 dashboard.html\n<\/code><\/pre>\n<\/div>\n<p>This structure separates controllers, models, repositories, services, and the application entry point into distinct layers, enhancing modularity and maintainability. It can be further customized based on individual requirements.<\/p>\n<h3><strong>Set Up GridDB Cloud<\/strong><\/h3>\n<p>For this exercise, we will be using GridDB Cloud vesion. Start by visiting the <a href=\"https:\/\/griddb.net\/en\/\">GridDB Cloud<\/a> portal and <a href=\"https:\/\/form.ict-toshiba.jp\/download_form_griddb_cloud_freeplan_e?utm_source=griddbnet&#038;utm_medium=topbanner\">signing up<\/a> for an account.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/03\/logo.png\"><img fetchpriority=\"high\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/03\/logo.png\" alt=\"\" width=\"1280\" height=\"149\" class=\"aligncenter size-full wp-image-55042\" srcset=\"\/wp-content\/uploads\/2026\/03\/logo.png 1280w, \/wp-content\/uploads\/2026\/03\/logo-300x35.png 300w, \/wp-content\/uploads\/2026\/03\/logo-1024x119.png 1024w, \/wp-content\/uploads\/2026\/03\/logo-768x89.png 768w, \/wp-content\/uploads\/2026\/03\/logo-600x70.png 600w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>Based on requirements, either the free plan or a paid plan can be selected for broader access. After registration, an email will be sent containing essential details, including the Web API URL and login credentials.<\/p>\n<p>Once the login details are received, log in to the Management GUI to access the cloud instance.<\/p>\n<h4>Create Database Credentials<\/h4>\n<p>Before interacting with the database, we must create a database user:<\/p>\n<ul>\n<li><strong>Navigate to Security Settings<\/strong>: In the Management GUI, go to the &#8220;GridDB Users&#8221; tab.<\/li>\n<li><strong>Create a Database User<\/strong>: Click &#8220;Create Database User,&#8221; enter a username and password, and save the credentials. For example, set the username as soccer_admin and a strong password.<\/li>\n<li><strong>Store Credentials Securely<\/strong>: These will be used in your application to authenticate with GridDB Cloud.<\/li>\n<\/ul>\n<h4>Set Allowed IP Addresses<\/h4>\n<p>To restrict access to authorized sources, configure the allowed IP settings:<\/p>\n<ul>\n<li><strong>Navigate to Security Settings<\/strong>: In the Management GUI, go to the &#8220;Network Access&#8221; tab and locate the &#8220;Allowed IP&#8221; section and add the .<\/li>\n<li><strong>Add IP Addresses<\/strong>: For development, you can temporarily add your local machine&#8217;s IP.<\/li>\n<\/ul>\n<h3><strong>Add POM Dependency<\/strong><\/h3>\n<p>Here&#8217;s an example of how to configure the dependency in the <code>pom.xml<\/code> file:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-xml\">\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n  xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n  xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/maven-v4_0_0.xsd\"&gt;\n  &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n  &lt;groupId&gt;com.example&lt;\/groupId&gt;\n  &lt;artifactId&gt;my-griddb-app&lt;\/artifactId&gt;\n  &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n  &lt;name&gt;my-griddb-app&lt;\/name&gt;\n  &lt;description&gt;GridDB Application with Spring Boot&lt;\/description&gt;\n  &lt;url&gt;http:\/\/maven.apache.org&lt;\/url&gt;\n\n  &lt;parent&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\n    &lt;version&gt;3.2.4&lt;\/version&gt;\n    &lt;relativePath \/&gt; &lt;!-- lookup parent from repository --&gt;\n  &lt;\/parent&gt;\n\n  &lt;properties&gt;\n    &lt;maven.compiler.source&gt;17&lt;\/maven.compiler.source&gt;\n    &lt;maven.compiler.target&gt;17&lt;\/maven.compiler.target&gt;\n    &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;project.reporting.outputEncoding&gt;UTF-8&lt;\/project.reporting.outputEncoding&gt;\n    &lt;jackson.version&gt;2.16.1&lt;\/jackson.version&gt;\n    &lt;lombok.version&gt;1.18.30&lt;\/lombok.version&gt;\n    &lt;springdoc.version&gt;2.3.0&lt;\/springdoc.version&gt;\n    &lt;jersey.version&gt;3.1.3&lt;\/jersey.version&gt;\n    &lt;httpclient.version&gt;4.5.14&lt;\/httpclient.version&gt;\n  &lt;\/properties&gt;\n\n  &lt;dependencies&gt;\n    &lt;!-- Spring Boot Starters --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n      &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n      &lt;exclusions&gt;\n        &lt;exclusion&gt;\n          &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n          &lt;artifactId&gt;spring-boot-starter-logging&lt;\/artifactId&gt;\n        &lt;\/exclusion&gt;\n      &lt;\/exclusions&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n      &lt;artifactId&gt;spring-boot-starter-actuator&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n      &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- Testing --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n      &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n      &lt;scope&gt;test&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- API Documentation --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.springdoc&lt;\/groupId&gt;\n      &lt;artifactId&gt;springdoc-openapi-starter-webmvc-ui&lt;\/artifactId&gt;\n      &lt;version&gt;${springdoc.version}&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- JSON Processing --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.glassfish.jersey.core&lt;\/groupId&gt;\n      &lt;artifactId&gt;jersey-client&lt;\/artifactId&gt;\n      &lt;version&gt;${jersey.version}&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.json&lt;\/groupId&gt;\n      &lt;artifactId&gt;json&lt;\/artifactId&gt;\n      &lt;version&gt;20231013&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n      &lt;artifactId&gt;jackson-core&lt;\/artifactId&gt;\n      &lt;version&gt;${jackson.version}&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n      &lt;artifactId&gt;jackson-databind&lt;\/artifactId&gt;\n      &lt;version&gt;${jackson.version}&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n      &lt;artifactId&gt;jackson-annotations&lt;\/artifactId&gt;\n      &lt;version&gt;${jackson.version}&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- HTTP Client --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.apache.httpcomponents&lt;\/groupId&gt;\n      &lt;artifactId&gt;httpclient&lt;\/artifactId&gt;\n      &lt;version&gt;${httpclient.version}&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- Development Tools --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n      &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n      &lt;version&gt;${lombok.version}&lt;\/version&gt;\n      &lt;optional&gt;true&lt;\/optional&gt;\n    &lt;\/dependency&gt;\n  &lt;\/dependencies&gt;\n\n  &lt;build&gt;\n    &lt;plugins&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n        &lt;configuration&gt;\n          &lt;excludes&gt;\n            &lt;exclude&gt;\n              &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n              &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;\/exclude&gt;\n          &lt;\/excludes&gt;\n        &lt;\/configuration&gt;\n      &lt;\/plugin&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n        &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n        &lt;version&gt;3.11.0&lt;\/version&gt;\n        &lt;configuration&gt;\n          &lt;source&gt;${maven.compiler.source}&lt;\/source&gt;\n          &lt;target&gt;${maven.compiler.target}&lt;\/target&gt;\n          &lt;annotationProcessorPaths&gt;\n            &lt;path&gt;\n              &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n              &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n              &lt;version&gt;${lombok.version}&lt;\/version&gt;\n            &lt;\/path&gt;\n          &lt;\/annotationProcessorPaths&gt;\n        &lt;\/configuration&gt;\n      &lt;\/plugin&gt;\n    &lt;\/plugins&gt;\n  &lt;\/build&gt;\n&lt;\/project&gt;\n<\/code><\/pre>\n<\/div>\n<p>The <code>application.properties<\/code> file stores configuration settings like the GridDB Cloud API URL and key, and the NASA POWER API URL, enabling the app to connect securely to these external services.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-properties\">\ngriddb.rest.url=https:\/\/your-griddb-cloud-url\/rest\ngriddb.api.key=your-griddb-api-key\nnasa.power.api.url=https:\/\/power.larc.nasa.gov\/api\/temporal\/daily\/point\n<\/code><\/pre>\n<\/div>\n<h3><strong>Technical Implementation<\/strong><\/h3>\n<p>In the following section, we&#8217;ll walk through the key steps required to set up the project.<\/p>\n<p><strong>Container Setup in GridDB Cloud<\/strong><\/p>\n<p>A container named <strong>CropHealthData<\/strong> is created in <strong>GridDB Cloud<\/strong>, defined as a time-series type, with <code>timestamp<\/code> set as the row key.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/03\/Cluster.png\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/03\/Cluster.png\" alt=\"\" width=\"1874\" height=\"585\" class=\"aligncenter size-full wp-image-55039\" srcset=\"\/wp-content\/uploads\/2026\/03\/Cluster.png 1874w, \/wp-content\/uploads\/2026\/03\/Cluster-300x94.png 300w, \/wp-content\/uploads\/2026\/03\/Cluster-1024x320.png 1024w, \/wp-content\/uploads\/2026\/03\/Cluster-768x240.png 768w, \/wp-content\/uploads\/2026\/03\/Cluster-1536x479.png 1536w, \/wp-content\/uploads\/2026\/03\/Cluster-600x187.png 600w\" sizes=\"(max-width: 1874px) 100vw, 1874px\" \/><\/a><\/p>\n<p>Next, we define the schema, which includes the following columns:<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/03\/schema.png\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/03\/schema.png\" alt=\"\" width=\"1865\" height=\"894\" class=\"aligncenter size-full wp-image-55043\" srcset=\"\/wp-content\/uploads\/2026\/03\/schema.png 1865w, \/wp-content\/uploads\/2026\/03\/schema-300x144.png 300w, \/wp-content\/uploads\/2026\/03\/schema-1024x491.png 1024w, \/wp-content\/uploads\/2026\/03\/schema-768x368.png 768w, \/wp-content\/uploads\/2026\/03\/schema-1536x736.png 1536w, \/wp-content\/uploads\/2026\/03\/schema-600x288.png 600w\" sizes=\"(max-width: 1865px) 100vw, 1865px\" \/><\/a><\/p>\n<h3>Data Collection: CollectionService<\/h3>\n<p>The <code>CollectionService<\/code> handles weather data ingestion by acting as the interface between external data sources and the GridDB backend. It integrates with NASA\u2019s POWER API to retrieve daily environmental metrics crucial for monitoring crop health.<\/p>\n<p><strong>Weather Metrics<\/strong><\/p>\n<p>In this section, we retrieve high-precision, real-time data from an external API. The service provides access to various environmental parameters through the following endpoint:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">\nhttps:\/\/power.larc.nasa.gov\/api\/temporal\/daily\/pointparameters=ALLSKY_SFC_SW_DWN,T2MDEW,WS2M,PS,QV2M&community=AG&longitude=-93.5&latitude=42.0&start=%s&end=%s&format=JSON\n<\/code><\/pre>\n<\/div>\n<p>API Reference: <a href=\"https:\/\/power.larc.nasa.gov\/docs\/services\/api\/\">NASA POWER API Documentation<\/a><\/p>\n<p>Data is retrieved for a fixed geographical location (latitude: <strong>42.0<\/strong>, longitude: <strong>-93.5<\/strong>) via a <code>GET<\/code> request to NASA&#8217;s temporal endpoint.<\/p>\n<p>The parameters fetched include:<\/p>\n<ul>\n<li><code>ALLSKY_SFC_SW_DWN<\/code>: Solar Radiation (MJ\/m\u00b2\/day)<\/li>\n<li><code>T2MDEW<\/code>: Dew Point (\u00b0C)<\/li>\n<li><code>WS2M<\/code>: Wind Speed (m\/s)<\/li>\n<li><code>PS<\/code>: Surface Pressure (kPa)<\/li>\n<li><code>QV2M<\/code>: Specific Humidity (g\/kg)<\/li>\n<\/ul>\n<p>After receiving the JSON response:<\/p>\n<ul>\n<li>Relevant fields are extracted.<\/li>\n<li>Timestamps are formatted to GridDB\u2019s required pattern: <code>yyyy-MM-dd HH:mm:ss<\/code>.<\/li>\n<li>Invalid or missing values (represented as <code>-999<\/code>) are filtered out to ensure data quality.<\/li>\n<\/ul>\n<p>Here is the implementation of CollectionService.java file.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-java\">\n@Service\npublic class CollectionService {\n\n    @Value(\"${nasa.power.api.url}\")\n    private String nasaApiUrl;\n\n    private static String gridDBRestUrl;\n    private static String gridDBApiKey;\n\n    @Value(\"${griddb.rest.url}\")\n    public void setGridDBRestUrl(String in) {\n        gridDBRestUrl = in;\n    }\n\n    @Value(\"${griddb.api.key}\")\n    public void setGridDBApiKey(String in) {\n        gridDBApiKey = in;\n    }\n\n    public void fetchAndStoreData(String startDate, String endDate) {\n        try {\n            \/\/ Fetch JSON data from NASA POWER API\n            String jsonData = fetchJSONFromNASA(String.format(\n                    \"%s?parameters=ALLSKY_SFC_SW_DWN,T2MDEW,WS2M,PS,QV2M&amp;community=AG&amp;longitude=-93.5&amp;latitude=42.0&amp;start=%s&amp;end=%s&amp;format=JSON\",\n                    nasaApiUrl, \"20250101\", \"20250514\"));\n\n            \/\/ Process and send data to GridDB Cloud\n            sendBatchToGridDB(jsonData);\n\n        } catch (Exception e) {\n            throw new RuntimeException(\"Failed to fetch and store data\", e);\n        }\n    }\n\n    private String fetchJSONFromNASA(String urlString) throws Exception {\n        URL url = new URL(urlString);\n        HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n        conn.setRequestMethod(\"GET\");\n        conn.setRequestProperty(\"Accept\", \"application\/json\");\n\n        if (conn.getResponseCode() != 200) {\n            throw new RuntimeException(\"Failed to fetch data: HTTP error code : \" + conn.getResponseCode());\n        }\n\n        Scanner scanner = new Scanner(url.openStream());\n        StringBuilder response = new StringBuilder();\n        while (scanner.hasNext()) {\n            response.append(scanner.nextLine());\n        }\n        scanner.close();\n        conn.disconnect();\n        return response.toString();\n    }\n\n    private void sendBatchToGridDB(String jsonData) throws Exception {\n        JSONArray batchData = new JSONArray();\n        ObjectMapper mapper = new ObjectMapper();\n        JsonNode root = mapper.readTree(jsonData);\n        JsonNode data = root.path(\"properties\").path(\"parameter\");\n        JsonNode allSkyNode = data.path(\"ALLSKY_SFC_SW_DWN\");\n\n        \/\/ Iterate over the field names (dates) in ALLSKY_SFC_SW_DWN\n        Iterator&lt;String&gt; dateIterator = allSkyNode.fieldNames();\n        while (dateIterator.hasNext()) {\n            String dateStr = dateIterator.next();\n            double solarRadiation = allSkyNode.path(dateStr).asDouble();\n            double dewPoint = data.path(\"T2MDEW\").path(dateStr).asDouble();\n            double windSpeed = data.path(\"WS2M\").path(dateStr).asDouble();\n            double surfacePressure = data.path(\"PS\").path(dateStr).asDouble();\n            double specificHumidity = data.path(\"QV2M\").path(dateStr).asDouble();\n\n            \/\/ Skip records with -999 (missing data)\n            if (solarRadiation == -999 || dewPoint == -999 || windSpeed == -999 ||\n                    surfacePressure == -999 || specificHumidity == -999) {\n                continue;\n            }\n\n            JSONArray rowArray = new JSONArray();\n            rowArray.put(formatTimestamp(dateStr));\n            rowArray.put(42.0); \/\/ latitude\n            rowArray.put(-93.5); \/\/ longitude\n            rowArray.put(solarRadiation);\n            rowArray.put(dewPoint);\n            rowArray.put(windSpeed);\n            rowArray.put(surfacePressure);\n            rowArray.put(specificHumidity);\n            batchData.put(rowArray);\n        }\n\n        if (batchData.length() &gt; 0) {\n            sendPutRequest(batchData);\n        } else {\n            System.out.println(\"No valid data to send to GridDB.\");\n        }\n    }\n\n    private String formatTimestamp(String inputTimestamp) {\n        try {\n            if (inputTimestamp == null || inputTimestamp.isEmpty()) {\n                return LocalDateTime.now().format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ss\")) + \"Z\";\n            }\n            SimpleDateFormat sdf = new SimpleDateFormat(\"yyyyMMdd\");\n            SimpleDateFormat outputFormat = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n            return outputFormat.format(sdf.parse(inputTimestamp));\n        } catch (Exception e) {\n            return LocalDateTime.now().format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ss\")) + \"Z\";\n        }\n    }\n\n    private void sendPutRequest(JSONArray batchData) throws Exception {\n        URL url = new URL(gridDBRestUrl);\n        HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n        conn.setDoOutput(true);\n        conn.setRequestMethod(\"PUT\");\n        conn.setRequestProperty(\"Content-Type\", \"application\/json\");\n        conn.setRequestProperty(\"Authorization\", gridDBApiKey);\n\n        \/\/ Send JSON Data\n        try (var os = conn.getOutputStream()) {\n            os.write(batchData.toString().getBytes());\n            os.flush();\n        }\n\n        int responseCode = conn.getResponseCode();\n        if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {\n            System.out.println(\"Batch inserted successfully.\");\n        } else {\n            throw new RuntimeException(\"Failed to insert batch. Response: \" + responseCode);\n        }\n\n        conn.disconnect();\n    }\n}\n<\/code><\/pre>\n<\/div>\n<p><strong>Batch Insertion to GridDB<\/strong><\/p>\n<p>Next, cleaned data is sent to the <code>CropHealthData<\/code> container in GridDB using a <strong>PUT request<\/strong> via the <code>\/CropHealthData\/row<\/code> endpoint. This process:<\/p>\n<p>&lt;<\/p>\n<p>ul><\/p>\n<li>Utilizes <strong>batch insertion<\/strong> to reduce network overhead.<\/li>\n<li>Takes advantage of <strong>GridDB&#8217;s high-throughput performance<\/strong>, which is ideal for time-series ingestion at scale.\n<p><strong>Data Retrieval and Analytical Processing<\/strong><\/p>\n<p>The CropHealthService is responsible for retrieving data from GridDB and performing analytical computations to derive actionable indicators. It queries the CropHealthData container using GridDB&#8217;s REST API, which returns a JSON response with a rows array. Each row contains eight fields, with timestamps formatted as <code>yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSZ (e.g., 2025-01-01T00:00:00.000000000Z)<\/code>.<\/p>\n<p>The service parses this response, mapping each row to a <code>CropHealthData<\/code> DTO object.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-java\">\npackage mycode.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\npublic class CropHealthData {\n    private Date timestamp;\n    private double latitude;\n    private double longitude;\n    private double solarRadiation;\n    private double dewPoint;\n    private double windSpeed;\n    private double surfacePressure;\n    private double specificHumidity;\n    private String status;\n}\n<\/code><\/pre>\n<\/div>\n<p>This object is then used to compute five key indicators:<\/p>\n<ul>\n<li><strong>Photosynthetic Stress<\/strong>: Identifies days with solar radiation below 10 MJ\/m\u00b2\/day, aggregated by month to highlight periods of reduced photosynthesis.<\/li>\n<li><strong>Fungal Risk<\/strong>: Counts days with dew point above 20\u00b0C within a 7-day window, signaling potential fungal disease outbreaks.<\/li>\n<li><strong>Wind Stress<\/strong>: Tracks days with wind speed exceeding 5 m\/s, aggregated weekly to assess mechanical stress on crops.<\/li>\n<li><strong>Atmospheric Stress<\/strong>: Detects daily surface pressure drops greater than 2 kPa, indicating weather instability.<\/li>\n<li><strong>Moisture Deficit<\/strong>: Calculates weekly average specific humidity to evaluate water availability.<\/li>\n<\/ul>\n<p>These indicators transform raw weather data into insights tailored for agriculture. For example, a high fungal risk score prompts farmers to apply fungicides, while persistent low radiation signals the need for supplemental lighting.<\/p>\n<h4>Visualization: Unified Dashboard API<\/h4>\n<p>Visualization is a key feature of the system, delivered through a <strong>Thymeleaf-based dashboard<\/strong> powered by <strong>Chart.js<\/strong> for dynamic, interactive charts.<\/p>\n<p>The <code>CropHealthController<\/code> exposes a single API endpoint:<br \/>\n<code>GET \/api\/dashboard-data<\/code><\/p>\n<p>This endpoint calls <code>CropHealthService.getAllVisualizationData<\/code> to retrieve data for all ten charts in one JSON response.<\/p>\n<p>Here is the complete implementation from CropHealthController.java file.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-java\">\n@Controller\n@RequestMapping(\"\/crop-health\")\npublic class CropHealthController {\n\n    @Autowired\n    private CropHealthService cropHealthService;\n\n\n    @GetMapping(\"\/dashboard\")\n    public String dashboard(Model model) {\n        model.addAttribute(\"solarRadiationData\", cropHealthService.getVisualizationData(\"solar_radiation\"));\n        model.addAttribute(\"dewPointData\", cropHealthService.getVisualizationData(\"dew_point\"));\n        model.addAttribute(\"windSpeedData\", cropHealthService.getVisualizationData(\"wind_speed\"));\n        model.addAttribute(\"surfacePressureData\", cropHealthService.getVisualizationData(\"surface_pressure\"));\n        model.addAttribute(\"specificHumidityData\", cropHealthService.getVisualizationData(\"specific_humidity\"));\n        model.addAttribute(\"photosyntheticStressData\", cropHealthService.getVisualizationData(\"photosynthetic_stress\"));\n        model.addAttribute(\"fungalRiskData\", cropHealthService.getVisualizationData(\"fungal_risk\"));\n        model.addAttribute(\"windStressData\", cropHealthService.getVisualizationData(\"wind_stress\"));\n        model.addAttribute(\"atmosphericStressData\", cropHealthService.getVisualizationData(\"atmospheric_stress\"));\n        model.addAttribute(\"moistureDeficitData\", cropHealthService.getVisualizationData(\"moisture_deficit\"));\n        return \"dashboard\";\n    }\n}\n<\/code><\/pre>\n<\/div>\n<h3>Running the Project<\/h3>\n<p>To run the project, execute the following command to build and run our application:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">\nmvn clean install &amp;&amp; mvn spring-boot:run  \n<\/code><\/pre>\n<\/div>\n<h3>Accessing the Dashboard<\/h3>\n<p>After successfully launching the Spring Boot application, users can access the interactive visualization dashboard by opening a web browser and navigating to: `http:\/\/localhost:9090\/dashboard`.<\/p>\n<p>The dashboard currently showcases the following visual insights:<\/p>\n<figure id=\"attachment_55040\" aria-describedby=\"caption-attachment-55040\" style=\"width: 2560px\" class=\"wp-caption aligncenter\"><a href=\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1101\" class=\"size-full wp-image-55040\" srcset=\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg 2560w, \/wp-content\/uploads\/2026\/03\/graph-300x129.jpg 300w, \/wp-content\/uploads\/2026\/03\/graph-1024x440.jpg 1024w, \/wp-content\/uploads\/2026\/03\/graph-768x330.jpg 768w, \/wp-content\/uploads\/2026\/03\/graph-1536x661.jpg 1536w, \/wp-content\/uploads\/2026\/03\/graph-2048x881.jpg 2048w, \/wp-content\/uploads\/2026\/03\/graph-600x258.jpg 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><figcaption id=\"caption-attachment-55040\" class=\"wp-caption-text\">Screenshot<\/figcaption><\/figure>\n<p><a href=\"\/wp-content\/uploads\/2026\/03\/graph1-scaled.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/03\/graph1-scaled.png\" alt=\"\" width=\"2560\" height=\"1392\" class=\"aligncenter size-full wp-image-55041\" srcset=\"\/wp-content\/uploads\/2026\/03\/graph1-scaled.png 2560w, \/wp-content\/uploads\/2026\/03\/graph1-300x163.png 300w, \/wp-content\/uploads\/2026\/03\/graph1-1024x557.png 1024w, \/wp-content\/uploads\/2026\/03\/graph1-768x418.png 768w, \/wp-content\/uploads\/2026\/03\/graph1-1536x835.png 1536w, \/wp-content\/uploads\/2026\/03\/graph1-2048x1114.png 2048w, \/wp-content\/uploads\/2026\/03\/graph1-600x326.png 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<p>The dashboard presents a comprehensive view of crop health through ten interactive charts:<\/p>\n<ol>\n<li><strong>Environmental Metrics (Line Charts)<\/strong>\n<ul>\n<li><strong>Solar Radiation<\/strong>: Daily solar radiation values in MJ\/m\u00b2\/day, helping identify optimal photosynthesis periods<\/li>\n<li><strong>Dew Point<\/strong>: Temperature at which air becomes saturated (\u00b0C), crucial for fungal disease prediction<\/li>\n<li><strong>Wind Speed<\/strong>: Daily wind measurements in m\/s, indicating potential mechanical stress on crops<\/li>\n<li><strong>Surface Pressure<\/strong>: Atmospheric pressure readings in kPa, showing weather stability<\/li>\n<li><strong>Specific Humidity<\/strong>: Daily moisture content in g\/kg, essential for irrigation planning<\/li>\n<\/ul>\n<\/li>\n<li><strong>Crop Stress Indicators<\/strong>\n<ul>\n<li><strong>Photosynthetic Stress<\/strong>: Monthly bar chart showing days with suboptimal radiation (&lt; 10 MJ\/m\u00b2\/day)<\/li>\n<li><strong>Fungal Risk<\/strong>: Gauge chart displaying 7-day dew point risk assessment (> 20\u00b0C)<\/li>\n<li><strong>Wind Stress<\/strong>: Weekly bar chart tracking high wind events (> 5 m\/s)<\/li>\n<li><strong>Atmospheric Stress<\/strong>: Area chart highlighting significant pressure drops (> 2 kPa\/day)<\/li>\n<li><strong>Moisture Deficit<\/strong>: Weekly line chart of humidity averages for water management<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3><strong>Conclusion:<\/strong><\/h3>\n<p>Precision farming relies on fast, accurate time-series data to make informed decisions that improve crop health and yield. By harnessing GridDB&#8217;s ability to handle large-scale, high-frequency environmental data in real time, farmers can detect stress factors early and respond proactively. This timely insight reduces waste, optimizes resource use, and ultimately leads to more sustainable and efficient agricultural practices. Fast, reliable time-series databases are essential for unlocking the full potential of precision agriculture in today&#8217;s data-driven world.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and real-time data analytics, offers a solution by optimizing crop management through actionable insights. However, traditional relational databases struggle with the velocity and volume of agricultural time-series data, creating performance bottlenecks when farmers need immediate analysis [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":55040,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-55036","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>Precision Agriculture with GridDB | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and\" \/>\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\/precision-agriculture-with-griddb\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Precision Agriculture with GridDB | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/\" \/>\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=\"2026-02-27T00:10:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-30T18:10:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/griddb.net\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1101\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\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=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Precision Agriculture with GridDB\",\"datePublished\":\"2026-02-27T00:10:10+00:00\",\"dateModified\":\"2026-03-30T18:10:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/\"},\"wordCount\":1493,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/\",\"url\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/\",\"name\":\"Precision Agriculture with GridDB | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\",\"datePublished\":\"2026-02-27T00:10:10+00:00\",\"dateModified\":\"2026-03-30T18:10:20+00:00\",\"description\":\"Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\",\"contentUrl\":\"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg\",\"width\":2560,\"height\":1101,\"caption\":\"Screenshot\"},{\"@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\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Precision Agriculture with GridDB | GridDB: Open Source Time Series Database for IoT","description":"Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and","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\/precision-agriculture-with-griddb\/","og_locale":"en_US","og_type":"article","og_title":"Precision Agriculture with GridDB | GridDB: Open Source Time Series Database for IoT","og_description":"Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and","og_url":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2026-02-27T00:10:10+00:00","article_modified_time":"2026-03-30T18:10:20+00:00","og_image":[{"width":2560,"height":1101,"url":"https:\/\/griddb.net\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg","type":"image\/jpeg"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#article","isPartOf":{"@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/"},"author":{"name":"griddb-admin","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Precision Agriculture with GridDB","datePublished":"2026-02-27T00:10:10+00:00","dateModified":"2026-03-30T18:10:20+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/"},"wordCount":1493,"commentCount":0,"publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/","url":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/","name":"Precision Agriculture with GridDB | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg","datePublished":"2026-02-27T00:10:10+00:00","dateModified":"2026-03-30T18:10:20+00:00","description":"Introduction As global populations grow, agriculture faces mounting pressure to produce more food sustainably. Precision agriculture, powered by IoT and","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/blog\/precision-agriculture-with-griddb\/#primaryimage","url":"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg","contentUrl":"\/wp-content\/uploads\/2026\/03\/graph-scaled.jpg","width":2560,"height":1101,"caption":"Screenshot"},{"@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\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/55036","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\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/comments?post=55036"}],"version-history":[{"count":6,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/55036\/revisions"}],"predecessor-version":[{"id":55093,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/55036\/revisions\/55093"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media\/55040"}],"wp:attachment":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media?parent=55036"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/categories?post=55036"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/tags?post=55036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}