{"id":2102902,"date":"2023-10-25T08:45:17","date_gmt":"2023-10-25T15:45:17","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2102902"},"modified":"2024-04-12T01:11:07","modified_gmt":"2024-04-12T08:11:07","slug":"integrate-restful-services-with-the-native-maps-sdks","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks","title":{"rendered":"Integrating the Places Service with the Native Maps SDKs using HTTPS requests"},"author":346302,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191],"tags":[762922,28891,29761],"industry":[],"product":[761642,769142,769162,768902,769152,768912],"class_list":["post-2102902","blog","type-blog","status-publish","format-standard","hentry","category-developers","tag-location-services","tag-native","tag-places","product-platform","product-sdk-net","product-sdk-java","product-sdk-kotlin","product-sdk-qt","product-sdk-swift"],"acf":{"authors":[{"ID":346302,"user_firstname":"Andrew","user_lastname":"Bladon","nickname":"abladon","user_nicename":"abladon","display_name":"Andrew Bladon","user_email":"abladon@esri.com","user_url":"","user_registered":"2023-09-22 12:52:41","user_description":"Andrew is a Software Engineer working on the ArcGIS Maps SDKs for Native Apps in Esri\u2019s Edinburgh R&amp;D Centre. Andrew helps bring the latest features available in ArcGIS location services into the core C++ business logic used by the Native Maps SDKs. Andrew has a Bachelor of Science and PhD in Geology, and prior to working with Esri he spent seven years working as a Consultant and Product Engineer for a geological modelling software company.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ABladon_Headshot-465x465.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"A guide to integrating RESTful services with the ArcGIS Native Maps SDKs using HTTPS requests","flexible_content":[{"acf_fc_layout":"content","content":"<p style=\"text-align: center;\"><strong><em>This blog demonstrates how to integrate RESTful services, such as the Places Service, with the Native Maps SDKs by making HTTPS requests using native development frameworks.<\/em><\/strong><\/p>\n<h2 id=\"1\"><strong>Introduction<\/strong><\/h2>\n<p>The <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/places\/\">places service<\/a> has recently been added to the rich set of ArcGIS location services for Developers. This new service facilitates a better awareness of location in a given area by letting you search for places, or points of interest. While there is a plan to build an API for the places service in a future version of the <a href=\"https:\/\/developers.arcgis.com\/documentation\/glossary\/arcgis-maps-sdks-for-native-apps\/\">ArcGIS Maps SDKs for Native Apps<\/a> (Native Maps SDKs), the service follows a REST architectural style and can therefore be integrated with Native Maps SDKs apps today by making HTTPS requests directly.<\/p>\n<p>To improve my understanding of how the places service could be integrated with the Native Maps SDKs, I decided to expand the spatial awareness capabilities of an internal test app built using the ArcGIS Maps SDK for .NET (.NET Maps SDK). To do this, I implemented the logic for constructing URLs and making HTTPS requests to the places service. The result was significant improvements to the spatial awareness capabilities of the app. To help other Native SDK users add these capabilities to their apps, I have summarized the key learnings from this process.<\/p>\n<p>In this blog, I will:<\/p>\n<ul>\n<li><a href=\"#6\">Outline how to construct a URL suitable for making a request to the places service.<\/a><\/li>\n<li><a href=\"#7\">Give an overview of sending HTTPS requests.<\/a><\/li>\n<li><a href=\"#8\">Outline how responses from the places service can be processed and displayed on a map.<\/a><\/li>\n<li><a href=\"#10\">Describe how to request additional information for a place.<\/a><\/li>\n<li><a href=\"#11\">Discuss how the places service can be integrated with existing Native SDK geocoding tools (i.e., <strong><em>SearchView<\/em><\/strong> toolkit component).<\/a><\/li>\n<\/ul>\n<p>Where applicable, I\u2019ve provided C# code snippets to help support the descriptions in the text. You can also see the places service being used in an ArcGIS Maps SDK for Java desktop application on my colleague\u2019s <a href=\"https:\/\/github.com\/Rachael-E\/places-service-java-demo\">GitHub repository<\/a>.<\/p>\n<p>Before we jump into the technical details, let&#8217;s first take a look at the terminology I&#8217;ll be using throughout this blog, <em>place<\/em> and <em>places service<\/em>.<\/p>\n<h2 id=\"2\"><strong>What is a place?<\/strong><\/h2>\n<p>A <em>place<\/em>, also known as a <em>point of interest<\/em>, is a geographical location that is relevant to a user&#8217;s current interest or requirements. The relevance of a given place is dependent on the time, context, and user requirements. For example, the location of a bar is likely to be relevant later in the day (<em>time<\/em>) for someone who is not working (<em>context<\/em>) and is looking for a place to socialize (<em>user requirements<\/em>).<\/p>\n<h2 id=\"3\"><strong>What is the places service?<\/strong><\/h2>\n<p>The <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/places\/\">places service<\/a> is a vast collection of global spatial data (over 50 million places and growing) that can be queried in order to identify places in a given area. The data includes detailed information about each place, such as street address, website, opening hours, and user rating. Data are categorized using over 1000 <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/places\/places-category-finder\/\">categories<\/a>, including restaurants, stores, parks, parking, and zoos. As such, queries can be made using a combination of a search string and category ID, and can therefore be as vague (e.g., <em>food<\/em>) or as detailed (e.g., <em>Bonnie Burrito<\/em> in the <em>Burrito Restaurant<\/em> category) as required.<\/p>\n<p>The service is managed and curated by Esri and follows a REST architectural style (a.k.a. RESTful), so is simple and easy to use. Requests are made using HTTPS calls to the <a href=\"https:\/\/placesdev-api.arcgis.com\/arcgis\/rest\/services\/places-service\/v1\/specification\/open-api-v3-0\">open-api spec compliant REST API<\/a>. Each request must be authenticated, either using an API key or an ArcGIS Identity, and is charged in accordance with the ArcGIS location services <a href=\"https:\/\/developers.arcgis.com\/pricing\/\">pricing structure<\/a>, which includes a free tier.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2102952,"id":2102952,"title":"ExampleOfPlacesSearch","filename":"ExampleOfPlacesSearch.gif","filesize":6006082,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\/exampleofplacessearch","alt":"","author":"346302","description":"","caption":"A search for restaurants in Leith (Edinburgh) using the places service. Places are displayed on the map. Additional information (e.g. address, contact information, and opening hours) is displayed in a callout when a place is clicked. The GIF shows an Esri-internal test app that was created using the .NET Maps SDK.","name":"exampleofplacessearch","status":"inherit","uploaded_to":2102902,"date":"2023-10-17 10:27:56","modified":"2023-10-17 10:30:59","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":980,"height":720,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","medium-width":355,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","medium_large-width":768,"medium_large-height":564,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","large-width":980,"large-height":720,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","1536x1536-width":980,"1536x1536-height":720,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","2048x2048-width":980,"2048x2048-height":720,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch-633x465.gif","card_image-width":633,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ExampleOfPlacesSearch.gif","wide_image-width":980,"wide_image-height":720}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Now we\u2019ve established the definitions of a place and the places service, we can dive into the practicalities of using the service with the Native Maps SDKs!<\/p>\n<h2 id=\"4\"><strong>Prerequisites?<\/strong><\/h2>\n<p>Before starting to use the places service, I needed to setup the following:<\/p>\n<ul>\n<li>A free ArcGIS Developer account (<a href=\"https:\/\/developers.arcgis.com\/sign-up\/\">sign-up<\/a>) (note: <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/deployment\/accounts\/#arcgis-online-accounts\">ArcGIS Online accounts<\/a> do not have the necessary permissions to use the places service).\n<ul style=\"padding-left: 40px;\">\n<li><strong>Note:<\/strong> Each account is allocated a number of free requests (free tier), with additional requests being charged in accordance with the ArcGIS location services <a href=\"https:\/\/developers.arcgis.com\/pricing\/\">pricing structure<\/a>.<\/li>\n<\/ul>\n<\/li>\n<li>One of the following authentication methods (used as the token to authenticate the places service request):\n<ul style=\"padding-left: 40px;\">\n<li>An ArcGIS Identity, which is a short-lived token generated via <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/security\/oauth-2\/\">OAuth 2.0<\/a>.<\/li>\n<li>An API key, which can be <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/security\/api-keys\/#api-key-management\">created using the Developer Dashboard with an ArcGIS Developer account<\/a> or <a href=\"https:\/\/www.postman.com\/esridevs\/workspace\/authentication-in-arcgis\/collection\/15786767-04f0cd88-1d89-42ce-af76-529987cd5a9a\">by making REST requests<\/a>. The API key must have the places service scope enabled (see <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/security\/api-keys\/#api-key-scopes\">API key scopes<\/a>).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"5\"><strong>Overview of process for making a request<\/strong><\/h2>\n<p>With a developer account and an authentication method setup, I started to learn how to make HTTPS request to the RESTful places service. I\u2019ve provided a high-level overview of the process below:<\/p>\n<ol type=\"1\">\n<li>Create a URL containing the search parameters to look for nearby places.<\/li>\n<li>Send the request to the places service and await the response.<\/li>\n<li>Deserialize the result from JSON format into user-defined classes. If there is more than one &#8220;page&#8221; of results (i.e., results are paginated):\n<ol style=\"padding-left: 40px;\" type=\"a\">\n<li>Send additional requests.<\/li>\n<li>Deserialize the responses.<\/li>\n<li>Append the places to the list of results.<\/li>\n<\/ol>\n<\/li>\n<li>Display the results on a map.<\/li>\n<li>If desired, send a request for additional information about a specific place.<\/li>\n<\/ol>\n<p>I\u2019ll discuss each of these steps in more detail in the next sections.<\/p>\n<h2 id=\"6\"><strong>Creating a URL<\/strong><\/h2>\n<p>Calls to the places service are made by sending HTTPS requests. Each URL used to make a call to the places service requires the following elements:<\/p>\n<ol type=\"1\">\n<li><strong>Service URL<\/strong>, comprising:\n<ol style=\"padding-left: 40px;\" type=\"a\">\n<li><strong>Scheme:<\/strong> <em>https:\/\/<\/em><\/li>\n<li><strong>Domain name:<\/strong> <em>places-api.arcgis.com\/<\/em><\/li>\n<li><strong>Path:<\/strong> <em>arcgis\/rest\/services\/places-service\/v1\/<\/em><\/li>\n<\/ol>\n<\/li>\n<li><strong>Request Type:<\/strong> The type of request (e.g., <em>places\/near-point\/<\/em> or <em>category\/{categoryId}<\/em>). See the <a href=\"https:\/\/developers.arcgis.com\/rest\/places\/#requests\">Requests<\/a> section of the places documentation for a list of all request types.<\/li>\n<li><strong>Parameter List<\/strong> (a.k.a. query string): A string, the start of which is denoted using the <strong><em>?<\/em><\/strong> character, which contains a list of key-value pairs, each denoted using an <strong><em>&amp;<\/em><\/strong> character.\n<ul style=\"padding-left: 40px;\">\n<li>Included in the parameter list must be a token for authentication (see prerequisites section for more information).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>I\u2019ve written an example of manually constructing a URL from each of the elements outlined above in the C# snippet below (<em>all code snippets in this blog are in C# and can be used with the .NET Maps SDK. However, similar workflows can be followed for other Native Maps SDKs products<\/em>).<\/p>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: 100%; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\"><span style=\"color: #b00040;\">string<\/span> _scheme = <span style=\"color: #ba2121;\">\"https:\/\/\"<\/span>;\r\n<span style=\"color: #b00040;\">string<\/span> _domainName = <span style=\"color: #ba2121;\">\"places-api.arcgis.com\/\"<\/span>;\r\n<span style=\"color: #b00040;\">string<\/span> _path = <span style=\"color: #ba2121;\">\"arcgis\/rest\/services\/places-service\/v1\/\"<\/span>;\r\n<span style=\"color: #b00040;\">string<\/span> _requestType = <span style=\"color: #ba2121;\">\"places\/near-point\"<\/span>;\r\n<span style=\"color: #b00040;\">string<\/span> _parameterList = <span style=\"color: #ba2121;\">\"?searchText=bakery&amp;x=-3.19551&amp;y=55.94417&amp;radius=100&amp;f=pjson&amp;token=&lt;ACCESS_TOKEN&gt;\"<\/span>;\r\n\r\nConsole.WriteLine(_scheme + _domainName + _path + _requestType + _parameterList);\r\n\r\n<span style=\"color: #408080; font-style: italic;\">\/\/ Prints: https:\/\/places-api.arcgis.com\/arcgis\/rest\/services\/places-service\/v1\/places\/near-point?searchText=bakery&amp;x=-3.19551&amp;y=55.94417&amp;radius=100&amp;f=pjson&amp;token=&lt;ACCESS_TOKEN&gt;<\/span>\r\n<\/pre>\n<\/div>\n<div>\n<pre style=\"background-color: white; color: black; padding: 10px; border-color: solid black; border-width: .1em .1em .1em .8em; font-size: smaller;\"><span style=\"font-weight: bold;\">Note:<\/span> copying the URL in the snippet above into a browser will enable you to make a request and see the response. To do this, you will need to replace the <span style=\"font-weight: bold;\">&lt;ACCESS_TOKEN&gt;<\/span> statement with a valid token.\r\n<\/pre>\n<\/div>\n<p>This request is a \u201cnearby\u201d search, meaning we are requesting places within a certain radius of a given location (note: the radius parameter is optional and has a default value of 1000m). The key-value pairs (identified by <strong><em>&amp;<\/em><\/strong> character) in the parameter list (starts after the <strong><em>?<\/em><\/strong> character), describe a request for any place associated with the word \u201cbakery\u201d and within 100m of the location with a latitude of 55.94417 and a longitude of -3.19551 (Esri&#8217;s Edinburgh R&amp;D Office). The results are to be returned in pretty JSON format (<strong><em>f=pjson<\/em><\/strong>) and the request should be authenticated using the specified token. A request such as this helps us developers find the location of the nearest cruffin!<\/p>\n<p>There are more examples of requests being made to the places service on the <a href=\"https:\/\/www.postman.com\/esridevs\/workspace\/arcgis-location-services\/collection\/23458780-d4b7115d-76b3-4448-94ee-71d97dd41685\">esridevs Postman places service page<\/a>.<\/p>\n<h2 id=\"7\"><strong>Sending a request<\/strong><\/h2>\n<p>Many development frameworks provide helper classes, or there are freely available libraries that can be used to make HTTPS requests with a given URL. In this blog, I\u2019ve assumed you have access to relevant helper classes or a suitable library. To help you identify these, here\u2019s a few suggestions for some of the Native SDK development frameworks (Java, Swift, Qt, and .NET):<\/p>\n<table style=\"margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<th style=\"background-color: #999999;\"><strong>Development Framework<\/strong><\/th>\n<th style=\"background-color: #999999;\"><strong>Helper classes\/libraries<\/strong><\/th>\n<\/tr>\n<tr>\n<td>.NET<\/td>\n<td><strong><em>HttpClient<\/em><\/strong>, <strong><em>UriBuilder<\/em><\/strong>, and <strong><em>HttpUtility<\/em><\/strong><\/td>\n<\/tr>\n<tr>\n<td>Qt<\/td>\n<td><strong><em>QNetworkRequest<\/em><\/strong>, <strong><em>QUrl<\/em><\/strong>, and <strong><em>QUrlQuery<\/em><\/strong><\/td>\n<\/tr>\n<tr>\n<td>Swift<\/td>\n<td><strong><em>URLSession<\/em><\/strong> and <strong><em>swift-http-types<\/em><\/strong> library<\/td>\n<\/tr>\n<tr>\n<td>Java<\/td>\n<td><strong><em>HttpClient<\/em><\/strong>, <strong><em>HttpRequest<\/em><\/strong>, <strong><em>URI<\/em><\/strong>, and <strong><em>HttpURLConnection<\/em><\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>There\u2019s also an example of making an HTTPS request using the <strong><em>HttpClient<\/em><\/strong>, <strong><em>UriBuilder<\/em><\/strong>, <strong><em>HttpUtility<\/em><\/strong>, and <strong><em>HttpResponseMessage<\/em><\/strong> helper classes from the .NET framework in the code snippet below.<\/p>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\"><span style=\"color: #008000; font-weight: bold;\">async<\/span> Task&lt;<span style=\"color: #b00040;\">string<\/span>&gt; MakeRequest()\r\n{\r\n    HttpClient _httpClient = <span style=\"color: #008000; font-weight: bold;\">new<\/span>(); <span style=\"color: #408080; font-style: italic;\">\/\/ Instantiate one HttpClient in an application.<\/span>\r\n    <span style=\"color: #b00040;\">string<\/span> _response = <span style=\"color: #ba2121;\">\"\"<\/span>;\r\n\r\n    <span style=\"color: #008000; font-weight: bold;\">try<\/span>\r\n    {\r\n        System.Net.Http.HttpResponseMessage _httpResponse = <span style=\"color: #008000; font-weight: bold;\">await<\/span> _httpClient.GetAsync(ConstructURLUsingBuilder());\r\n        <span style=\"color: #008000; font-weight: bold;\">if<\/span> (!_httpResponse.IsSuccessStatusCode)\r\n            <span style=\"color: #008000; font-weight: bold;\">throw<\/span> <span style=\"color: #008000; font-weight: bold;\">new<\/span> <span style=\"color: #0000ff;\">Exception<\/span>(<span style=\"color: #ba2121;\">\"Response status code: \"<\/span> + _httpResponse.StatusCode);\r\n        _response = <span style=\"color: #008000; font-weight: bold;\">await<\/span> _httpResponse.Content.ReadAsStringAsync();\r\n    }\r\n    <span style=\"color: #008000; font-weight: bold;\">catch<\/span> (HttpRequestException e)\r\n    {\r\n        Console.WriteLine(<span style=\"color: #ba2121;\">\"Message: {0} \"<\/span>, e.Message);\r\n    }\r\n    <span style=\"color: #008000; font-weight: bold;\">return<\/span> _response;\r\n}\r\n\r\nUri <span style=\"color: #0000ff;\">ConstructURLUsingBuilder<\/span>()\r\n{\r\n    UriBuilder _uriBuilder = <span style=\"color: #008000; font-weight: bold;\">new<\/span>(<span style=\"color: #ba2121;\">\"places-api.arcgis.com\"<\/span>);\r\n\r\n    <span style=\"color: #b00040;\">string<\/span> _path = <span style=\"color: #ba2121;\">\"\/arcgis\/rest\/services\/places-service\/v1\/\"<\/span>;\r\n    <span style=\"color: #b00040;\">string<\/span> _requestType = <span style=\"color: #ba2121;\">\"places\/near-point\"<\/span>;\r\n\r\n    _uriBuilder.Path = _path + _requestType;\r\n\r\n    NameValueCollection _urlParameters = HttpUtili-ty.ParseQueryString(_uriBuilder.Query);\r\n\r\n    _urlParameters[<span style=\"color: #ba2121;\">\"searchText\"<\/span>] = <span style=\"color: #ba2121;\">\"bakery\"<\/span>;\r\n    _urlParameters[<span style=\"color: #ba2121;\">\"x\"<\/span>] = <span style=\"color: #ba2121;\">\"-3.19551\"<\/span>;\r\n    _urlParameters[<span style=\"color: #ba2121;\">\"y\"<\/span>] = <span style=\"color: #ba2121;\">\"55.94417\"<\/span>;\r\n    _urlParameters[<span style=\"color: #ba2121;\">\"radius\"<\/span>] = <span style=\"color: #ba2121;\">\"100\"<\/span>;\r\n    _urlParameters[<span style=\"color: #ba2121;\">\"f\"<\/span>] = <span style=\"color: #ba2121;\">\"pjson\"<\/span>;\r\n    _urlParameters[<span style=\"color: #ba2121;\">\"token\"<\/span>] = <span style=\"color: #ba2121;\">\"&lt;ACCESS_TOKEN&gt;\"<\/span>;\r\n\r\n    _uriBuilder.Query = _urlParameters.ToString();\r\n\r\n    <span style=\"color: #008000; font-weight: bold;\">return<\/span> _uriBuilder.Uri;\r\n}\r\n<\/pre>\n<\/div>\n<h2 id=\"8\"><strong>Process the response<\/strong><\/h2>\n<p>So, we now know how to send an HTTPS request to the RESTful places service! Next, we\u2019ll look at the response from the service and understand how we can process it.<\/p>\n<h5><strong><em>Response format<\/em><\/strong><\/h5>\n<p>Requests made to the places service return information in JSON format (or Pretty JSON format). The example request shown above returns the following response:<\/p>\n<div>\n<pre style=\"background: white; overflow: auto; width: auto; border: white; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\">{\r\n  <span style=\"color: #008000; font-weight: bold;\">\"results\"<\/span>: [\r\n    {\r\n      <span style=\"color: #008000; font-weight: bold;\">\"placeId\"<\/span>: <span style=\"color: #ba2121;\">\"b36eaff62de292c31c99a7ed4e47c2d2\"<\/span>,\r\n      <span style=\"color: #008000; font-weight: bold;\">\"location\"<\/span>: {\r\n        <span style=\"color: #008000; font-weight: bold;\">\"x\"<\/span>: <span style=\"color: #666666;\">-3.194024<\/span>,\r\n        <span style=\"color: #008000; font-weight: bold;\">\"y\"<\/span>: <span style=\"color: #666666;\">55.943964<\/span>\r\n      },\r\n      <span style=\"color: #008000; font-weight: bold;\">\"categories\"<\/span>: [\r\n        {\r\n          <span style=\"color: #008000; font-weight: bold;\">\"categoryId\"<\/span>: <span style=\"color: #ba2121;\">\"13002\"<\/span>,\r\n          <span style=\"color: #008000; font-weight: bold;\">\"label\"<\/span>: <span style=\"color: #ba2121;\">\"Bakery\"<\/span>\r\n        },\r\n        {\r\n          <span style=\"color: #008000; font-weight: bold;\">\"categoryId\"<\/span>: <span style=\"color: #ba2121;\">\"13065\"<\/span>,\r\n          <span style=\"color: #008000; font-weight: bold;\">\"label\"<\/span>: <span style=\"color: #ba2121;\">\"Restaurant\"<\/span>\r\n        }\r\n      ],\r\n      <span style=\"color: #008000; font-weight: bold;\">\"name\"<\/span>: <span style=\"color: #ba2121;\">\"Soderberg Pavillon\"<\/span>,\r\n      <span style=\"color: #008000; font-weight: bold;\">\"distance\"<\/span>: <span style=\"color: #666666;\">95.3<\/span>\r\n    }\r\n  ]\r\n}\r\n<\/pre>\n<\/div>\n<p>In the example shown above, the response comprises an array called <strong>results<\/strong> that contains places meeting the search criteria. In this case, the array contains one place. Each place has a <strong>placeId<\/strong>, <strong>location<\/strong>, array of <strong>categories<\/strong> (a place can be associated with multiple categories), and a <strong>name<\/strong>. Additionally, because the type of the request is <em>near-point<\/em>, each result has a <strong>distance<\/strong> attribute.<\/p>\n<p>You can find more detailed information about the content of the response for each request type in the places service documentation (e.g. <a href=\"https:\/\/developers.arcgis.com\/rest\/places\/near-point-get\/#response-details\">near-point Response details<\/a>).<\/p>\n<h5><strong><em>Deserialization<\/em><\/strong><\/h5>\n<p>With the json response from the places service, we now need to parse the information. Many development frameworks include a JSON deserializer which can be used to convert a JSON string into user-defined objects, for example:<\/p>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\">PlaceResult? placeResult = JsonConvert.DeserializeObject&lt;PlaceResult&gt;(searchResult);\r\n<\/pre>\n<\/div>\n<p>To deserialize the response, I needed to define some custom C# classes, which I\u2019ve shown in the snippet below. <strong>Note:<\/strong> These are objects that were created for the purposes of this blog and are not included with the Native Maps SDKs.<\/p>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\"><span style=\"color: #008000; font-weight: bold;\">class<\/span> <span style=\"color: #0000ff; font-weight: bold;\">PlaceResult<\/span>\r\n{\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> List&lt;Place&gt; results;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> Pagination? pagination;\r\n}\r\n\r\n<span style=\"color: #008000; font-weight: bold;\">class<\/span> <span style=\"color: #0000ff; font-weight: bold;\">Pagination<\/span>\r\n{\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> Uri previousUrl;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> Uri nextUrl;\r\n}\r\n\r\n<span style=\"color: #008000; font-weight: bold;\">class<\/span> <span style=\"color: #0000ff; font-weight: bold;\">Place<\/span>\r\n{\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> <span style=\"color: #b00040;\">string<\/span> placeId;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> PlaceLocation location;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> List&lt;Category&gt; categories;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> <span style=\"color: #b00040;\">string<\/span> name;\r\n}\r\n\r\n<span style=\"color: #008000; font-weight: bold;\">class<\/span> <span style=\"color: #0000ff; font-weight: bold;\">PlaceLocation<\/span>\r\n{\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> <span style=\"color: #b00040;\">float<\/span> x;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> <span style=\"color: #b00040;\">float<\/span> y;\r\n}\r\n\r\n<span style=\"color: #008000; font-weight: bold;\">class<\/span> <span style=\"color: #0000ff; font-weight: bold;\">Category<\/span>\r\n{\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> <span style=\"color: #b00040;\">int<\/span> categoryId;\r\n    <span style=\"color: #008000; font-weight: bold;\">public<\/span> <span style=\"color: #b00040;\">string<\/span> label;\r\n}\r\n<\/pre>\n<\/div>\n<h5><strong><em>Pagination<\/em><\/strong><\/h5>\n<p>While processing results, I became aware of the concept of pagination. The total number of results returned by a request to the places service is limited to 200. However, a single response cannot return 200 results, so the results are paginated (i.e., split into pages). The default number of results returned in a single response (i.e., default page size) is 10, but you can decrease or increase this up to a maximum of 20 results by setting the <strong>pageSize<\/strong> parameter in the URL&#8217;s parameter string. If the number of results exceeds the page size, you will need to make more requests to retrieve additional pages of results. To help with this, the URL required to retrieve the next page of results is included in the response as a <strong>pagination<\/strong> object that has a <strong>nextUrl<\/strong> attribute. You can see examples of paging through results on the <a href=\"https:\/\/www.postman.com\/esridevs\/workspace\/arcgis-location-services\/collection\/23458780-d4b7115d-76b3-4448-94ee-71d97dd41685\">esridev postman places service page<\/a>.<\/p>\n<h2 id=\"9\"><strong>Displaying places on the map<\/strong><\/h2>\n<p>With the list of places retrieved from the places service, I needed to display the results on a map. To do this, I decided to use two key elements:<\/p>\n<ul>\n<li>Point <strong><em>Symbol<\/em><\/strong><\/li>\n<li><strong><em>Label<\/em><\/strong> to display the place name.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"image","image":{"ID":2116662,"id":2116662,"title":"Example_Symbol_and_Label","filename":"Example_Symbol_and_Label.png","filesize":4202,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\/example_symbol_and_label","alt":"","author":"346302","description":"","caption":"Places can be displayed on the map using a pin symbol and label.","name":"example_symbol_and_label","status":"inherit","uploaded_to":2102902,"date":"2023-10-25 13:08:48","modified":"2023-10-25 13:09:06","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":224,"height":76,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label-213x76.png","thumbnail-width":213,"thumbnail-height":76,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","medium-width":224,"medium-height":76,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","medium_large-width":224,"medium_large-height":76,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","large-width":224,"large-height":76,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","1536x1536-width":224,"1536x1536-height":76,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","2048x2048-width":224,"2048x2048-height":76,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","card_image-width":224,"card_image-height":76,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Example_Symbol_and_Label.png","wide_image-width":224,"wide_image-height":76}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>To achieve this, I setup the following:<\/p>\n<ol>\n<li>A <strong><em>LabelDefinition<\/em><\/strong> object with <strong><em>expression<\/em><\/strong> and <strong><em>textSymbol<\/em><\/strong> properties defined.\n<ul style=\"padding-left: 40px;\">\n<li>I used a <strong><em>SimpleLabelExpression<\/em><\/strong> object as the <strong><em>expression<\/em><\/strong> property. Be aware &#8211; the term used in the label expression (\u201cName\u201d in the snippet below) needs to match the name of the attribute that you assign to the <strong><em>Graphic<\/em><\/strong> for each result.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\"><span style=\"color: #008000; font-weight: bold;\">private<\/span> LabelDefinition _placesResultLabelDefinition = <span style=\"color: #008000; font-weight: bold;\">new<\/span> LabelDefinition\r\n(\r\n    <span style=\"color: #008000; font-weight: bold;\">new<\/span> <span style=\"color: #0000ff;\">SimpleLabelExpression<\/span>(<span style=\"color: #ba2121;\">\"[Name]\"<\/span>),\r\n    <span style=\"color: #008000; font-weight: bold;\">new<\/span> Esri.ArcGISRuntime.Symbology.TextSymbol(\r\n            <span style=\"color: #ba2121;\">\"SearchResult\"<\/span>,\r\n            System.Drawing.Color.Black,\r\n            <span style=\"color: #666666;\">15<\/span>,\r\n            Esri.ArcGISRuntime.Symbology.HorizontalAlignment.Left,\r\n            Esri.ArcGISRuntime.Symbology.VerticalAlignment.Top\r\n        )\r\n);\r\n<\/pre>\n<\/div>\n<ol start=\"2\">\n<li>A <strong><em>GraphicsOverlay<\/em><\/strong>, ensuring this is in the <strong><em>Map<\/em><\/strong>&#8216;s list of operational layers.\n<ul style=\"padding-left: 40px;\">\n<li>The <strong><em>LabelsEnabled<\/em><\/strong> property should be set to <strong><em>true<\/em><\/strong>.<\/li>\n<li>The <strong><em>LabelDefinition<\/em><\/strong> created above should be added to the <strong><em>LabelDefinitions<\/em><\/strong> list.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\">_placesResultOverlay = <span style=\"color: #008000; font-weight: bold;\">new<\/span> GraphicsOverlay { Id = <span style=\"color: #ba2121;\">\"Places_Search_Result_Overlay\"<\/span> };\r\n_placesResultOverlay.LabelDefinitions.Add(_placesResultLabelDefinition);\r\n_placesResultOverlay.LabelsEnabled = <span style=\"color: #008000; font-weight: bold;\">true<\/span>;\r\n_mapView.GraphicsOverlays?.Add(_placesResultOverlay);\r\n<\/pre>\n<\/div>\n<ol start=\"3\">\n<li>A <strong><em>Symbol<\/em><\/strong> object to define how a place is displayed on the <strong><em>Map<\/em><\/strong>.\n<ul style=\"padding-left: 40px;\">\n<li>Use the <strong><em>SimpleSymbolStyle<\/em><\/strong> class to create simple symbols (e.g., circles, squares, or crosses).<\/li>\n<li>More complex point symbols can be created using a <strong><em>MultiLayerPointSymbol<\/em><\/strong>.<\/li>\n<li>I decided to use the <strong>esri-pin-2<\/strong> symbol to display the location of places. I\u2019ve shown how to set this up below:<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\"><span style=\"color: #408080; font-style: italic;\">\/\/ Retrieve the Esri2DPointSymbolStyle collection of web symbol styles from default ArcGIS Online portal.<\/span>\r\nArcGISPortal portal = <span style=\"color: #008000; font-weight: bold;\">await<\/span> ArcGISPortal.CreateAsync();\r\nSymbolStyle esri2DPointSymbolStyle = <span style=\"color: #008000; font-weight: bold;\">await<\/span> SymbolStyle.OpenAsync(<span style=\"color: #ba2121;\">\"Esri2DPointSymbolsStyle\"<\/span>, portal);\r\n\r\n<span style=\"color: #408080; font-style: italic;\">\/\/ Get desired esri-pin-2 symbol and change colour to Red.<\/span>\r\nMultilayerPointSymbol? pinSymbol = <span style=\"color: #008000; font-weight: bold;\">await<\/span> esri2DPointSymbolStyle.GetSymbolAsync(<span style=\"color: #008000; font-weight: bold;\">new<\/span> List&lt;<span style=\"color: #b00040;\">string<\/span>&gt; { <span style=\"color: #ba2121;\">\"esri-pin-2\"<\/span> }) <span style=\"color: #008000; font-weight: bold;\">as<\/span> MultilayerPointSymbol;\r\n<span style=\"color: #008000; font-weight: bold;\">if<\/span> (pinSymbol != <span style=\"color: #008000; font-weight: bold;\">null<\/span>)\r\n    pinSymbol.Color = System.Drawing.Color.Red;\r\n<\/pre>\n<\/div>\n<p>Once I had a <strong><em>LabelDefinition<\/em><\/strong> assigned to the <strong><em>GraphicsOverlay<\/em><\/strong> and an appropriate <strong><em>Symbol<\/em><\/strong>, I could display the results returned from the places service by doing the following for each result:<\/p>\n<ol>\n<li>Creating a point geometry object (e.g., <strong><em>Point<\/em><\/strong> or <strong><em>MapPoint<\/em><\/strong>) using the latitude and longitude of the place.<\/li>\n<li>Creating a <strong><em>Graphic<\/em><\/strong> object using the point geometry. I used the geometry created in the previous step as well as the symbol object defined earlier.<\/li>\n<li>Adding two attributes to the <strong><em>Graphic<\/em><\/strong>, one for the <strong><em>name<\/em><\/strong> of the place and another for the <strong><em>placeId<\/em><\/strong>.\n<ul style=\"padding-left: 40px;\">\n<li>Remember, you need to ensure that the term used to define the \u201cName\u201d attribute matches the term you used in the <strong><em>LabelDefinition.expression<\/em><\/strong> that you defined previously.<\/li>\n<\/ul>\n<\/li>\n<li>Adding the <strong><em>Graphic<\/em><\/strong> to the list of <strong><em>Graphics<\/em><\/strong> on the <strong><em>GraphicsOverlay<\/em><\/strong>.<\/li>\n<\/ol>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\"><span style=\"color: #008000; font-weight: bold;\">foreach<\/span> (Place place <span style=\"color: #008000; font-weight: bold;\">in<\/span> placeResult.results)\r\n{\r\n    <span style=\"color: #b00040;\">double<\/span> x = place.location.x;\r\n    <span style=\"color: #b00040;\">double<\/span> y = place.location.y;\r\n    MapPoint resultPoint = <span style=\"color: #008000; font-weight: bold;\">new<\/span>(x, y, SpatialReference.Create(<span style=\"color: #666666;\">4326<\/span>));\r\n    Graphic resultGraphic = <span style=\"color: #008000; font-weight: bold;\">new<\/span>(resultPoint, _pinSymbol);\r\n    resultGraphic.Attributes.Add(<span style=\"color: #ba2121;\">\"Name\"<\/span>, place.name);\r\n    resultGraphic.Attributes.Add(<span style=\"color: #ba2121;\">\"PlaceId\"<\/span>, place.placeId);\r\n    _resultOverlay.Graphics.Add(graphic);\r\n}\r\n<\/pre>\n<\/div>\n<p>Once I added the graphics for each result to the <strong><em>GraphicsOverlay<\/em><\/strong>, the results appeared in the map!<\/p>\n<h2 id=\"10\"><strong>Sending requests for additional information<\/strong><\/h2>\n<p>Using the <strong>near-point<\/strong> or <strong>within-extent<\/strong> request types, I was able to retrieve the location and name of places. However, what I wanted to be able to do was provide more information to an app user if they desired, such as street address, opening hours, telephone number, and website. To get this information I needed to perform another request to retrieve the additional information for a place.<\/p>\n<p>Each place returned by a <strong>near-point<\/strong> or <strong>within-extent<\/strong> request includes a unique <strong><em>placeID<\/em><\/strong>. Using this <strong><em>placeID<\/em><\/strong> I could construct a URL suitable for making a request for place details. This follows the same process that is outlined above, but uses <em>\/places\/&lt;PLACE_ID&gt;<\/em> as the request type. You can specify the attributes you want by defining the <strong><em>requestedFields<\/em><\/strong> parameter in the parameter list (<a href=\"https:\/\/developers.arcgis.com\/rest\/places\/place-id-get\/\">table of fields<\/a>). Below, I\u2019ve shown the URL that we used to retrieve the opening hours of the bakery closest to Esri\u2019s Edinburgh R&amp;D centre:<\/p>\n<p><a href=\"https:\/\/places-api.arcgis.com\/arcgis\/rest\/services\/places-service\/v1\/places\/b36eaff62de292c31c99a7ed4e47c2d2?requestedFields=contactInfo,hours:openingText&amp;f=pjson&amp;token=\">https:\/\/places-api.arcgis.com\/arcgis\/rest\/services\/places-service\/v1\/places\/b36eaff62de292c31c99a7ed4e47c2d2?requestedFields=contactInfo,hours:openingText&amp;f=pjson&amp;token=&lt;ACCESS_TOKEN&gt;<\/a><\/p>\n<p>Which returns:<\/p>\n<div>\n<pre style=\"background: #f8f8f8; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em; margin: 0; line-height: 125%; font-size: smaller;\">{\r\n  <span style=\"color: #008000; font-weight: bold;\">\"placeDetails\"<\/span>: {\r\n    <span style=\"color: #008000; font-weight: bold;\">\"placeId\"<\/span>: <span style=\"color: #ba2121;\">\"b36eaff62de292c31c99a7ed4e47c2d2\"<\/span>,\r\n    <span style=\"color: #008000; font-weight: bold;\">\"contactInfo\"<\/span>: {\r\n      <span style=\"color: #008000; font-weight: bold;\">\"telephone\"<\/span>: <span style=\"color: #ba2121;\">\"0131 228 1905\"<\/span>,\r\n      <span style=\"color: #008000; font-weight: bold;\">\"website\"<\/span>: <span style=\"color: #ba2121;\">\"https:\/\/www.soderberg.uk\/pavilion\"<\/span>,\r\n      <span style=\"color: #008000; font-weight: bold;\">\"fax\"<\/span>: <span style=\"color: #008000; font-weight: bold;\">null<\/span>,\r\n      <span style=\"color: #008000; font-weight: bold;\">\"email\"<\/span>: <span style=\"color: #008000; font-weight: bold;\">null<\/span>\r\n    },\r\n    <span style=\"color: #008000; font-weight: bold;\">\"hours\"<\/span>: {\r\n      <span style=\"color: #008000; font-weight: bold;\">\"openingText\"<\/span>: <span style=\"color: #ba2121;\">\"Mon-Fri 9:00 AM-10:00 PM; Sat-Sun 10:00 AM-10:00 PM\"<\/span>\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p>As with a nearby or within extent search, to access the information in the response, I needed to parse the JSON into custom data types.<\/p>\n<p>The two-stage process of searching for place names and locations in an area followed by requesting details for individual places meant I needed to make a design decision. Did I want to send requests for additional information about a place only when a user interacted with (e.g. clicked on) a place? Or, did I want to request additional information automatically for all places returned by a search and display this to the user?<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2122902,"id":2122902,"title":"Additional_Info_Presentation_Suggestions_vertical","filename":"Additional_Info_Presentation_Suggestions_vertical.png","filesize":1866262,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\/additional_info_presentation_suggestions_vertical","alt":"","author":"346302","description":"","caption":"Two approaches for requesting place details and displaying the information. (a) Details requested when a user interacts with a place, with the details displayed in a callout. (b) Details automatically requested following a near-point or within extent request, with the details displayed in a results pane.","name":"additional_info_presentation_suggestions_vertical","status":"inherit","uploaded_to":2102902,"date":"2023-10-26 14:37:17","modified":"2023-10-26 14:38:04","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":2078,"height":3187,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical.png","medium-width":170,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical.png","medium_large-width":768,"medium_large-height":1178,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical.png","large-width":704,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical-1002x1536.png","1536x1536-width":1002,"1536x1536-height":1536,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical-1335x2048.png","2048x2048-width":1335,"2048x2048-height":2048,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical-303x465.png","card_image-width":303,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Additional_Info_Presentation_Suggestions_vertical-704x1080.png","wide_image-width":704,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Each option results in different user experiences and varying numbers of requests being made to the places service (therefore different costs). For simplicity and to minimize the number of requests being made to the service, I decided to request details for a place only when a user interacted with a place.<\/p>\n<h2 id=\"11\"><strong>Integration of places service requests with existing geocoding tools<\/strong><\/h2>\n<p>In the initial implementation described in the sections above, the extent in which to find places of interest (using the places service) was defined using the map\u2019s current viewpoint. This meant a user had to manually navigate to a location (e.g. using interactive panning) before performing a search for places of interest in the current view\u2019s extent. After presenting this to colleagues, it was suggested that the user experience could be improved by allowing a user to include a search location in the request, for example using a textual description such as \u201cEdinburgh\u201d or \u201cRedlands\u201d. This could be achieved by integrating the logic used to make a request to the places service with other tools available to Native Maps SDK developers, for example the <a href=\"https:\/\/github.com\/Esri\/arcgis-maps-sdk-toolkit-qt\">open-source Native Maps SDK toolkit components<\/a> and the <a href=\"https:\/\/developers.arcgis.com\/rest\/geocode\/api-reference\/overview-world-geocoding-service.htm\">world geocoding service<\/a>. To continue to improve my understanding of how the places service can be integrated with the Native Maps SDKs, I investigated this further.<\/p>\n<p>To facilitate the integration, I used the <strong><em>SearchView<\/em><\/strong> toolkit component, which is available in most of the Native Maps SDK toolkits. The <strong><em>SearchView<\/em><\/strong> component enables searches to be conducted using different sources. A couple of search sources are provided with the component (e.g. Esri World Geocoder). However, additional search sources can be added using the extensibility interface, called <strong><em>ISearchSource<\/em><\/strong> in the .NET Maps SDK and <strong><em>SearchSourceInterface<\/em><\/strong> in the Qt Maps SDK. Using this interface, I was able to add the places service as a source in the <strong><em>SearchView<\/em><\/strong> toolkit component and use it efficiently to combine searches using multiple sources.<\/p>\n<p>Customising the toolkit component further, the keyword \u201cnear\u201d was configured in the app logic to trigger two sequential searches automatically. The first request being made to identify a geographic location (e.g. return the co-ordinates for \u201cEdinburgh&#8221;) and a second request being made to find places of interest (e.g. \u201cbakery\u201d) near to the location returned by the first request. Importantly, the requests being made to each service did not change \u2013 the customisation simply automated the two sequential requests. As an example, searching for &#8220;bakery near Esri Edinburgh&#8221; resulted in the following two searches occurring sequentially:<\/p>\n<ol>\n<li>A world geocoding service search to identify the location of Esri Edinburgh.<\/li>\n<li>A places service search to identify bakeries near the location of Esri Edinburgh, which was identified by the world geocoding service.<\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2116922,"id":2116922,"title":"Search_using_Multiple_Sources","filename":"Search_using_Multiple_Sources.gif","filesize":3894818,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\/search_using_multiple_sources","alt":"","author":"346302","description":"","caption":"Combination of multiple search sources in a single search using the SearchView toolkit component. The GIF shows an Esri-internal test app that was created using the .NET Maps SDK.","name":"search_using_multiple_sources","status":"inherit","uploaded_to":2102902,"date":"2023-10-25 13:57:11","modified":"2023-10-25 13:57:38","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":1003,"height":720,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","medium-width":364,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","medium_large-width":768,"medium_large-height":551,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","large-width":1003,"large-height":720,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","1536x1536-width":1003,"1536x1536-height":720,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","2048x2048-width":1003,"2048x2048-height":720,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources-648x465.gif","card_image-width":648,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/Search_using_Multiple_Sources.gif","wide_image-width":1003,"wide_image-height":720}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The outcome of this was a significant improvement to the spatial awareness capabilities of the app, which is dynamic and responsive to a users\u2019 requirements, as well as a streamlined user experience.<\/p>\n<h2 id=\"12\"><strong>Conclusion<\/strong><\/h2>\n<p>The newly released places service is a vast spatial dataset managed by Esri that can be interrogated for points of interest in a given area. To learn more about how a RESTful service, such as the places service, could be integrated with the Native Maps SDKs, I expanded the spatial awareness capabilities of an internal test app created using the .NET Maps SDK. The ability to interrogate an area for places of interest, the relevance of which are dependent on time, context, and user requirements, significantly improved the spatial awareness capabilities of the app. The process I followed to use the places service with the Native Maps SDKs has been outlined in this blog, and can be summarized as follows:<\/p>\n<ul>\n<li>Construct a URL.<\/li>\n<li>Make HTTPS requests to the RESTful places service and process the response using a native app development framework.<\/li>\n<li>Display the results on a map.<\/li>\n<li>Request additional information for a place.<\/li>\n<\/ul>\n<p>I also discussed how the places service can be integrated with existing geocoding tools that are made available for use with the Native Maps SDKs.<\/p>\n<h2 id=\"13\"><strong>Learn More<\/strong><\/h2>\n<p>To find out more about the places service, ArcGIS location services, and to see how you can add spatial awareness capabilities to your applications built with the ArcGIS Maps SDKs for Native Apps, visit the <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/\">ArcGIS location services<\/a> page or search for <a href=\"https:\/\/www.esri.com\/arcgis-blog\/developers\/\">ArcGIS blogs<\/a> related to location services (e.g. <a href=\"https:\/\/community.esri.com\/t5\/arcgis-maps-sdks-native-blog\/take-advantage-of-the-new-basemaps-styles-services\/ba-p\/1292673\">Basemap Styles Blog<\/a>). You can also see a <a href=\"https:\/\/github.com\/Rachael-E\/places-service-java-demo\">places-service-java-demo<\/a> on my colleague Rachael\u2019s GitHub for an example of using the places service with a Native Maps SDKs app.<\/p>\n<p>We\u2019d love to know how you are using the places service in your native apps. Please leave your feedback and questions through the ArcGIS Maps SDKs for Native Apps Esri Community <a href=\"https:\/\/community.esri.com\/t5\/arcgis-maps-sdks-for-native-apps\/ct-p\/arcgis-runtime-sdks\">forums<\/a>.<\/p>\n<p><em>Each ArcGIS Maps SDK for Native Apps (<a href=\"https:\/\/developers.arcgis.com\/net\/\">.NET<\/a>, <a href=\"https:\/\/developers.arcgis.com\/qt\/\">Qt<\/a>, <a href=\"https:\/\/developers.arcgis.com\/java\/\">Java<\/a>, <a href=\"https:\/\/developers.arcgis.com\/kotlin\/\">Kotlin<\/a>, and <a href=\"https:\/\/developers.arcgis.com\/swift\/\">Swift<\/a>) provides a rich set of guide documentation, API references, tutorials, and samples to help you build great apps. If you\u2019re new to working with these SDKs, visit the <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-apis-and-services\/get-started\/\">ArcGIS Developers site<\/a> to get started.<\/em><\/p>\n"}],"related_articles":[{"ID":1928222,"post_author":"290882","post_date":"2023-08-09 09:00:42","post_date_gmt":"2023-08-09 16:00:42","post_content":"","post_title":"The Basemap Styles Service v2 is Now Released","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"announcing-the-new-basemap-styles-service-v2","to_ping":"","pinged":"","post_modified":"2023-08-11 11:36:47","post_modified_gmt":"2023-08-11 18:36:47","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=1928222","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2131772,"post_author":"4231","post_date":"2023-11-02 10:00:54","post_date_gmt":"2023-11-02 17:00:54","post_content":"","post_title":"Bring Places Data into Your Apps with the New ArcGIS Platform Places Service","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"places-service","to_ping":"","pinged":"","post_modified":"2024-05-09 16:28:41","post_modified_gmt":"2024-05-09 23:28:41","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2131772","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"2","filter":"raw"}],"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/BannerImage_826x465.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/BannerImage_1920x1080.png"},"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 RESTful services with the Native Maps SDKs<\/title>\n<meta name=\"description\" content=\"A guide to integrating RESTful services, such as the Places Service, with the ArcGIS Maps SDKs for Native Applications using HTTPS requests.\" \/>\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-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrating the Places Service with the Native Maps SDKs using HTTPS requests\" \/>\n<meta property=\"og:description\" content=\"A guide to integrating RESTful services, such as the Places Service, with the ArcGIS Maps SDKs for Native Applications using HTTPS requests.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\" \/>\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=\"2024-04-12T08:11:07+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\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-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\"},\"author\":{\"name\":\"Andrew Bladon\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/f6a1fab5bf55b84d8a089fa8e7efe8fc\"},\"headline\":\"Integrating the Places Service with the Native Maps SDKs using HTTPS requests\",\"datePublished\":\"2023-10-25T15:45:17+00:00\",\"dateModified\":\"2024-04-12T08:11:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\"},\"wordCount\":12,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"location services\",\"native\",\"Places\"],\"articleSection\":[\"Developers\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\",\"name\":\"Integrate RESTful services with the Native Maps SDKs\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2023-10-25T15:45:17+00:00\",\"dateModified\":\"2024-04-12T08:11:07+00:00\",\"description\":\"A guide to integrating RESTful services, such as the Places Service, with the ArcGIS Maps SDKs for Native Applications using HTTPS requests.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating the Places Service with the Native Maps SDKs using HTTPS requests\"}]},{\"@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\/f6a1fab5bf55b84d8a089fa8e7efe8fc\",\"name\":\"Andrew Bladon\",\"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\/2023\/10\/ABladon_Headshot-465x465.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ABladon_Headshot-465x465.jpg\",\"caption\":\"Andrew Bladon\"},\"description\":\"Andrew is a Software Engineer working on the ArcGIS Maps SDKs for Native Apps in Esri\u2019s Edinburgh R&amp;D Centre. Andrew helps bring the latest features available in ArcGIS location services into the core C++ business logic used by the Native Maps SDKs. Andrew has a Bachelor of Science and PhD in Geology, and prior to working with Esri he spent seven years working as a Consultant and Product Engineer for a geological modelling software company.\",\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integrate RESTful services with the Native Maps SDKs","description":"A guide to integrating RESTful services, such as the Places Service, with the ArcGIS Maps SDKs for Native Applications using HTTPS requests.","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-net\/developers\/integrate-restful-services-with-the-native-maps-sdks","og_locale":"en_US","og_type":"article","og_title":"Integrating the Places Service with the Native Maps SDKs using HTTPS requests","og_description":"A guide to integrating RESTful services, such as the Places Service, with the ArcGIS Maps SDKs for Native Applications using HTTPS requests.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2024-04-12T08:11:07+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks"},"author":{"name":"Andrew Bladon","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/f6a1fab5bf55b84d8a089fa8e7efe8fc"},"headline":"Integrating the Places Service with the Native Maps SDKs using HTTPS requests","datePublished":"2023-10-25T15:45:17+00:00","dateModified":"2024-04-12T08:11:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks"},"wordCount":12,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["location services","native","Places"],"articleSection":["Developers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks","name":"Integrate RESTful services with the Native Maps SDKs","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2023-10-25T15:45:17+00:00","dateModified":"2024-04-12T08:11:07+00:00","description":"A guide to integrating RESTful services, such as the Places Service, with the ArcGIS Maps SDKs for Native Applications using HTTPS requests.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-net\/developers\/integrate-restful-services-with-the-native-maps-sdks#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Integrating the Places Service with the Native Maps SDKs using HTTPS requests"}]},{"@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\/f6a1fab5bf55b84d8a089fa8e7efe8fc","name":"Andrew Bladon","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\/2023\/10\/ABladon_Headshot-465x465.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/ABladon_Headshot-465x465.jpg","caption":"Andrew Bladon"},"description":"Andrew is a Software Engineer working on the ArcGIS Maps SDKs for Native Apps in Esri\u2019s Edinburgh R&amp;D Centre. Andrew helps bring the latest features available in ArcGIS location services into the core C++ business logic used by the Native Maps SDKs. Andrew has a Bachelor of Science and PhD in Geology, and prior to working with Esri he spent seven years working as a Consultant and Product Engineer for a geological modelling software company.","url":""}]}},"text_date":"October 25, 2023","author_name":"Andrew Bladon","author_page":false,"custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/10\/BannerImage_1920x1080.png","primary_product":"ArcGIS Maps SDK for .NET","tag_data":[{"term_id":762922,"name":"location services","slug":"location-services","term_group":0,"term_taxonomy_id":762922,"taxonomy":"post_tag","description":"","parent":0,"count":9,"filter":"raw"},{"term_id":28891,"name":"native","slug":"native","term_group":0,"term_taxonomy_id":28891,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":29761,"name":"Places","slug":"places","term_group":0,"term_taxonomy_id":29761,"taxonomy":"post_tag","description":"","parent":0,"count":7,"filter":"raw"}],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":420,"filter":"raw"}],"product_data":[{"term_id":761642,"name":"ArcGIS Location Platform","slug":"platform","term_group":0,"term_taxonomy_id":761642,"taxonomy":"product","description":"","parent":36601,"count":213,"filter":"raw"},{"term_id":769142,"name":"ArcGIS Maps SDK for .NET","slug":"sdk-net","term_group":0,"term_taxonomy_id":769142,"taxonomy":"product","description":"","parent":36601,"count":39,"filter":"raw"},{"term_id":769162,"name":"ArcGIS Maps SDK for Java","slug":"sdk-java","term_group":0,"term_taxonomy_id":769162,"taxonomy":"product","description":"","parent":36601,"count":24,"filter":"raw"},{"term_id":768902,"name":"ArcGIS Maps SDK for Kotlin","slug":"sdk-kotlin","term_group":0,"term_taxonomy_id":768902,"taxonomy":"product","description":"","parent":36601,"count":33,"filter":"raw"},{"term_id":769152,"name":"ArcGIS Maps SDK for Qt","slug":"sdk-qt","term_group":0,"term_taxonomy_id":769152,"taxonomy":"product","description":"","parent":36601,"count":36,"filter":"raw"},{"term_id":768912,"name":"ArcGIS Maps SDK for Swift","slug":"sdk-swift","term_group":0,"term_taxonomy_id":768912,"taxonomy":"product","description":"","parent":36601,"count":32,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=sdk-net","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2102902","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\/346302"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2102902"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2102902\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2102902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2102902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2102902"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2102902"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2102902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}