{"id":1214,"date":"2022-05-08T15:59:59","date_gmt":"2022-05-08T13:59:59","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=1214"},"modified":"2022-05-12T12:28:50","modified_gmt":"2022-05-12T10:28:50","slug":"openlayers-point-linestring-multilinestring-icon-exemple-canonic","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=1214","title":{"rendered":"Openlayers: Point, LineString, MultiLineString, Icon. Exemple can\u00f2nic"},"content":{"rendered":"<p><a href=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2022\/05\/exemple_punts_linies_icones.png\"><img src=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2022\/05\/exemple_punts_linies_icones.png\" alt=\"Exemple can\u00f2nic Openlayers\" title=\"Exemple can\u00f2nic Openlayers\" width=\"200\" class=\"alignright size-medium wp-image-2338\"><\/a>Anem a mostrar un exemple m\u00ednim d&#8217;<b>Openlauers<\/b> que aclareixi els conceptes de dibuixar un punt, una l\u00ednia, una multil\u00ednia i una icona. I com aplicar estils a aquests elements.<\/p>\n<p>Definim primer aquests elements (punts, l\u00ednies, multil\u00ednies, icones) a partir de les dades d&#8217;exemple (coordenades). Aleshores definim <em>features<\/em> a partir d&#8217;aquests elements, que afegim a un array de <em>features<\/em>. Cada <em>feature<\/em> pot tenir el seu estil.<\/p>\n<p>Definim despr\u00e9s el <em>vectorSource<\/em> a partir de l&#8217;array de <em>features<\/em>. Despr\u00e9s definim el <em>VectorLayer<\/em> a partir del <em>vectorSource<\/em>. I finalment afegim al mapa els <em>layers<\/em> que volem pintar.<\/p>\n<p>Aquest \u00e9s el codi inicial i previ per a un petit projecte que vull fer, que tracta d&#8217;una aplicaci\u00f3 m\u00f2bil per enviar les coordenades de posici\u00f3 a una <em>RestAPI<\/em> on hi ha una base de dades (<em>MongoDB<\/em>), i amb una aplicaci\u00f3 web (front-end, que \u00e9s la part que aqu\u00ed es comen\u00e7a a explicar) poder visualitzar el recorregut del ciclista (la idea del projecte \u00e9s poder fer el <em>tracking<\/em> d&#8217;un ciclista en una primera etapa; i en una etapa posterior poder fer el <em>tracking<\/em> de tots els ciclistes que participen en una cursa o sortida).<\/p>\n<p>El codi final:<br \/>\n<code><br \/>\nimport 'ol\/ol.css';<br \/>\nimport Feature from 'ol\/Feature';<br \/>\nimport Map from 'ol\/Map';<br \/>\nimport VectorSource from 'ol\/source\/Vector';<br \/>\nimport View from 'ol\/View';<br \/>\nimport {Icon, Circle as CircleStyle, Fill, Stroke, Style} from 'ol\/style';<br \/>\nimport {LineString, MultiLineString, Point} from 'ol\/geom';<br \/>\nimport {getVectorContext} from 'ol\/render';<br \/>\nimport {fromLonLat} from 'ol\/proj';<br \/>\nimport {Tile as TileLayer, Vector as VectorLayer} from 'ol\/layer';<br \/>\nimport OSM from 'ol\/source\/OSM';<\/code><\/p>\n<p><code>\/\/dades<br \/>\nvar json_points = [<br \/>\n{'lon':1.4234,'lat':41.2344,'name':'punt 0'},<br \/>\n{'lon':1.4235,'lat':41.2345,'name':'punt 1'},<br \/>\n{'lon':1.4235,'lat':41.2346,'name':'punt 2'},<br \/>\n{'lon':1.4236,'lat':41.2346,'name':'punt 3'},<br \/>\n{'lon':1.4236,'lat':41.2347,'name':'punt 4'},<br \/>\n{'lon':1.4238,'lat':41.2349,'name':'punt 4'},<br \/>\n{'lon':1.4239,'lat':41.2350,'name':'punt 4'}<br \/>\n];<\/code><\/p>\n<p><code>\/\/ estils<br \/>\nvar styles = {<br \/>\n'Point': new Style({<br \/>\nimage: new CircleStyle({<br \/>\nfill: new Fill({<br \/>\ncolor: 'rgba(100,100,100,.8)',<br \/>\n}),<br \/>\nradius: 3,<br \/>\nstroke: new Stroke({<br \/>\ncolor: '#000000',<br \/>\nwidth: 2,<br \/>\n}),<br \/>\n}),<br \/>\n}),<br \/>\n'LineString': new Style({<br \/>\nstroke: new Stroke({<br \/>\ncolor: '#f00',<br \/>\nwidth: 3,<br \/>\n}),<br \/>\n}),<br \/>\n'MultiLineString': new Style({<br \/>\nstroke: new Stroke({<br \/>\ncolor: '#000000',<br \/>\nwidth: .8,<br \/>\n}),<br \/>\n}),<br \/>\n'icona': new Style({<br \/>\nimage: new Icon({<br \/>\nanchor: [0.5,20],<br \/>\nanchorXUnits: 'fraction',<br \/>\nanchorYUnits: 'pixels',<br \/>\nsrc: 'img\/circle_red_8.png'<br \/>\n})<br \/>\n})<br \/>\n};<\/code><\/p>\n<p><code>\/\/ points<br \/>\nvar features_points = new Array();<\/code><\/p>\n<p><code>var feature_point0 = new Feature({<br \/>\n'geometry': new Point(fromLonLat([json_points[0].lon,json_points[0].lat])),<br \/>\n'name': json_points[0].name,<br \/>\n});<\/code><\/p>\n<p><code>var feature_point1 = new Feature({<br \/>\n'geometry': new Point(fromLonLat([json_points[1].lon,json_points[1].lat])),<br \/>\n'name': json_points[0].name,<br \/>\n});<\/code><\/p>\n<p><code>var feature_point2 = new Feature({<br \/>\n'geometry': new Point(fromLonLat([json_points[2].lon,json_points[2].lat])),<br \/>\n'name': json_points[0].name,<br \/>\n});<\/code><\/p>\n<p><code>var feature_point3 = new Feature({<br \/>\n'geometry': new Point(fromLonLat([json_points[3].lon,json_points[3].lat])),<br \/>\n'name': json_points[0].name,<br \/>\n});<\/code><\/p>\n<p><code>var feature_point4 = new Feature({<br \/>\n'geometry': new Point(fromLonLat([json_points[4].lon,json_points[4].lat])),<br \/>\n'name': json_points[0].name,<br \/>\n});<\/code><\/p>\n<p><code>features_points.push(feature_point0)<br \/>\nfeatures_points.push(feature_point1)<br \/>\nfeatures_points.push(feature_point2)<br \/>\nfeatures_points.push(feature_point3)<br \/>\nfeatures_points.push(feature_point4)<\/code><\/p>\n<p><code>\/\/ l\u00ednies<br \/>\n\/\/Create a feature and add geometry as a thing<br \/>\nvar track1 = new MultiLineString([<br \/>\n[[json_points[0].lon,json_points[0].lat],[json_points[1].lon,json_points[1].lat]],<br \/>\n[[json_points[1].lon,json_points[1].lat],[json_points[2].lon,json_points[2].lat]],<br \/>\n[[json_points[2].lon,json_points[2].lat],[json_points[3].lon,json_points[3].lat]],<br \/>\n[[json_points[3].lon,json_points[3].lat],[json_points[4].lon,json_points[4].lat]]<br \/>\n]).transform('EPSG:4326','EPSG:3857');<\/p>\n<p>var feature_multilinestring = new Feature({<br \/>\ngeometry: track1,<br \/>\nname: 'nom track 1'<br \/>\n});<\/p>\n<p>var line1 = new LineString([<br \/>\n[json_points[5].lon,json_points[5].lat],[json_points[6].lon,json_points[6].lat]<br \/>\n]).transform('EPSG:4326','EPSG:3857');<\/p>\n<p>var feature_linestring = new Feature({<br \/>\ngeometry: line1,<br \/>\nname: 'nom l\u00ednia 1'<br \/>\n});<\/p>\n<p>var features_strings = new Array();<\/p>\n<p>features_strings.push(feature_multilinestring)<br \/>\nfeatures_strings.push(feature_linestring)<\/p>\n<p>\/\/icones<br \/>\nvar features_icones = new Array();<\/p>\n<p>let feature_icona1 = new Feature({<br \/>\ngeometry: new Point(fromLonLat([json_points[5].lon,json_points[5].lat])),<br \/>\nname: 'Inici',<br \/>\n});<\/p>\n<p>let feature_icona2 = new Feature({<br \/>\ngeometry: new Point(fromLonLat([json_points[6].lon,json_points[6].lat])),<br \/>\nname: 'Final',<br \/>\n});<\/p>\n<p>feature_icona1.setStyle(styles.icona); \/\/no cal si defineixo el estil en el layer.<br \/>\nfeature_icona2.setStyle(styles.icona); \/\/per\u00f2 definir\u00e9 l'estil en la icona si cada icona ha de tenir un estil diferent<\/p>\n<p>features_icones.push(feature_icona1);<br \/>\nfeatures_icones.push(feature_icona2);<\/p>\n<p>\/\/ vectorSources<br \/>\nvar vectorSourcePoints = new VectorSource({<br \/>\nfeatures: features_points,<br \/>\nwrapX: false,<br \/>\n});<\/p>\n<p>var vectorSourceStrings = new VectorSource({<br \/>\nfeatures: features_strings,<br \/>\nwrapX: false,<br \/>\n});<\/p>\n<p>var vectorSourceIcones = new VectorSource({<br \/>\nfeatures: features_icones,<br \/>\nwrapX: false,<br \/>\n});<\/p>\n<p>\/\/ layers<br \/>\nvar layerPoints = new VectorLayer({<br \/>\nsource: vectorSourcePoints,<br \/>\nstyle: styles.Point,<br \/>\n});<\/p>\n<p>var layerStrings = new VectorLayer({<br \/>\nsource: vectorSourceStrings,<br \/>\nstyle: styles.MultiLineString,<br \/>\n});<\/p>\n<p>var layerIcones = new VectorLayer({<br \/>\nsource: vectorSourceIcones,<br \/>\nstyle: styles.icona,<br \/>\n});<\/p>\n<p><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code>var map = new Map({<br \/>\nlayers: [<br \/>\nnew TileLayer({<br \/>\nsource: new OSM({<br \/>\nlayer: 'OSM'<br \/>\n})<br \/>\n}),<br \/>\nlayerPoints,<br \/>\nlayerStrings,<br \/>\nlayerIcones<br \/>\n],<br \/>\ntarget: 'map',<br \/>\nview: new View({<br \/>\ncenter: fromLonLat([1.4234, 41.2344]),<br \/>\nzoom: 18<br \/>\n})<br \/>\n});<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anem a mostrar un exemple m\u00ednim d&#8217;Openlauers que aclareixi els conceptes de dibuixar un punt, una l\u00ednia, una multil\u00ednia i una icona. I com aplicar estils a aquests elements. Definim primer aquests elements (punts, l\u00ednies, multil\u00ednies, icones) a partir de les dades d&#8217;exemple (coordenades). Aleshores definim features a partir d&#8217;aquests elements, que afegim a un [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,16,12,44,36,534],"tags":[],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/1214"}],"collection":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1214"}],"version-history":[{"count":8,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/1214\/revisions"}],"predecessor-version":[{"id":1237,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/1214\/revisions\/1237"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}