{"id":5476,"date":"2016-06-01T07:07:54","date_gmt":"2016-06-01T10:07:54","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=5476"},"modified":"2016-08-12T16:30:27","modified_gmt":"2016-08-12T19:30:27","slug":"introducao-ao-openlayers-3-estilo","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/06\/01\/introducao-ao-openlayers-3-estilo\/","title":{"rendered":"Introdu\u00e7\u00e3o ao OpenLayers 3: Estilo"},"content":{"rendered":"<p>A classe <strong>ol.layer.Vector<\/strong> fornece um tipo de camada bastante flex\u00edvel. Por padr\u00e3o, quando voc\u00ea cria uma nova camada de vetor, n\u00e3o s\u00e3o feitas suposi\u00e7\u00f5es de onde os recursos para a camada vir\u00e3o, uma vez que este \u00e9 de dom\u00ednio da classe <strong>ol.source.Vector<\/strong>. <\/p>\n<p>A classe ol.format \u00e9 respons\u00e1vel \u200b\u200bpela an\u00e1lise de dados a partir do servidor que representa as caracter\u00edsticas do vetor. Na maioria das vezes voc\u00ea n\u00e3o ir\u00e1 us\u00e1-los diretamente, mas voc\u00ea estar\u00e1 usando sua fonte correspondente, por exemplo <strong>ol.source.KML<\/strong>. O <strong>ol.format<\/strong> transforma dados bruto em objetos da classe <strong>ol.Feature<\/strong>.<\/p>\n<p>Considere os dois blocos de dados abaixo. Ambos representam o mesmo objeto <strong>ol.Feature<\/strong> (um ponto em Barcelona, \u200b\u200bEspanha). O primeiro \u00e9 serializado como GeoJSON (usando <strong>ol.format.GeoJSON<\/strong>), e o  segundo \u00e9 serializado como KML (usando <strong>ol.format.KML<\/strong>).<\/p>\n<p>GeoJSON:<\/p>\n<pre>{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\"type\"&nbsp;:&nbsp;&nbsp;\"Feature\"&nbsp;,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\"id\"&nbsp;:&nbsp;&nbsp;\"OpenLayers.Feature.Vector_107\"&nbsp;,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\"properties\"&nbsp;:&nbsp;&nbsp;{},&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\"geometry\"&nbsp;:&nbsp;&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"type\"&nbsp;:&nbsp;&nbsp;\"Point\"&nbsp;,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"coordinates\"&nbsp;:&nbsp;&nbsp;[&nbsp;-&nbsp;104.98&nbsp;,&nbsp;&nbsp;39.76&nbsp;]&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;\r\n}<\/pre>\n<p>KML:<\/p>\n<pre>&lt;?&nbsp;xml&nbsp;version&nbsp;=&nbsp;\"1.0\"&nbsp;encoding=\"utf-8\"?&gt;&nbsp;\r\n&lt;kml&nbsp;&nbsp;xmlns=&nbsp;\"http:\/\/earth.google.com\/kml\/2.2\"&nbsp;&gt;&nbsp;\r\n&nbsp;&nbsp;&lt;Placemark&gt;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;Point&gt;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;coordinates&gt;&nbsp;-104.98,39.76&nbsp;&lt;\/coordinates&gt;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/Point&gt;&nbsp;\r\n&nbsp;&nbsp;&lt;\/Placemark&gt;&nbsp;\r\n&lt;\/kml&gt;<\/pre>\n<p>Ao denominar elementos HTML, voc\u00ea pode usar o seguinte CSS:<\/p>\n<pre>.someClass&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;blue;\r\n&nbsp;&nbsp;&nbsp;&nbsp;border-width:&nbsp;1px;\r\n&nbsp;&nbsp;&nbsp;&nbsp;border-color:&nbsp;verde-oliva;\r\n}<\/pre>\n<p>O .someClass \u00e9 um selector (neste caso, ele seleciona todos os elementos que incluem o nome da classe &#8220;someClass&#8221; ) e o bloco que segue \u00e9 um grupo de propriedades e valores, tamb\u00e9m conhecido como declara\u00e7\u00e3o de estilo.<\/p>\n<p>A camada de vetor pode ter estilo. Mais especificamente, uma camada de vetor pode ser configurada com um objeto <strong>ol.style.Style<\/strong>, uma matriz de objetos <strong>ol.style.Style<\/strong>, ou uma inst\u00e2ncia <strong>ol.Feature<\/strong> que retorne uma matriz de objetos <strong>ol.style<\/strong>.<\/p>\n<p>Aqui est\u00e1 um exemplo de uma camada de vetor configurado com um estilo:<\/p>\n<pre>var&nbsp;layer&nbsp;=&nbsp;new&nbsp;ol.layer.Vector({\r\n&nbsp;&nbsp;source:&nbsp;new&nbsp;ol.source.Vector(),\r\n&nbsp;&nbsp;style:&nbsp;new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;...\r\n&nbsp;&nbsp;})\r\n});<\/pre>\n<p>E aqui est\u00e1 um exemplo de uma camada de vetor configurada com uma fun\u00e7\u00e3o que aplica um estilo a todos os recursos que t\u00eam um atributo chamado <strong>class<\/strong> com um valor de <strong>&#8216;someClass&#8217;<\/strong> :<\/p>\n<pre>var&nbsp;layer&nbsp;=&nbsp;new&nbsp;ol.layer.Vector({\r\n&nbsp;&nbsp;source:&nbsp;new&nbsp;ol.source.Vector(),\r\n&nbsp;&nbsp;style:&nbsp;function(feature,&nbsp;resolution)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(feature.get('class')&nbsp;===&nbsp;'someClass')&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;create&nbsp;styles...\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;styles;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;},\r\n});<\/pre>\n<p>No OpenLayers 3 o equivalente a um bloco de declara\u00e7\u00e3o em CSS \u00e9 o Symbolizer. Para apresentar caracter\u00edsticas de pol\u00edgonos com um fundo azul e um 1 pixel de largura, voc\u00ea usaria dois symbolizers como mostrado a seguir:<\/p>\n<pre>new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;fill:&nbsp;new&nbsp;ol.style.Fill({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'blue'\r\n&nbsp;&nbsp;}),\r\n&nbsp;&nbsp;stroke:&nbsp;new&nbsp;ol.style.Stroke({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'olive',\r\n&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;1\r\n&nbsp;&nbsp;})\r\n});<\/pre>\n<p>Dependendo do tipo de geometria, symbolizers diferentes podem ser aplicados. Linhas funcionam como pol\u00edgonos, mas eles n\u00e3o podem ter um preenchimento. Os pontos podem ser decorados com <strong>ol.style.Circle<\/strong> ou <strong>ol.style.Icon<\/strong>. O primeiro \u00e9 usado para processar formas de c\u00edrculo, e este \u00faltimo usa arquivos (por exemplo, png). Aqui est\u00e1 um exemplo de um estilo com um c\u00edrculo:<\/p>\n<pre>new&nbsp;ol.style.Circle({\r\n&nbsp;&nbsp;radius:&nbsp;20,\r\n&nbsp;&nbsp;fill:&nbsp;new&nbsp;ol.style.Fill({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'#ff9900',\r\n&nbsp;&nbsp;&nbsp;&nbsp;opacity:&nbsp;0.6\r\n&nbsp;&nbsp;}),\r\n&nbsp;&nbsp;stroke:&nbsp;new&nbsp;ol.style.Stroke({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'#ffcc00',\r\n&nbsp;&nbsp;&nbsp;&nbsp;opacity:&nbsp;0.4\r\n&nbsp;&nbsp;})\r\n});<\/pre>\n<p>Um objeto <strong>ol.style.Style<\/strong> tem 4 propriedades: fill, image, stroke and text. Ele tamb\u00e9m tem uma propriedade opcional <strong>zIndex<\/strong>. A fun\u00e7\u00e3o de estilo vai retornar um array de objetos ol.style.Style.<\/p>\n<p>Se voc\u00ea quiser que todos os recursos sejam representados pela cor vermelha, exceto aqueles que t\u00eam uma classe de atributo com o valor de &#8220;someClass&#8221; (e voc\u00ea quer que essas tenham caracter\u00edsticas de cor azul), voc\u00ea pode criar uma fun\u00e7\u00e3o estilo parecida com a seguinte:<\/p>\n<pre>style :  ( function ()  { \r\n  var  someStyle  =  [ new  ol . style . Style ({ \r\n    fill :  new  ol . style . Fill ({ \r\n      color :  'blue' \r\n    }), \r\n    stroke :  new  ol . style . Stroke ({ \r\n      color :  'olive' , \r\n      width :  1 \r\n    }) \r\n  })]; \r\n  var  otherStyle  =  [ new  ol . style . Style ({ \r\n    fill :  new  ol . style . Fill ({ \r\n      color :  'red' \r\n    }) \r\n  })]; \r\n  return  function ( feature ,  resolution )  { \r\n    if  ( feature . get ( 'class' )  ===  \"someClass\" )  { \r\n      return  someStyle ; \r\n    }  else  { \r\n      return  otherStyle ; \r\n    } \r\n  }; \r\n}())<\/pre>\n<p>Um arquivo CSS permite a cria\u00e7\u00e3o de pseudo-classes em seletores. Estes basicamente limitam a aplica\u00e7\u00e3o das declara\u00e7\u00f5es de estilo baseado em contextos que n\u00e3o s\u00e3o facilmente representados no selector, como a posi\u00e7\u00e3o do mouse, elementos vizinhos, ou o hist\u00f3rico do navegador. <\/p>\n<p>No OpenLayers 3, voc\u00ea pode usar um conceito um pouco semelhante como op\u00e7\u00e3o de configura\u00e7\u00e3o de estilo em um ol.interaction.Select. Veja o seguinte exemplo:<\/p>\n<pre>var&nbsp;select&nbsp;=&nbsp;new&nbsp;ol.interaction.Select({\r\n&nbsp;&nbsp;style:&nbsp;new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;new&nbsp;ol.style.Fill({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'rgba(255,255,255,0.5)'\r\n&nbsp;&nbsp;&nbsp;&nbsp;})\r\n&nbsp;&nbsp;})\r\n});<\/pre>\n<p>Agora vamos aplicar os conceitos acima no nosso mapa. <\/p>\n<pre>&lt;!doctype&nbsp;html&gt;\r\n&lt;html&nbsp;lang=\"en\"&gt;\r\n&nbsp;&nbsp;&lt;head&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;link&nbsp;rel=\"stylesheet\"&nbsp;href=\"ol3\/ol.css\"&nbsp;type=\"text\/css\"&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;#map&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;gray;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;256px;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;512px;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/style&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;OpenLayers&nbsp;3&nbsp;example&lt;\/title&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;src=\"ol3\/ol.js\"&nbsp;type=\"text\/javascript\"&gt;&lt;\/script&gt;\r\n&nbsp;&nbsp;&lt;\/head&gt;\r\n&nbsp;&nbsp;&lt;body&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&gt;My&nbsp;Map&lt;\/h1&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id=\"map\"&gt;&lt;\/div&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type=\"text\/javascript\"&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;map&nbsp;=&nbsp;new&nbsp;ol.Map({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;'map',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layers:&nbsp;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;ol.layer.Vector({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title:&nbsp;'Buildings',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source:&nbsp;new&nbsp;ol.source.KML({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;'data\/layers\/buildings.kml',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extractStyles:&nbsp;false\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}),\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style:&nbsp;new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stroke:&nbsp;new&nbsp;ol.style.Stroke({color:&nbsp;'red',&nbsp;width:&nbsp;2})\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view:&nbsp;new&nbsp;ol.View({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;projection:&nbsp;'EPSG:4326',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;center:&nbsp;[-122.791859392,&nbsp;42.3099154789],\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoom:&nbsp;16\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/script&gt;\r\n&nbsp;&nbsp;&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Salve o seu arquivo map.html, e abra seu mapa no navegador para ver o resultado.<\/p>\n<p>Ap\u00f3s nossa compreens\u00e3o b\u00e1sica de estilo no OpenLayers, podemos criar uma fun\u00e7\u00e3o que exibe <em>Buildings<\/em> em cores diferentes com base no seu tamanho. No seu c\u00f3digo de inicializa\u00e7\u00e3o mapa, substitua a op\u00e7\u00e3o de estilo de configura\u00e7\u00e3o como o seguinte:<\/p>\n<pre>style:&nbsp;(function()&nbsp;{\r\n&nbsp;&nbsp;var&nbsp;defaultStyle&nbsp;=&nbsp;[new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;new&nbsp;ol.style.Fill({color:&nbsp;'navy'}),\r\n&nbsp;&nbsp;&nbsp;&nbsp;stroke:&nbsp;new&nbsp;ol.style.Stroke({color:&nbsp;'black',&nbsp;width:&nbsp;1})\r\n&nbsp;&nbsp;})];\r\n&nbsp;&nbsp;var&nbsp;ruleStyle&nbsp;=&nbsp;[new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;new&nbsp;ol.style.Fill({color:&nbsp;'olive'}),\r\n&nbsp;&nbsp;&nbsp;&nbsp;stroke:&nbsp;new&nbsp;ol.style.Stroke({color:&nbsp;'black',&nbsp;width:&nbsp;1})\r\n&nbsp;&nbsp;})];\r\n&nbsp;&nbsp;return&nbsp;function(feature,&nbsp;resolution)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(feature.get('shape_area')&nbsp;<&nbsp;3000)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ruleStyle;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;defaultStyle;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;};\r\n})()<\/pre>\n<p>Veja o resultado:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/style1.png\" alt=\"style1\" width=\"513\" height=\"257\" class=\"aligncenter size-full wp-image-5504\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/style1.png 513w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/style1-300x150.png 300w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><\/p>\n<p>Agora, para finalizar, vamos adicionar um r\u00f3tulo. Por simplicidade, estamos apenas usando um r\u00f3tulo e um contorno preto com o estilo.<\/p>\n<pre>style:&nbsp;(function()&nbsp;{\r\n&nbsp;&nbsp;var&nbsp;stroke&nbsp;=&nbsp;new&nbsp;ol.style.Stroke({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'black'\r\n&nbsp;&nbsp;});\r\n&nbsp;&nbsp;var&nbsp;textStroke&nbsp;=&nbsp;new&nbsp;ol.style.Stroke({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'#fff',\r\n&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;3\r\n&nbsp;&nbsp;});\r\n&nbsp;&nbsp;var&nbsp;textFill&nbsp;=&nbsp;new&nbsp;ol.style.Fill({\r\n&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'#000'\r\n&nbsp;&nbsp;});\r\n&nbsp;&nbsp;return&nbsp;function(feature,&nbsp;resolution)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[new&nbsp;ol.style.Style({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stroke:&nbsp;stroke,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;new&nbsp;ol.style.Text({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;'12px&nbsp;Calibri,sans-serif',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;feature.get('key'),\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;textFill,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stroke:&nbsp;textStroke\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})\r\n&nbsp;&nbsp;&nbsp;&nbsp;})];\r\n&nbsp;&nbsp;};\r\n})()<\/pre>\n<p>Veja o resultado:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/style2.png\" alt=\"style2\" width=\"512\" height=\"255\" class=\"aligncenter size-full wp-image-5505\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/style2.png 512w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/style2-300x149.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/p>\n<p>Com este post, encerramos as publica\u00e7\u00f5es t\u00e9cnicas da s\u00e9rie \"Introdu\u00e7\u00e3o ao OpenLayers 3\", que foi baseada no <a href=\"http:\/\/workshops.boundlessgeo.com\/openlayers3\/\" target=\"_blank\">Workshop de OpenLayers 3<\/a> dispon\u00edvel no site da Boundless.<\/p>\n<p>Amanh\u00e3 teremos o <a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2016\/06\/02\/introducao-ao-openlayers-3-livros\/\" target=\"_blank\">\u00faltimo post<\/a>, com a dica de livros sobre OpenLayers 3, n\u00e3o perca!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A classe ol.layer.Vector fornece um tipo de camada bastante flex\u00edvel. Por padr\u00e3o, quando voc\u00ea cria uma nova camada de vetor, n\u00e3o s\u00e3o feitas suposi\u00e7\u00f5es de onde os recursos para a camada vir\u00e3o, uma vez que este \u00e9 de dom\u00ednio da&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/06\/01\/introducao-ao-openlayers-3-estilo\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":5477,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,132,80,6],"tags":[223,250],"class_list":["post-5476","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","category-openlayers","category-programacao","category-tecnologia","tag-gis","tag-openlayers"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=5476"}],"version-history":[{"count":10,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5476\/revisions"}],"predecessor-version":[{"id":6216,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5476\/revisions\/6216"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/5477"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=5476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=5476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=5476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}