{"id":2861932,"date":"2025-06-30T04:34:40","date_gmt":"2025-06-30T11:34:40","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2861932"},"modified":"2025-07-01T02:51:31","modified_gmt":"2025-07-01T09:51:31","slug":"how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","title":{"rendered":"How to integrate satellite imagery in mobile app development with Flutter Maps SDK"},"author":10242,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191,22931],"tags":[26011,215372,773362,590751,33451],"industry":[],"product":[36951,776202,36561,36861,36601],"class_list":["post-2861932","blog","type-blog","status-publish","format-standard","hentry","category-developers","category-imagery","tag-image-services","tag-mobile-applications","tag-native-development","tag-raster-visualization","tag-satellite-imagery","product-image-server","product-sdk-flutter","product-arcgis-pro","product-api-rest","product-developers"],"acf":{"authors":[{"ID":10242,"user_firstname":"Rachael","user_lastname":"Ellen","nickname":"Rachael Ellen","user_nicename":"rellen","display_name":"Rachael Ellen","user_email":"rellen@esri.com","user_url":"https:\/\/dev.to\/rachaele\/","user_registered":"2019-11-29 11:58:45","user_description":"Rachael is a senior product engineer in the Developer Outreach team for the ArcGIS Maps SDKs for Native Apps. Following an academic career in geology, she switched careers by learning to code and now enjoys building apps with the Native Maps SDKs. She loves sharing code examples, fun geospatial development workflows and the latest product updates with developers via blogs and talks.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.","flexible_content":[{"acf_fc_layout":"content","content":"<p>With more satellites than ever monitoring our planet, the volume of available remote sensing data is growing rapidly. This creates opportunities for organizations to integrate satellite imagery into software applications that support critical workflows in sectors such as agriculture, forestry, climate monitoring, and more. ArcGIS Maps SDK for Flutter (aka Flutter Maps SDK), one of several SDKs that Esri provides for native app development, gives developers tools to visualize, interact with, and analyze raster data, including satellite imagery, directly within mobile or desktop applications.<\/p>\n<p>In this blog, I\u2019ll show you how to integrate imagery from Esri\u2019s hosted Sentinel-2 image service into a mobile app using the Flutter Maps SDK. You\u2019ll learn how to query the image service using parameters like location, date and cloud cover, and how to display the results with an interactive, time-based slider. The result is a custom-made mobile application that can be used to visually monitor the changes in the landscape over time, such as tree foliage changes across the seasons.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2865002,"id":2865002,"title":"SatelliteImageryAppSmall","filename":"SatelliteImageryAppSmall.png","filesize":2643445,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/satelliteimageryappsmall","alt":"Five screenshots of a mobile phone screen displaying satellite imagery and user notifications.","author":"10242","description":"","caption":"The Sentinel-2 imagery viewer app we'll be building in this blog with the Flutter Maps SDK.","name":"satelliteimageryappsmall","status":"inherit","uploaded_to":2861932,"date":"2025-06-27 09:20:08","modified":"2025-06-27 16:12:57","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2289,"height":1095,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall.png","medium-width":464,"medium-height":222,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall.png","medium_large-width":768,"medium_large-height":367,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall.png","large-width":1920,"large-height":918,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall-1536x735.png","1536x1536-width":1536,"1536x1536-height":735,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall-2048x980.png","2048x2048-width":2048,"2048x2048-height":980,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall-826x395.png","card_image-width":826,"card_image-height":395,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteImageryAppSmall-1920x918.png","wide_image-width":1920,"wide_image-height":918}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Before we dive into the code, let\u2019s look at what rasters and image services are, and why they benefit software developers building native applications that work with satellite imagery.<\/p>\n<h2>Rasters and image services<\/h2>\n<p><a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/help\/data\/imagery\/introduction-to-raster-data.htm\">Rasters<\/a> are a fundamental geospatial data type, representing geographic information as a matrix of pixels. Each pixel holds a value which corresponds to a specific location. These values can represent various data types such as spectral bands, elevation, temperature or categorical classifications. For example, in a digital aerial photographic image, each pixel typically contains RGB values which can be used to display true-color imagery. In satellite imagery, multiple spectral bands (including those beyond the visible spectrum, such as near-infrared) are captured in each pixel. These bands can be used to analyze vegetative health, water body delineation, and land cover classification.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2861952,"id":2861952,"title":"Satellite Imagery Raster","filename":"Satellite-Imagery-Raster.png","filesize":210355,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/satellite-imagery-raster","alt":"A diagram of data from satellite imagery","author":"10242","description":"An illustrative overview of how satellite imagery can be stored as raster data, with each pixel corresponding to real world data.","caption":"","name":"satellite-imagery-raster","status":"inherit","uploaded_to":2861932,"date":"2025-06-26 14:49:22","modified":"2025-06-26 14:51:15","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":854,"height":710,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","medium-width":314,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","medium_large-width":768,"medium_large-height":639,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","large-width":854,"large-height":710,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","1536x1536-width":854,"1536x1536-height":710,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","2048x2048-width":854,"2048x2048-height":710,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster-559x465.png","card_image-width":559,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Satellite-Imagery-Raster.png","wide_image-width":854,"wide_image-height":710}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>An Esri <strong>image service<\/strong> is a web service that provides access to raster data (such as satellite imagery) directly in your application. Instead of downloading large datasets, you can request just the specific areas, dates, cloud cover levels, etc. that you need, when you need them, which the service then sends to you on the fly. This approach enhances performance and scalability, especially for applications requiring dynamic access to large or frequently updated raster datasets.<\/p>\n<h2><strong>Sentinel-2 Image Service<\/strong><\/h2>\n<p>Sentinel-2 is a satellite mission from the European Space Agency (ESA) that captures high-resolution imagery of Earth\u2019s surface, useful for monitoring vegetation, water, land use, and more. Esri provides access to the Level-1C Top of Atmosphere imagery through the <a href=\"https:\/\/www.arcgis.com\/home\/item.html?id=fd61b9e0c69c4e14bebd50a9a968348c\"><strong>Sentinel-2 Image Service<\/strong><\/a><strong>, <\/strong>which is updated daily. The raster data from this image service consists of multispectral 13-band images with visual renderings. By default, it renders natural color (bands 4, 3, 2), but developers can explore other band combinations by using the 21 available <a href=\"https:\/\/sentinel.arcgis.com\/arcgis\/rest\/services\/Sentinel2\/ImageServer\/rasterFunctionInfos\">raster functions<\/a> (such as Agriculture and Color Infrared).<\/p>\n<blockquote><p>Note that Sentinel-2 Level-2A data is also <a href=\"https:\/\/www.arcgis.com\/home\/item.html?id=255af1ceee844d6da8ef8440c8f90d00\">available<\/a> and viewable with the <a href=\"https:\/\/livingatlas.arcgis.com\/sentinel2explorer\/#mapCenter=-11.39800%2C21.12400%2C12.000&amp;mode=dynamic&amp;mainScene=2024-10-26%7CAgriculture+for+Visualization%7C27906279\">Esri Sentinel-2 Explorer web app<\/a> (see below).<\/p><\/blockquote>\n"},{"acf_fc_layout":"image","image":{"ID":2862012,"id":2862012,"title":"Sentinel2Explorer_Richat","filename":"Sentinel2Explorer_Richat.png","filesize":5424749,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/sentinel2explorer_richat","alt":"Screenshot of the Esri Sentinel-2 Explorer web app, showing the Richat Structure satellite imagery.","author":"10242","description":"","caption":"The Esri Sentinel-2 Explorer web app allows you to explore and analyze satellite imagery from the Sentinel-2 Level-2A data collection.","name":"sentinel2explorer_richat","status":"inherit","uploaded_to":2861932,"date":"2025-06-26 14:56:20","modified":"2025-06-26 14:59:35","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":3400,"height":1710,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat.png","medium-width":464,"medium-height":233,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat.png","medium_large-width":768,"medium_large-height":386,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat.png","large-width":1920,"large-height":966,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat-1536x773.png","1536x1536-width":1536,"1536x1536-height":773,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat-2048x1030.png","2048x2048-width":2048,"2048x2048-height":1030,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat-826x415.png","card_image-width":826,"card_image-height":415,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/Sentinel2Explorer_Richat-1920x966.png","wide_image-width":1920,"wide_image-height":966}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/livingatlas.arcgis.com\/sentinel2explorer\/#mapCenter=-11.39800%2C21.12400%2C12.000&mode=dynamic&mainScene=2024-10-26%7CAgriculture+for+Visualization%7C27906279"},{"acf_fc_layout":"content","content":"<p>If you\u2019re looking to integrate satellite imagery into your apps, using image services like Esri\u2019s Sentinel-2 image service makes it easy to deliver responsive, visually rich remote sensing experiences in your native apps without having to manage or download large datasets. With support for date filtering, cloud masking, and server-side raster rendering, all you need is an image service URL and a geographical extent to get started with Flutter Maps SDK.<\/p>\n<p>Now that we understand some raster and image service fundamentals, I\u2019ll step through how to display satellite imagery from the Sentinel-2 image service in a mobile application using Flutter Maps SDK.<\/p>\n<h2><strong>Building a satellite imagery viewer app<\/strong><\/h2>\n<p>The mobile app we&#8217;ll build is for a user who wants to visualize how tree foliage cover changes throughout the seasons in a forested area of Laurel Ridge State Park, Pennsylvania, in the USA. The app allows the user to control which satellite imagery is retrieved by selecting a cloud cover filter and a start and end date of imagery to be viewed. \u00a0\u00a0It\u2019s beyond the scope of this blog to go into the app\u2019s UI controls and Flutter state management, but you can check out the full code on my <a href=\"https:\/\/github.com\/Rachael-E\/s2-image-viewer\">GitHub repo<\/a> to see how that all hooks together.<\/p>\n<p><em>Note, even though I\u2019m using Flutter Maps SDK throughout this blog, the concepts and workflows that follow are the same for the other ArcGIS Maps SDKs for Native Apps (.NET, Kotlin, Qt, and Swift).<\/em><\/p>\n<h3><strong>Install Flutter Maps SDK<\/strong><\/h3>\n<p>First, you\u2019ll need to install Flutter Maps SDK and sign up for an API key if you don\u2019t already have one. Learn how to install and get a key on the\u00a0<a href=\"https:\/\/developers.arcgis.com\/flutter\/get-started\/\">Get Started<\/a>\u00a0doc pages, then follow the steps in the <a href=\"https:\/\/developers.arcgis.com\/flutter\/maps-2d\/tutorials\/display-a-map\/\">Display a Map tutorial<\/a> to create a basic map app template to build upon. The tutorial walks you through how to import the arcgis_maps package from pub.dev, set your API key, and display a map.<\/p>\n<h3><strong>How to set up the map view<\/strong><\/h3>\n<p>Now you have a basic map app set up, so it\u2019s time to configure the code for our satellite imagery. In our app, the map provides the spatial context for the satellite imagery. Since we\u2019re working with raster data, the underlying basemap style will be obscured once it\u2019s loaded. Let\u2019s go for a dark gray base map style which matches the app\u2019s dark themed welcome screen:<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">_map = ArcGISMap.withBasemapStyle(BasemapStyle.arcGISDarkGrayBase);\r\n_mapViewController.arcGISMap = _map;\r\n<\/code><\/pre>\n<p>Now that we have a basemap, we need to define the bounding box (envelope) of the geographical area we want satellite imagery from. We\u2019ll create an envelope which takes the x and y min and max co-ordinates and use the envelope to set the viewpoint of the map view. We\u2019ll also use these coordinates later to request the satellite imagery:<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">_envelope = Envelope.fromXY(\r\n  xMin: xMin,\r\n  yMin: yMin,\r\n  xMax: xMax,\r\n  yMax: yMax,\r\n  spatialReference: SpatialReference.wgs84,\r\n);\r\n\r\n _mapViewController\r\n    .setViewpoint(Viewpoint.fromTargetExtent(_envelope.extent));\r\n<\/code><\/pre>\n<p>As image services render on the fly, panning and zooming the map view to an area outside the original extent will trigger a redraw of the imagery which can take time. To avoid unnecessary redraws and improve the user experience of viewing imagery in just one area (Laurel Ridge State Park), let\u2019s lock the map view by disabling interaction with:<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">_mapViewController.interactionOptions.enabled = <span style=\"color: #d73a49;\">false<\/span>;\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h3><strong>How to query for available satellite imagery<\/strong><\/h3>\n<p>Now that the app is set up to display a dark gray basemap in the area we\u2019re focusing on, it\u2019s time to find out what imagery is available for that area from the image service.<\/p>\n<p>For this app, I want the user to be able to view satellite imagery available within their chosen extent. I want them to be able to filter by how much cloud cover the image has, and by the date on which the imagery was acquired. You can use the <a href=\"https:\/\/sentinel.arcgis.com\/arcgis\/rest\/services\/Sentinel2\/ImageServer.\">image service REST directory<\/a> to check what fields are available to filter on &#8211; in our case the fields <code>cloudcover<\/code> and <code>acquisitiondate<\/code> are important.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2862212,"id":2862212,"title":"s2_fields","filename":"s2_fields.png","filesize":145937,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/s2_fields","alt":"Screenshot of text displaying fields from image service","author":"10242","description":"","caption":"Fields available to filter on from the Sentinel-2 image service","name":"s2_fields","status":"inherit","uploaded_to":2861932,"date":"2025-06-26 15:33:10","modified":"2025-06-26 15:37:12","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1025,"height":492,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","medium-width":464,"medium-height":223,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","medium_large-width":768,"medium_large-height":369,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","large-width":1025,"large-height":492,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","1536x1536-width":1025,"1536x1536-height":492,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","2048x2048-width":1025,"2048x2048-height":492,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields-826x396.png","card_image-width":826,"card_image-height":396,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/s2_fields.png","wide_image-width":1025,"wide_image-height":492}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<blockquote><p><strong>Tip<\/strong>: Clouds obscure Sentinel-2 imagery, so for the best images you should ideally filter for cloud free imagery by using a value of 0 for <code>cloudcover<\/code>. However, in hilly regions such as Laurel Ridge State Park, it\u2019s rare to have many cloud free days and so long gaps may occur between cloud free images. For this app I\u2019ve therefore incorporated a 5% and 10% cloud cover filter for the user to explore.<\/p><\/blockquote>\n"},{"acf_fc_layout":"content","content":"<p>We can encode and pass values for <code>cloudcover<\/code> and <code>acquisitiondate<\/code> into the image service\u2019s REST query as a where clause to find out how many images that match the user\u2019s filter are available, and importantly, what is the relevant raster image object ID. The <code>objectid<\/code> is what we will need to later display individual raster images on our app. We will also pass the geometry extent we set up earlier as parameters to limit the query to our specific area.<\/p>\n<blockquote><p><strong>Tip<\/strong>: If we didn\u2019t pass in a geometry extent, we would retrieve satellite imagery across the whole globe for our given cloud cover and date filters.<\/p><\/blockquote>\n<p>Then, we set the <code>outFields<\/code> to define the attributes we want to retrieve from the service, specifically <code>acquisitiondate<\/code>, <code>cloudcover<\/code> and <code>objectid<\/code>.<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">\r\n    <span style=\"color: #d73a49;\">final<\/span> whereClause = <span style=\"color: #032f62;\">\"acquisitiondate &gt;= DATE '<span style=\"color: #24292e;\">$start<\/span>' \"<\/span>\r\n        <span style=\"color: #032f62;\">\"AND acquisitiondate &lt; DATE '<span style=\"color: #24292e;\">$end<\/span>' \"<\/span>\r\n        <span style=\"color: #032f62;\">\"AND cloudcover &lt;= <span style=\"color: #24292e;\">$_selectedCloudCover<\/span>\"<\/span>;\r\n\r\n    <span style=\"color: #d73a49;\">final<\/span> encodedWhere = <span style=\"color: #e36209;\">Uri<\/span>.encodeComponent(whereClause);\r\n\r\n    <span style=\"color: #d73a49;\">final<\/span> uri = <span style=\"color: #e36209;\">Uri<\/span>.parse(\r\n      <span style=\"color: #032f62;\">'https:\/\/sentinel.arcgis.com\/arcgis\/rest\/services\/Sentinel2\/ImageServer\/query'<\/span>\r\n      <span style=\"color: #032f62;\">'?where=<span style=\"color: #24292e;\">$encodedWhere<\/span>'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;geometry=<span style=\"color: #24292e;\">$xMin<\/span>, <span style=\"color: #24292e;\">$yMin<\/span>, <span style=\"color: #24292e;\">$xMax<\/span>, <span style=\"color: #24292e;\">$yMax<\/span>'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;geometryType=esriGeometryEnvelope'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;inSR=4326'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;spatialRel=esriSpatialRelIntersects'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;outFields=acquisitiondate,objectid,cloudcover'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;returnGeometry=false'<\/span>\r\n      <span style=\"color: #032f62;\">'&amp;f=json'<\/span>,\r\n    );  \r\n\r\n<\/code><\/pre>\n<p>When we make a query to the image service with those parameters, we get a response that returns the requested <code>outFields<\/code> for any rasters matching the required inputs.<\/p>\n<p>The app is now set up to quickly check what images are available from the image service for the given geometry, cloud cover, and acquisition dates. This workflow of quickly querying the service allows the app to remain fast and responsive and give the user flexibility over choosing filters without loading unwanted imagery, saving time and memory.<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2865122,"id":2865122,"title":"SatImgUserControls","filename":"SatImgUserControls.png","filesize":3254223,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/satimgusercontrols","alt":"Three mobile phone screens showing user options for filtering imagery","author":"10242","description":"","caption":"The user can select a date range and cloud cover to query the image service and quickly find how many results match their filters.","name":"satimgusercontrols","status":"inherit","uploaded_to":2861932,"date":"2025-06-27 13:39:45","modified":"2025-06-27 13:50:50","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1829,"height":1238,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls.png","medium-width":386,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls.png","medium_large-width":768,"medium_large-height":520,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls.png","large-width":1596,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls-1536x1040.png","1536x1536-width":1536,"1536x1536-height":1040,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls.png","2048x2048-width":1829,"2048x2048-height":1238,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls-687x465.png","card_image-width":687,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatImgUserControls-1596x1080.png","wide_image-width":1596,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3><strong>How to display raster images<\/strong><\/h3>\n<p>Now that we know which rasters are available from our query, the next step is to display them on the map. We do this by creating a new <code>ImageServiceRaster<\/code> object for each available raster using the Sentinel-2 image service URI, then setting a mosaic rule (specifies how a collection of raster datasets, such as those available through the image service, are displayed) to the image service raster and applying a where clause to it. This limits the imagery to a single result using the image\u2019s object ID we retrieved earlier.<\/p>\n<blockquote><p><strong>Tip<\/strong>: If we didn\u2019t supply this where clause, we would be retrieving all rasters available within the map view space, which would be bandwidth and time costly.<\/p><\/blockquote>\n<p>Finally, create a raster layer from that result and add it to the map\u2019s operational layers.<\/p>\n<p><em>Note: To optimize performance and to avoid requesting and redrawing multiple raster layers containing the same raster, the app checks whether a raster has already been added to the map\u2019s operational layers using its unique <code>objectID<\/code>. The app won\u2019t request the raster again if it\u2019s already there. Check out the code in my <a href=\"https:\/\/github.com\/Rachael-E\/s2-image-viewer\">Github repo<\/a> learn more.<\/em><\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">\r\n<span style=\"color: #d73a49;\">final<\/span> raster = ImageServiceRaster(\r\n  uri: <span style=\"color: #e36209;\">Uri<\/span>.parse(<span style=\"color: #032f62;\">'https:\/\/sentinel.arcgis.com\/arcgis\/rest\/services\/Sentinel2\/ImageServer'<\/span>),\r\n);\r\n\r\nraster.mosaicRule = MosaicRule()\r\n  ..whereClause = <span style=\"color: #032f62;\">'OBJECTID = <span style=\"color: #24292e;\">$objectId<\/span>'<\/span>;\r\n\r\n<span style=\"color: #d73a49;\">final<\/span> rasterLayer = RasterLayer.withRaster(raster)..name = layerName;\r\n<span style=\"color: #d73a49;\">await<\/span> rasterLayer.load().whenComplete(() =&gt; map.operationalLayers.add(rasterLayer));\r\n\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h3><strong>How to configure the interaction with the map<\/strong><\/h3>\n<p>Now that the app is configured to fetch and display rasters from the image service, it\u2019s time to configure the user interface to display the results. Below, I\u2019ll briefly summarize the key components as it\u2019s beyond the scope of this blog to go into the full details of Flutter UI configuration (but remember you can check out the full source code in <a href=\"https:\/\/github.com\/Rachael-E\/s2-image-viewer\">my GitHub repo<\/a> for this app).<\/p>\n<p>To create a responsive and intuitive experience, you can connect the <strong>map view controller\u2019s draw status<\/strong> to your Flutter UI. Since multiple satellite imagery requests can take time to draw, it\u2019s useful to listen in to the map view controller\u2019s draw status event to coordinate your UI elements. For this app, a slider widget is used to allow the user to browse the displayed satellite images. By listening in to the draw status, you can temporarily <strong>hide interactive widgets<\/strong> like the slider while the map loads new data. You can then reveal the slider again once rendering is complete and interact with it to browse the images loaded. This ensures that the user interacts only with fully loaded content.<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">\r\n    _mapViewController.onDrawStatusChanged.listen((event) {\r\n      <span style=\"color: #d73a49;\">if<\/span> (event == DrawStatus.completed) {\r\n        markLayerDrawnIfComplete(layerName);\r\n      }\r\n    });\r\n\r\n<\/code><\/pre>\n<p>Once the raster layers are ready, the user can interact with the slider to view different rasters. As the slider\u2019s index changes, the app updates the visible raster layer by setting the visibility Boolean property on the layer accordingly.<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">\r\n    <span style=\"color: #d73a49;\">for<\/span> (<span style=\"color: #d73a49;\">final<\/span> layer <span style=\"color: #d73a49;\">in<\/span> _map.operationalLayers.whereType&lt;RasterLayer&gt;()) {\r\n      layer.isVisible = <span style=\"color: #d73a49;\">false<\/span>;\r\n    }\r\n\r\n    <span style=\"color: #d73a49;\">if<\/span> (selectedLayer != <span style=\"color: #d73a49;\">null<\/span>) {\r\n      selectedLayer.isVisible = <span style=\"color: #d73a49;\">true<\/span>;\r\n    }\r\n\r\n<\/code><\/pre>\n<p>Once you\u2019ve hooked in the UI operations to the raster filtering and selection logic, you have an app powered by Flutter Maps SDK that allows your user to quickly browse satellite imagery from an image service, display it on the device, and interact with the results &#8211; all on a mobile device without requiring access to desktop software.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2865072,"id":2865072,"title":"SliderActionSatelliteImagery","filename":"SliderActionSatelliteImagery.gif","filesize":1623579,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/slideractionsatelliteimagery","alt":"A mobile phone screen where a slider is dragged left to right and imagery changes on the main screen","author":"10242","description":"","caption":"The slider in the app allows the user to tap through the raster imagery that matched their request.","name":"slideractionsatelliteimagery","status":"inherit","uploaded_to":2861932,"date":"2025-06-27 10:09:34","modified":"2025-06-27 10:13:51","menu_order":0,"mime_type":"image\/gif","type":"image","subtype":"gif","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":392,"height":794,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","medium-width":129,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","medium_large-width":392,"medium_large-height":794,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","large-width":392,"large-height":794,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","1536x1536-width":392,"1536x1536-height":794,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","2048x2048-width":392,"2048x2048-height":794,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery-230x465.gif","card_image-width":230,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SliderActionSatelliteImagery.gif","wide_image-width":392,"wide_image-height":794}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The user of this app can now easily see the changes in autumn foliage over time at Laurel Ridge State Park. This capability could be used for anything from planning a sightseeing trip to see the colors at their best (mid October looks like peak time!) or to understanding how elevation affects the speed of foliage fall in the area.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2865022,"id":2865022,"title":"SatelliteResults","filename":"SatelliteResults.png","filesize":4149882,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/satelliteresults","alt":"Five mobile screens showing satellite imagery changes over time","author":"10242","description":"","caption":"The app showing satellite images from August to November 2024. You can see how foliage cover and color change over the autumn season.","name":"satelliteresults","status":"inherit","uploaded_to":2861932,"date":"2025-06-27 09:44:25","modified":"2025-06-27 09:47:24","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2195,"height":891,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults.png","medium-width":464,"medium-height":188,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults.png","medium_large-width":768,"medium_large-height":312,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults.png","large-width":1920,"large-height":779,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults-1536x623.png","1536x1536-width":1536,"1536x1536-height":623,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults-2048x831.png","2048x2048-width":2048,"2048x2048-height":831,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults-826x335.png","card_image-width":826,"card_image-height":335,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatelliteResults-1920x779.png","wide_image-width":1920,"wide_image-height":779}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2><strong>Integrating raster functions into the app<\/strong><\/h2>\n<p>By default, the Sentinel-2 image service renders rasters in <strong>natural color<\/strong>, which closely resembles what the human eye would see. This visualization is a great starting point for general exploration, but because Sentinel-2 imagery contains multiple spectral bands, the imagery can also be rendered in several other ways depending on your user\u2019s needs. This process of rendering can be controlled using <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/help\/analysis\/raster-functions\/raster-functions.htm\">raster functions<\/a> which are operations that apply processing directly to the pixels of raster datasets.<\/p>\n<p>The image service provides a range of predefined <strong>raster functions<\/strong> that allow you to dynamically change how the imagery is visualized. You can browse the raster functions available for the Sentinel-2 image service on its <a href=\"https:\/\/sentinel.arcgis.com\/arcgis\/rest\/services\/Sentinel2\/ImageServer\/rasterFunctionInfos\">rasterFunctionInfos URL<\/a>. For example, you could apply the <strong>Color Infrared with Dynamic Range Adjustment (<a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/help\/data\/imagery\/raster-display-ribbon.htm\">DRA<\/a>)<\/strong> function to emphasize vegetation health and seasonal change, making shifts in foliage across autumn far more pronounced than with natural color alone. Here healthy vegetation appears bright red, while areas of stressed or no vegetation appear dull red or brown. You can apply this visualization via a rendering rule with the following code:<\/p>\n<pre><code style=\"color: #24292e; background: #ffffff; display: block; overflow-x: auto; padding: 1em;\">\r\n  imageServiceRaster.renderingRule = RenderingRule.withRenderingRuleJson(\r\n      jsonEncode({\r\n        <span style=\"color: #032f62;\">'rasterFunction'<\/span>: <span style=\"color: #032f62;\">'Color Infrared with DRA'<\/span>,\r\n      }),\r\n    );\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"image","image":{"ID":2865052,"id":2865052,"title":"ImageryIR","filename":"ImageryIR.png","filesize":3615234,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\/imageryir","alt":"Four mobile phone screens displaying satellite imagery","author":"10242","description":"","caption":"Imagery is rendered with the Color Infrared with DRA raster function. Red areas reflect areas of healthy vegetation and earthy shades reflect poor or no vegetation.","name":"imageryir","status":"inherit","uploaded_to":2861932,"date":"2025-06-27 09:50:47","modified":"2025-06-27 09:52:13","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1767,"height":896,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR.png","medium-width":464,"medium-height":235,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR.png","medium_large-width":768,"medium_large-height":389,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR.png","large-width":1767,"large-height":896,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR-1536x779.png","1536x1536-width":1536,"1536x1536-height":779,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR.png","2048x2048-width":1767,"2048x2048-height":896,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR-826x419.png","card_image-width":826,"card_image-height":419,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/ImageryIR.png","wide_image-width":1767,"wide_image-height":896}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>In the above image, this Color Infrared raster function shows the user that the area was covered in healthy living vegetation on 12<sup>th<\/sup> September. Then in the second half of October, the user sees rapid changes as the leaves die and fall from the trees. By the end date of 27<sup>th<\/sup> October, evergreen vegetation present beneath the now bare trees can be seen where it was obscured before.<\/p>\n<p>This rendering flexibility gives you the ability to tailor the imagery to your use case, whether it\u2019s monitoring vegetation, identifying urban features, or visualizing moisture content &#8211; all without needing to preprocess the data manually.<\/p>\n<h3>Beyond image services<\/h3>\n<p>A quick visual analysis is great, but if you want to go beyond visualizing and processing raster data from image services, such as quantifying the data to chart and compare vegetation changes over time, you can use the <a href=\"https:\/\/developers.arcgis.com\/flutter\/layers\/add-raster-data\/\">Raster API tools<\/a> available from ArcGIS Maps SDKs for Native Apps. These tools let you apply a range of raster functions on rasters stored on the device (such as applying hillshade renderers to single band rasters like digital terrain models), and identify pixel values when interacting with a raster. You can check which raster functions are supported on the <a href=\"https:\/\/developers.arcgis.com\/flutter\/layers\/add-raster-data\/#supported-raster-functions\">Esri Developers website<\/a> (note, these are limited in number compared to those which may be available on image services). If you want to perform deeper statistical analysis, check out the <a href=\"https:\/\/developers.arcgis.com\/python\/latest\/guide\/raster-analysis-advanced-concepts\/\">ArcGIS Python API<\/a> or the <a href=\"https:\/\/developers.arcgis.com\/documentation\/spatial-analysis-services\/raster-analysis\/introduction\/\">Raster Analysis service<\/a> to build more advanced workflows.<\/p>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p>In this blog I\u2019ve stepped through how to use Flutter Maps SDK to create a mobile application that displays filtered and pre-processed satellite imagery from the Esri hosted Sentinel-2 Image Service. You\u2019ve learned a little about rasters and ArcGIS Image Services along the way too. Image services such as these allow developers to provide powerful imagery capabilities to their apps, backed by scalable, cloud hosted services and flexible client-side rendering. Quick visualization and server-side processing of rasters ensures seamless access to massive and constantly updated datasets without taking up local storage on the device.<\/p>\n<p>What I\u2019ve covered in this blog is just a small part of how you can manage working with rasters using Flutter Maps SDK (or any of ArcGIS Maps SDKs for Native Apps). For example, you can also render multiple rasters simultaneously and control their filtering order using mosaic rules. You can also work with locally stored raster data offline and apply raster functions to the data, such as applying hillshades to single band rasters or using raster calculator to calculate indices such as Normalized Difference Vegetation Index (NDVI), used to quantify vegetation greenness.<\/p>\n<p>You can learn more about working with rasters in Flutter Maps SDK in the <a href=\"https:\/\/developers.arcgis.com\/flutter\/layers\/add-raster-data\/\">Add Raster Data<\/a> documentation pages. Check out the following Flutter Maps SDK samples to learn more about how to build mobile apps using raster data (samples are also available for the other Native Maps SDKs):<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/add-raster-from-file\/\">Add raster from file<\/a> || <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/add-raster-from-service\/\">Add raster from service<\/a> || <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/apply-mosaic-rule-to-rasters\/\">Apply mosaic rule to rasters<\/a> || <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/apply-colormap-renderer-to-raster\/\">Apply colormap renderer to raster<\/a> || <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/apply-function-to-raster-from-file\/\">Apply function to raster from file<\/a> || <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/apply-raster-rendering-rule\/\">Apply raster rendering rule<\/a> || <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/identify-raster-cell\/\">Identify raster cell<\/a><\/strong><\/li>\n<\/ul>\n<p>Finally, you can find the source code for the app shown in this blog on my <a href=\"https:\/\/github.com\/Rachael-E\/s2-image-viewer\">GitHub repo<\/a> and use it as inspiration to build your own apps powered by satellite imagery!<\/p>\n<p style=\"text-align: center;\"><span style=\"color: #999999;\"><em>Credit: Images throughout this blog contain Copernicus Sentinel data 2024.<\/em><\/span><\/p>\n"}],"related_articles":[{"ID":2622922,"post_author":"10242","post_date":"2024-12-12 14:58:48","post_date_gmt":"2024-12-12 22:58:48","post_content":"","post_title":"How to map vehicle meeting points using ArcGIS Maps SDK for Flutter","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"map-vehicle-meeting-points-flutter","to_ping":"","pinged":"","post_modified":"2024-12-13 03:06:04","post_modified_gmt":"2024-12-13 11:06:04","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2622922","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2743462,"post_author":"7641","post_date":"2025-04-08 12:18:17","post_date_gmt":"2025-04-08 19:18:17","post_content":"","post_title":"Learn to explore Sentinel-2 imagery using Sentinel-2 Explorer","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"learn-sentinel-2-explorer","to_ping":"","pinged":"","post_modified":"2025-07-07 16:37:58","post_modified_gmt":"2025-07-07 23:37:58","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2743462","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2688382,"post_author":"7071","post_date":"2025-02-20 02:11:15","post_date_gmt":"2025-02-20 10:11:15","post_content":"","post_title":"Sentinel-2 Explorer - quickstart guide","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"sentinel-2-explorer-another-level-of-earth-observation","to_ping":"","pinged":"","post_modified":"2025-07-13 00:56:46","post_modified_gmt":"2025-07-13 07:56:46","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2688382","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2809082,"post_author":"366402","post_date":"2025-06-10 07:30:14","post_date_gmt":"2025-06-10 14:30:14","post_content":"","post_title":"Build smarter location-aware apps with Geotriggers in ArcGIS Maps SDK for Flutter","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"build-smarter-location-aware-apps-with-geotriggers-in-arcgis-maps-sdk-for-flutter","to_ping":"","pinged":"","post_modified":"2025-06-09 06:33:36","post_modified_gmt":"2025-06-09 13:33:36","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2809082","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/06\/SatAppCard.png","wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Integrate satellite imagery in mobile apps with Flutter Maps SDK<\/title>\n<meta name=\"description\" content=\"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to integrate satellite imagery in mobile app development with Flutter Maps SDK\" \/>\n<meta property=\"og:description\" content=\"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-01T09:51:31+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\"},\"author\":{\"name\":\"Rachael Ellen\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/d12aeaaab25c748cdf66a320bf0e72cd\"},\"headline\":\"How to integrate satellite imagery in mobile app development with Flutter Maps SDK\",\"datePublished\":\"2025-06-30T11:34:40+00:00\",\"dateModified\":\"2025-07-01T09:51:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\"},\"wordCount\":13,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"image services\",\"mobile applications\",\"native development\",\"raster visualization\",\"satellite imagery\"],\"articleSection\":[\"Developers\",\"Imagery &amp; Remote Sensing\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\",\"name\":\"Integrate satellite imagery in mobile apps with Flutter Maps SDK\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2025-06-30T11:34:40+00:00\",\"dateModified\":\"2025-07-01T09:51:31+00:00\",\"description\":\"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to integrate satellite imagery in mobile app development with Flutter Maps SDK\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/d12aeaaab25c748cdf66a320bf0e72cd\",\"name\":\"Rachael Ellen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg\",\"caption\":\"Rachael Ellen\"},\"description\":\"Rachael is a senior product engineer in the Developer Outreach team for the ArcGIS Maps SDKs for Native Apps. Following an academic career in geology, she switched careers by learning to code and now enjoys building apps with the Native Maps SDKs. She loves sharing code examples, fun geospatial development workflows and the latest product updates with developers via blogs and talks.\",\"sameAs\":[\"https:\/\/dev.to\/rachaele\/\",\"https:\/\/www.linkedin.com\/in\/rachael-ellen-8a852729\/\",\"https:\/\/x.com\/Geolocoder\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/rellen\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integrate satellite imagery in mobile apps with Flutter Maps SDK","description":"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.","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:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","og_locale":"en_US","og_type":"article","og_title":"How to integrate satellite imagery in mobile app development with Flutter Maps SDK","og_description":"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2025-07-01T09:51:31+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk"},"author":{"name":"Rachael Ellen","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/d12aeaaab25c748cdf66a320bf0e72cd"},"headline":"How to integrate satellite imagery in mobile app development with Flutter Maps SDK","datePublished":"2025-06-30T11:34:40+00:00","dateModified":"2025-07-01T09:51:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk"},"wordCount":13,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["image services","mobile applications","native development","raster visualization","satellite imagery"],"articleSection":["Developers","Imagery &amp; Remote Sensing"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","name":"Integrate satellite imagery in mobile apps with Flutter Maps SDK","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2025-06-30T11:34:40+00:00","dateModified":"2025-07-01T09:51:31+00:00","description":"Learn how to easily bring satellite imagery into your mobile app development using an image service and ArcGIS Maps SDK for Flutter.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-flutter\/developers\/how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"How to integrate satellite imagery in mobile app development with Flutter Maps SDK"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/d12aeaaab25c748cdf66a320bf0e72cd","name":"Rachael Ellen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg","caption":"Rachael Ellen"},"description":"Rachael is a senior product engineer in the Developer Outreach team for the ArcGIS Maps SDKs for Native Apps. Following an academic career in geology, she switched careers by learning to code and now enjoys building apps with the Native Maps SDKs. She loves sharing code examples, fun geospatial development workflows and the latest product updates with developers via blogs and talks.","sameAs":["https:\/\/dev.to\/rachaele\/","https:\/\/www.linkedin.com\/in\/rachael-ellen-8a852729\/","https:\/\/x.com\/Geolocoder"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/rellen"}]}},"text_date":"June 30, 2025","author_name":"Rachael Ellen","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/rellen","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcGIS Maps SDK for Flutter","tag_data":[{"term_id":26011,"name":"image services","slug":"image-services","term_group":0,"term_taxonomy_id":26011,"taxonomy":"post_tag","description":"","parent":0,"count":18,"filter":"raw"},{"term_id":215372,"name":"mobile applications","slug":"mobile-applications","term_group":0,"term_taxonomy_id":215372,"taxonomy":"post_tag","description":"","parent":0,"count":8,"filter":"raw"},{"term_id":773362,"name":"native development","slug":"native-development","term_group":0,"term_taxonomy_id":773362,"taxonomy":"post_tag","description":"","parent":0,"count":8,"filter":"raw"},{"term_id":590751,"name":"raster visualization","slug":"raster-visualization","term_group":0,"term_taxonomy_id":590751,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":33451,"name":"satellite imagery","slug":"satellite-imagery","term_group":0,"term_taxonomy_id":33451,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"}],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":426,"filter":"raw"},{"term_id":22931,"name":"Imagery &amp; Remote Sensing","slug":"imagery","term_group":0,"term_taxonomy_id":22931,"taxonomy":"category","description":"","parent":0,"count":772,"filter":"raw"}],"product_data":[{"term_id":36951,"name":"ArcGIS Image Server","slug":"image-server","term_group":0,"term_taxonomy_id":36951,"taxonomy":"product","description":"","parent":36571,"count":69,"filter":"raw"},{"term_id":776202,"name":"ArcGIS Maps SDK for Flutter","slug":"sdk-flutter","term_group":0,"term_taxonomy_id":776202,"taxonomy":"product","description":"","parent":36601,"count":19,"filter":"raw"},{"term_id":36561,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":36561,"taxonomy":"product","description":"","parent":0,"count":2055,"filter":"raw"},{"term_id":36861,"name":"ArcGIS REST API","slug":"api-rest","term_group":0,"term_taxonomy_id":36861,"taxonomy":"product","description":"","parent":36601,"count":75,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":765,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=sdk-flutter","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2861932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/10242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2861932"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2861932\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2861932"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2861932"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2861932"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2861932"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2861932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}