{"id":4870,"date":"2018-03-23T10:26:01","date_gmt":"2018-03-23T17:26:01","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4870"},"modified":"2025-06-13T22:45:10","modified_gmt":"2025-06-14T05:45:10","slug":"geospatial-aspnet-aurelia-google-maps","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-aspnet-aurelia-google-maps\/","title":{"rendered":"Pesquisa geoespacial com ASP.NET Core, Aurelia e Google Maps"},"content":{"rendered":"<div class=\"paragraph\">\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-basics-spatial-databases-and-nosql-examples\/\">Geoespacial<\/a> agora \u00e9 totalmente compat\u00edvel com o Couchbase Server 5.5. Confira a <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-server-5-5-beta\/\">An\u00fancio do Couchbase Server 5.5<\/a>e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer&amp;edition=enterprise\">Fa\u00e7a o download da vers\u00e3o para desenvolvedores<\/a> gratuitamente agora mesmo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Neste post, vou demonstrar os recursos geoespaciais do Couchbase Full Text Search criando uma interface de usu\u00e1rio baseada na Web que realiza pesquisas. Sempre que penso em pesquisas geoespaciais, penso no Yelp, que \u00e9 excelente para me ajudar a encontrar restaurantes em uma \u00e1rea espec\u00edfica.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Portanto, vou me divertir um pouco e criar uma vers\u00e3o bem b\u00e1sica do Yelp, mas apenas para hot\u00e9is. Al\u00e9m disso, leia <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-basics-spatial-databases-and-nosql-examples\/\">O que s\u00e3o dados geoespaciais?<\/a> se isso for novo para voc\u00ea.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Se voc\u00ea quiser acompanhar, o <a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/104GeospatialFTS5dot5\/src\">O c\u00f3digo-fonte completo est\u00e1 dispon\u00edvel no Github<\/a>.<\/em><\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_getting_set_up\">Prepara\u00e7\u00e3o<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Aqui est\u00e3o as etapas que segui para criar um novo projeto antes de come\u00e7ar a escrever o c\u00f3digo.<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>Na linha de comando: <code>dotnet new aurelia<\/code>. Isso pressup\u00f5e que voc\u00ea tenha <a href=\"https:\/\/dotnet.github.io\/\">.NET Core<\/a> instalado. <strong>Observe que o Geospatial Search n\u00e3o \u00e9 um recurso exclusivo do .NET: voc\u00ea pode us\u00e1-lo com o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/developer-sdk\/\">outros SDKs do Couchbase<\/a> como Node.js, Java, etc.<\/strong> Ele tamb\u00e9m pressup\u00f5e que voc\u00ea tenha instalado um <a href=\"https:\/\/www.hanselman.com\/blog\/dotnetNewAngularAndDotnetNewReact.aspx\">Modelo de SPA para o Aurelia<\/a>. Voc\u00ea tamb\u00e9m pode usar o Angular ou o React, se quiser, mas eu gosto muito do <a href=\"https:\/\/aurelia.io\/\">Aur\u00e9lia<\/a>e acho que voc\u00ea deveria dar uma chance a ele.<\/li>\n<li>O comando acima criar\u00e1 um shell de um projeto ASP.NET Core. Nesta postagem do blog, n\u00e3o usarei o Razor. Estou usando apenas o ASP.NET como backend para pontos de extremidade da API REST.<\/li>\n<li><code>npm install aurelia-google-maps<\/code>. Voc\u00ea n\u00e3o precisa usar isso, mas o <a href=\"https:\/\/github.com\/Vheissu\/aurelia-google-maps\">Plug-in aurelia-google-maps<\/a> facilitar\u00e1 minha intera\u00e7\u00e3o com o Google Maps em meu aplicativo.<\/li>\n<li>Abri esse projeto no Visual Studio 2017. Adicionei <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/dependency-injection-aspnet-couchbase\/\">Couchbase.Extensions.DependencyInjection<\/a> com o NuGet. Voc\u00ea n\u00e3o precisa usar essa extens\u00e3o, mas ela facilita as coisas.<\/li>\n<li>Instalei o Couchbase Server 5.5, <strong>incluindo o<\/strong> <strong>Servi\u00e7o de pesquisa de texto completo<\/strong>. Configurei o <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/settings\/install-sample-buckets.html\">balde para amostras de viagem<\/a>. I <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/security\/security-rbac-for-admins-and-apps.html\">criou um usu\u00e1rio<\/a> \"matt\" com acesso total a esse balde.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_create_a_geospatial_index\">Criar um \u00edndice geoespacial<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Antes de criar o backend do ASP.NET, precisamos criar um \u00edndice geoespacial no Couchbase Server. Depois de fazer login, clique em \"Search\" (Pesquisa) no menu (em \"Workbench\"). Clique em \"Add Index\" (Adicionar \u00edndice) para come\u00e7ar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/10401-create-geospatial-query-index.gif\" alt=\"Create Geospatial index\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Chamei meu \u00edndice de \"mygeoindex\". Selecionei travel-sample como o bucket a ser indexado.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Em \"Type Mappings\", eu desmarco o padr\u00e3o. Adiciono um novo mapeamento de tipo com um nome de tipo \"hotel\". Todo documento de hotel em \"travel-sample\" tem um tipo com o valor \"hotel\". Marque a caixa \"only index specified fields\" (indexar somente campos especificados).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Vou adicionar dois campos secund\u00e1rios. Um deles \u00e9 \"geo\", que cont\u00e9m as coordenadas geoespaciais em um documento de hotel. Certifique-se de selecionar \"geopoint\" como o tipo. O outro \u00e9 \"name\", que ser\u00e1 o nome do hotel. Optei por \"armazenar\" cada um deles: isso tornar\u00e1 o \u00edndice maior, mas posso evitar uma pesquisa secund\u00e1ria se armazenar as informa\u00e7\u00f5es no \u00edndice.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Observa\u00e7\u00e3o importante: H\u00e1 um bug (<a href=\"https:\/\/issues.couchbase.com\/browse\/NCBC-1651\">NCBC-1651<\/a>) na vers\u00e3o atual do .NET SDK que causar\u00e1 um erro se voc\u00ea tentar ler de um campo de geoponto. Nos exemplos de c\u00f3digo, criei uma solu\u00e7\u00e3o alternativa: Na verdade, n\u00e3o obtenho os campos geo e name do \u00edndice de pesquisa. Em vez disso, uso a chave do documento retornada pela pesquisa para fazer uma chamada \"get\" secund\u00e1ria e obter o documento completo. Lembre-se de que essa ainda \u00e9 uma t\u00e9cnica que voc\u00ea pode considerar se quiser manter o tamanho do seu \u00edndice baixo. Esse bug j\u00e1 foi corrigido e estar\u00e1 em uma vers\u00e3o futura. Esse \u00e9 o perigo de estar na vanguarda!<\/strong><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Isso \u00e9 tudo o que h\u00e1 para fazer. Clique em \"Create Index\" (Criar \u00edndice). Observe o \"progresso da indexa\u00e7\u00e3o\" na pr\u00f3xima tela at\u00e9 chegar a 100% (n\u00e3o deve demorar muito, supondo que voc\u00ea tenha se lembrado de desmarcar a op\u00e7\u00e3o \"default\").<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_asp_net_core_rest_endpoints\">Pontos de extremidade REST do ASP.NET Core<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Em seguida, vamos passar para o ASP.NET. Criarei dois endpoints. Um endpoint demonstrar\u00e1 o <strong>caixa delimitadora<\/strong> e o outro demonstrar\u00e1 o m\u00e9todo de pesquisa <strong>dist\u00e2ncia<\/strong> m\u00e9todo de pesquisa.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Precisarei de um objeto bucket do Couchbase para executar as consultas. Siga as instru\u00e7\u00f5es <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/dependency-injection-aspnet-couchbase\/\">exemplos em minha postagem no blog sobre inje\u00e7\u00e3o de depend\u00eancia<\/a> ou consulte o c\u00f3digo-fonte no Github se voc\u00ea nunca fez isso antes.<\/em><\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_bounded_box\">Caixa delimitadora<\/h3>\n<div class=\"paragraph\">\n<p>Uma pesquisa de \"caixa delimitadora\" significa que voc\u00ea define uma caixa em um mapa e deseja pesquisar pontos de interesse que estejam dentro dessa caixa. Voc\u00ea s\u00f3 precisa de dois pontos para definir uma caixa: as coordenadas do canto superior direito e as coordenadas do canto inferior esquerdo. (As coordenadas s\u00e3o a latitude e a longitude).<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public class BoxSearch\r\n{\r\n    public double LatitudeTopLeft { get; set; }\r\n    public double LongitudeTopLeft { get; set; }\r\n    public double LatitudeBottomRight { get; set; }\r\n    public double LongitudeBottomRight { get; set; }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Para criar uma consulta geoespacial de caixa delimitadora, use a op\u00e7\u00e3o <code>GeoBoundingBoxQuery<\/code> dispon\u00edvel no SDK do .NET. Farei isso dentro de um m\u00e9todo POST com o c\u00f3digo acima <code>BoxSearch<\/code> como par\u00e2metro.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">        [Route(\"api\/Box\")]\r\n        [HttpPost]\r\n        public IActionResult Box([FromBody] BoxSearch box)\r\n        {\r\n            var query = new GeoBoundingBoxQuery();\r\n            query.TopLeft(box.LongitudeTopLeft, box.LatitudeTopLeft);\r\n            query.BottomRight(box.LongitudeBottomRight, box.LatitudeBottomRight);\r\n            var searchParams = new SearchParams()\r\n                \/\/ .Fields(\"geo\", \"name\") \/\/ omitting because of bug NCBC-1651\r\n                .Limit(10)\r\n                .Timeout(TimeSpan.FromMilliseconds(10000));\r\n            var searchQuery = new SearchQuery\r\n            {\r\n                Query = query,\r\n                Index = \"mygeoindex\",\r\n                SearchParams = searchParams\r\n            };\r\n            var results = _bucket.Query(searchQuery);\r\n\r\n\/\/ ... snip ...<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Tudo o que preciso retornar desse endpoint \u00e9 uma lista dos resultados: as coordenadas de cada hotel e o nome e a localiza\u00e7\u00e3o do hotel. Eu criei um <code>Resultado da pesquisa geogr\u00e1fica<\/code> classe para isso.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public class GeoSearchResult\r\n{\r\n    public double Latitude { get; set; }\r\n    public double Longitude { get; set; }\r\n    public InfoWindow InfoWindow { get; set; }\r\n}\r\n\r\npublic class InfoWindow\r\n{\r\n    public string Content { get; set; }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Criei essa classe para corresponder ao plug-in do Google Maps que usarei posteriormente.<\/em><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por fim, usarei essa classe para retornar alguns resultados do ponto de extremidade.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">\/\/ ... snip ...\r\n\r\n            var list = new List&lt;geosearchresult&gt;();\r\n            foreach (var hit in results.Hits)\r\n            {\r\n                \/\/ *** this part shouldn&#039;t be necessary\r\n                \/\/ the geo and name should come with the search results\r\n                \/\/ but there&#039;s an SDK bug NCBC-1651\r\n                var doc = _bucket.Get&lt;dynamic&gt;(hit.Id).Value;\r\n                \/\/ ****************\r\n                list.Add(new GeoSearchResult\r\n                {\r\n                    Latitude = doc.geo.lat,\r\n                    Longitude = doc.geo.lon,\r\n                    InfoWindow = new InfoWindow\r\n                    {\r\n                        Content = doc.name + &quot;&lt;br \/&gt;&quot; +\r\n                            doc.city + &quot;, &quot; +\r\n                            doc.state + &quot; &quot; +\r\n                            doc.country\r\n                    }\r\n                });\r\n            }\r\n            return Ok(list);\r\n        }<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_distance_search\">Pesquisa de dist\u00e2ncia<\/h3>\n<div class=\"paragraph\">\n<p>Uma pesquisa de \"dist\u00e2ncia\" \u00e9 outra maneira de realizar consultas geoespaciais. Desta vez, em vez de uma caixa, ela ser\u00e1 mais parecida com um c\u00edrculo. Voc\u00ea fornece uma \u00fanica coordenada e uma dist\u00e2ncia. A dist\u00e2ncia ser\u00e1 o raio a partir desse ponto.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public class PointSearch\r\n{\r\n    public double Latitude { get; set; }\r\n    public double Longitude { get; set; }\r\n    public int Distance { get; set; }\r\n    \/\/ miles is being assumed as the unit\r\n    public string DistanceWithUnits =&gt; Distance + \"mi\";\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Estou usando milhas como padr\u00e3o, mas certamente voc\u00ea pode usar quil\u00f4metros em vez disso ou apresentar a op\u00e7\u00e3o na interface do usu\u00e1rio.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>O ponto final ser\u00e1 muito semelhante ao ponto final da caixa delimitadora, exceto pelo fato de usar <code>Consulta de dist\u00e2ncia geogr\u00e1fica<\/code>.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">[Route(&quot;api\/Point&quot;)]\r\n[HttpPost]\r\npublic IActionResult Point([FromBody] PointSearch point)\r\n{\r\n    var query = new GeoDistanceQuery();\r\n    query.Latitude(point.Latitude);\r\n    query.Longitude(point.Longitude);\r\n    query.Distance(point.DistanceWithUnits);\r\n    var searchParams = new SearchParams()\r\n        \/\/ .Fields(&quot;geo&quot;, &quot;name&quot;) \/\/ omitting because of bug NCBC-1651\r\n        .Limit(10)\r\n        .Timeout(TimeSpan.FromMilliseconds(10000));\r\n    var searchQuery = new SearchQuery\r\n    {\r\n        Query = query,\r\n        Index = &quot;mygeoindex&quot;,\r\n        SearchParams = searchParams\r\n    };\r\n    var results = _bucket.Query(searchQuery);\r\n\r\n    var list = new List&lt;geosearchresult&gt;();\r\n    foreach (var hit in results.Hits)\r\n    {\r\n        \/\/ *** this part shouldn&#039;t be necessary\r\n        \/\/ the geo and name should come with the search results\r\n        \/\/ but there&#039;s an SDK bug NCBC-1651\r\n        var doc = _bucket.Get&lt;dynamic&gt;(hit.Id).Value;\r\n        \/\/ ****************\r\n        list.Add(new GeoSearchResult\r\n        {\r\n            Latitude = doc.geo.lat,\r\n            Longitude = doc.geo.lon,\r\n            InfoWindow = new InfoWindow\r\n            {\r\n                Content = doc.name + &quot;&lt;br \/&gt;&quot; +\r\n                          doc.city + &quot;, &quot; +\r\n                          doc.state + &quot; &quot; +\r\n                          doc.country\r\n            }\r\n        });\r\n    }\r\n    return Ok(list);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Neste ponto, voc\u00ea pode come\u00e7ar a testar esses pontos de extremidade com o Postman ou o Fiddler, se desejar. Mas ser\u00e1 muito bom ver isso em um mapa.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_auerlia_and_google_maps\">Auerlia e Google Maps<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>No Aurelia, criei dois componentes: geosearchbox e geosearchpoint.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/10402-aurelia-components.png\" alt=\"Auerlia components\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Cada um deles ter\u00e1 um componente do Google Maps com o qual o usu\u00e1rio pode interagir. Esses mapas ser\u00e3o centralizados em S\u00e3o Francisco, porque \u00e9 l\u00e1 que est\u00e3o localizados muitos dos hot\u00e9is da \"amostra de viagem\".<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_bounded_box_search_component\">Componente de pesquisa Bounding Box<\/h3>\n<div class=\"paragraph\">\n<p>O <code>google-map`<\/code> tem um map-click.delegate que ser\u00e1 acionado sempre que o usu\u00e1rio clicar no mapa. Em geosearchbox.html:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">&lt;google-map\r\n    if.bind=\"markers\"\r\n    map-click.delegate=\"clickMap($event)\"\r\n    latitude=\"37.780986253433895\"\r\n    longitude=\"-122.45291600632277\"\r\n    zoom=\"12\"\r\n    markers.bind=\"markers\"&gt;\r\n&lt;\/google-map&gt;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><code>marcadores<\/code> \u00e9 simplesmente uma matriz que cont\u00e9m as coordenadas dos resultados da pesquisa que devem aparecer no mapa. Inicialmente, ele estar\u00e1 vazio.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Quando o usu\u00e1rio clicar no mapa pela primeira vez, isso definir\u00e1 a primeira coordenada (canto superior esquerdo) no formul\u00e1rio. Em geosearchbox.ts:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">public clickMap(event : any) {\r\n    var latLng = event.detail.latLng,\r\n        lat = latLng.lat(),\r\n        lng = latLng.lng();\r\n\r\n    \/\/ only update top left if it hasn't been set yet\r\n    \/\/ or if bottom right is already set\r\n    if (!this.longitudeTopLeft || this.longitudeBottomRight) {\r\n        this.longitudeTopLeft = lng;\r\n        this.latitudeTopLeft = lat;\r\n        this.longitudeBottomRight = null;\r\n        this.latitudeBottomRight = null;\r\n    } else {\r\n        this.longitudeBottomRight = lng;\r\n        this.latitudeBottomRight = lat;\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Em seguida, clique em outro ponto no mapa. Isso definir\u00e1 a segunda coordenada (canto inferior direito).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Minha implementa\u00e7\u00e3o \u00e9 bem simples. Sem gr\u00e1ficos sofisticados e sem valida\u00e7\u00e3o de que a segunda coordenada est\u00e1 no canto inferior direito da primeira. Os campos em um formul\u00e1rio ser\u00e3o simplesmente preenchidos com a latitude e a longitude. Em geosearchbox.html:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">&lt;p&gt;\r\n    Bounding box search:\r\n    &lt;br \/&gt;\r\n    Latitude (top left):\r\n        &lt;input type=&quot;text&quot; value=&quot;${ latitudeTopLeft }&quot; \/&gt;\r\n    Longitude (top left):\r\n        &lt;input type=&quot;text&quot; value=&quot;${ longitudeTopLeft }&quot; \/&gt;\r\n    &lt;br \/&gt;\r\n    Latitude (bottom right):\r\n        &lt;input type=&quot;text&quot; value=&quot;${ latitudeBottomRight }&quot; \/&gt;\r\n    Longitude (bottom right):\r\n        &lt;input type=&quot;text&quot; value=&quot;${ longitudeBottomRight }&quot; \/&gt;\r\n    &lt;br \/&gt;\r\n    &lt;input\r\n        if.bind=&quot;latitudeTopLeft &amp;&amp; latitudeBottomRight&quot;\r\n        click.trigger=&quot;searchClick()&quot;\r\n        type=&quot;button&quot;\r\n        name=&quot;search&quot;\r\n        value=&quot;Pesquisa&quot; \/&gt;\r\n&lt;\/p&gt;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Depois de selecionar duas coordenadas, aparecer\u00e1 um bot\u00e3o de pesquisa. Clique nele para postar essas coordenadas no endpoint criado anteriormente, e isso acionar\u00e1 a fun\u00e7\u00e3o <code>searchClick()<\/code> conforme visto em geosearchbox.ts:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">public searchClick() {\r\n    let boxSearch = {\r\n        latitudeTopLeft: this.latitudeTopLeft,\r\n        longitudeTopLeft: this.longitudeTopLeft,\r\n        latitudeBottomRight: this.latitudeBottomRight,\r\n        longitudeBottomRight: this.longitudeBottomRight\r\n    };\r\n\r\n    console.log(\"POSTing to api\/Box: \" + JSON.stringify(boxSearch));\r\n\r\n    this.http.fetch('api\/Box', { method: \"POST\", body: json(boxSearch) })\r\n        .then(result =&gt; result.json() as Promise&lt;any[]&gt;)\r\n        .then(data =&gt; {\r\n            this.markers = data;\r\n        });\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Quando o Aurelia, o Google Maps, o ASP.NET Core e o Couchbase trabalham juntos, o resultado \u00e9 o seguinte:<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/10403-geospatial-bounding-box.gif\" alt=\"Geospatial bounding box\" \/><\/span><\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_distance_search_2\">Pesquisa de dist\u00e2ncia<\/h3>\n<div class=\"paragraph\">\n<p>A implementa\u00e7\u00e3o da consulta geoestat\u00edstica \"dist\u00e2ncia\" ser\u00e1 semelhante \u00e0 IU da caixa delimitadora. Desta vez, voc\u00ea s\u00f3 precisa clicar em um \u00fanico ponto no mapa. No entanto, ser\u00e1 necess\u00e1rio digitar uma dist\u00e2ncia (em milhas).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>O <code>google-map<\/code> ter\u00e1 a mesma apar\u00eancia. O componente <code>clickMap<\/code> \u00e9 diferente:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">public clickMap(event: any) {\r\n    var latLng = event.detail.latLng,\r\n        lat = latLng.lat(),\r\n        lng = latLng.lng();\r\n\r\n    this.longitude = lng;\r\n    this.latitude = lat;\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Especifique uma dist\u00e2ncia (em milhas) e, em seguida, clique em \"search\" (pesquisar) para fazer uma solicita\u00e7\u00e3o POST para o endpoint que escrevemos anteriormente.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">geosearchbox.html:\r\n\r\n    &lt;p&gt;\r\n        Distance search:\r\n        &lt;br \/&gt;\r\n        Latitude: &lt;input type=&quot;text&quot; value=&quot;${ latitude }&quot; \/&gt;\r\n        Longitude: &lt;input type=&quot;text&quot; value=&quot;${ longitude }&quot; \/&gt;\r\n        &lt;br \/&gt;\r\n        Distance (miles): &lt;input type=&quot;text&quot; value=&quot;${ distance }&quot; \/&gt;\r\n        &lt;br \/&gt;\r\n        &lt;input if.bind=&quot;latitude&quot; click.trigger=&quot;searchClick()&quot; type=&quot;button&quot; name=&quot;search&quot; value=&quot;Pesquisa&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n\r\ngeosearchbox.ts:\r\n\r\n    public searchClick() {\r\n        let pointSearch = {\r\n            latitude: this.latitude,\r\n            longitude: this.longitude,\r\n            distance: this.distance\r\n        };\r\n\r\n        console.log(&quot;POSTing to api\/Point: &quot; + JSON.stringify(pointSearch));\r\n\r\n        this.http.fetch(&#039;api\/Point&#039;, { method: &quot;POST&quot;, body: json(pointSearch) })\r\n            .then(result =&gt; result.json() as Promise&lt;any[]&gt;)\r\n            .then(data =&gt; {\r\n                this.markers = data;\r\n            });\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Abaixo est\u00e1 um clipe da pesquisa em movimento. Observe como os resultados mudam \u00e0 medida que eu movo a coordenada.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/10404-geospatial-distance.gif\" alt=\"Geospatial distance point search query\" \/><\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_summary\">Resumo<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Com o recurso integrado do Couchbase <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-basics-spatial-databases-and-nosql-examples\/\">indexa\u00e7\u00e3o geoespacial<\/a> e o recurso de pesquisa, toda a matem\u00e1tica e a pesquisa s\u00e3o delegadas \u00e0 plataforma de dados Couchbase. Assim, voc\u00ea pode se concentrar na cria\u00e7\u00e3o de uma interface de usu\u00e1rio incr\u00edvel (melhor do que a minha, de qualquer forma) e de uma l\u00f3gica comercial s\u00f3lida como uma rocha.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Certifique-se de <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/fts\/fts-geospatial-queries.html\">Confira a documenta\u00e7\u00e3o<\/a> para obter uma vis\u00e3o geral completa dos recursos geoespaciais do Couchbase. Leia esta postagem do blog para saber mais sobre <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-basics-spatial-databases-and-nosql-examples\/\">bancos de dados espaciais<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Se precisar de ajuda ou tiver d\u00favidas, consulte o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/c\/couchbase-server\/\">F\u00f3runs do Couchbase Server<\/a>e, se voc\u00ea tiver alguma d\u00favida sobre o SDK do Couchbase .NET, consulte o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/c\/net-sdk\/\">F\u00f3runs do SDK do .NET<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Se quiser entrar em contato comigo, deixe um coment\u00e1rio ou encontre-me em <a href=\"https:\/\/twitter.com\/mgroves\">Twitter @mgroves<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Geospatial search is now fully supported in Couchbase Server 5.5. Check out the Couchbase Server 5.5 announcement, and download the developer build for free right now. In this post, I\u2019m going to demonstrate the geospatial capabilities of Couchbase Full Text [&hellip;]<\/p>","protected":false},"author":71,"featured_media":10791,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10126,10127,1816,2165,8683,9327],"tags":[2182,1803,1543,1718],"ppma_author":[8937],"class_list":["post-4870","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-asp-dotnet","category-c-sharp","category-couchbase-server","category-full-text-search","category-geospatial","category-javascript","tag-devbuild","tag-google-maps","tag-javascript","tag-typescript"],"acf":[],"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>Geospatial Search With ASP.NET Core, Aurelia, Google Maps<\/title>\n<meta name=\"description\" content=\"Geospatial search is fully supported in Couchbase Server 5.5. This post demonstrates geospatial search capabilities with a web-based UI.\" \/>\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.couchbase.com\/blog\/pt\/geospatial-aspnet-aurelia-google-maps\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Geospatial Search With ASP.NET Core, Aurelia, Google Maps\" \/>\n<meta property=\"og:description\" content=\"Geospatial search is fully supported in Couchbase Server 5.5. This post demonstrates geospatial search capabilities with a web-based UI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-aspnet-aurelia-google-maps\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-23T17:26:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:45:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"642\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Geospatial Search With ASP.NET Core, Aurelia, Google Maps\",\"datePublished\":\"2018-03-23T17:26:01+00:00\",\"dateModified\":\"2025-06-14T05:45:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/\"},\"wordCount\":1397,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg\",\"keywords\":[\"devbuild\",\"Google Maps\",\"javascript\",\"TypeScript\"],\"articleSection\":[\".NET\",\"ASP.NET\",\"C#\",\"Couchbase Server\",\"Full-Text Search\",\"Geospatial\",\"JavaScript\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/\",\"name\":\"Geospatial Search With ASP.NET Core, Aurelia, Google Maps\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg\",\"datePublished\":\"2018-03-23T17:26:01+00:00\",\"dateModified\":\"2025-06-14T05:45:10+00:00\",\"description\":\"Geospatial search is fully supported in Couchbase Server 5.5. This post demonstrates geospatial search capabilities with a web-based UI.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg\",\"width\":1300,\"height\":642,\"caption\":\"A compass laid atop a map with a red X marking a proposed destination\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Geospatial Search With ASP.NET Core, Aurelia, Google Maps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Pesquisa geoespacial com ASP.NET Core, Aurelia e Google Maps","description":"A pesquisa geoespacial \u00e9 totalmente compat\u00edvel com o Couchbase Server 5.5. Esta postagem demonstra os recursos de pesquisa geoespacial com uma interface de usu\u00e1rio baseada na Web.","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.couchbase.com\/blog\/pt\/geospatial-aspnet-aurelia-google-maps\/","og_locale":"pt_BR","og_type":"article","og_title":"Geospatial Search With ASP.NET Core, Aurelia, Google Maps","og_description":"Geospatial search is fully supported in Couchbase Server 5.5. This post demonstrates geospatial search capabilities with a web-based UI.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/geospatial-aspnet-aurelia-google-maps\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-03-23T17:26:01+00:00","article_modified_time":"2025-06-14T05:45:10+00:00","og_image":[{"width":1300,"height":642,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Geospatial Search With ASP.NET Core, Aurelia, Google Maps","datePublished":"2018-03-23T17:26:01+00:00","dateModified":"2025-06-14T05:45:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/"},"wordCount":1397,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg","keywords":["devbuild","Google Maps","javascript","TypeScript"],"articleSection":[".NET","ASP.NET","C#","Couchbase Server","Full-Text Search","Geospatial","JavaScript"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/","url":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/","name":"Pesquisa geoespacial com ASP.NET Core, Aurelia e Google Maps","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg","datePublished":"2018-03-23T17:26:01+00:00","dateModified":"2025-06-14T05:45:10+00:00","description":"A pesquisa geoespacial \u00e9 totalmente compat\u00edvel com o Couchbase Server 5.5. Esta postagem demonstra os recursos de pesquisa geoespacial com uma interface de usu\u00e1rio baseada na Web.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/104-hero-map-geospatial_RESIZED.jpg","width":1300,"height":642,"caption":"A compass laid atop a map with a red X marking a proposed destination"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/geospatial-aspnet-aurelia-google-maps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Geospatial Search With ASP.NET Core, Aurelia, Google Maps"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves \u00e9 um cara que adora programar. N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"Matthew D. Groves \u00e9 um cara que adora programar.  N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa.  Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90.  Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores.  Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4870"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4870\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10791"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4870"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}