{"id":1867,"date":"2015-11-02T11:33:32","date_gmt":"2015-11-02T10:33:32","guid":{"rendered":"https:\/\/www.opengis.ch\/?p=1867"},"modified":"2020-04-29T16:05:41","modified_gmt":"2020-04-29T14:05:41","slug":"qgis-crowdfunding-2-5d-rendering","status":"publish","type":"post","link":"https:\/\/www.opengis.ch\/de\/2015\/11\/02\/qgis-crowdfunding-2-5d-rendering\/","title":{"rendered":"QGIS Crowdfunding: 2.5D Rendering"},"content":{"rendered":"<p>QGIS has a great variety of rendering possibilities from categorization to data defined settings which allows to make awesome cartographic products. It also features some extensions like qgis2threejs and globe that make it possible to explore the third dimension. While these extensions are great tools they have their limitations like they do not fully integrate with the styling system or cannot be used in print composers.<br \/>\n<div id=\"attachment_1868\" style=\"width: 773px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1868\" class=\"wp-image-1868 size-full\" src=\"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2015\/10\/title.png?resize=750%2C525&#038;ssl=1\" alt=\"2.5D rendering\" width=\"750\" height=\"525\" \/><p id=\"caption-attachment-1868\" class=\"wp-caption-text\">Mockup of a possible rendering result with a combination of classify and 2.5D effect<\/p><\/div>\nThis project aims to improve the internal possibilities of QGIS to give an oblique view 3D effect based on a height attribute and an angle while fully preserving all the possibilities which the QGIS styling offers. But it doesn&#8217;t stop there, the whole rendering is built in a modular way so you can use all of its parts for countless other possibilities.<br \/>\n<em>Funds are already available for a major part of this project thanks to <a href=\"https:\/\/www.aduga.org\" target=\"_blank\" rel=\"noopener noreferrer\">ADUGA<\/a> and the <a href=\"https:\/\/www.picardie.fr\/\" target=\"_blank\" rel=\"noopener noreferrer\">Regional Council of Picardy<\/a>. For the missing pieces we would like to ask the community to help us to create the required extensions to include these amazing new functionalities into QGIS.<\/em><\/p>\n<h2>Geometry modifiers<\/h2>\n<p>Every building exists of the parts: floor, walls and roof. To get a nice effect can paint a shadow on the floor, then draw the walls for the buildings and finally paint the roof.<br \/>\n\nThe wall as well as the roof geometries are nothing but modified versions of the source geometry. The roof is a translated version of it, the walls a 2 dimensional extrusion (the area between footprint and translated roof outline).<br \/>\nA new possibility to define a <em>geometry modifier<\/em> will be introduced. For every symbol layer in the layer styling it will be possible to define an expression that transforms the geometry before it is being painted.<\/p>\n<h2>Rendering order<\/h2>\n<p>Because buildings which are further apart from the camera need to be painted first and buildings closest to the camera last it is required that we can control the order in which features are rendered. It will be possible to define an expression (or simply a field) in which features are rendered. For this use-case this will be based on the geometry but you may use this to control the rendering order of any kind of layer. Or if you are a plugin author you can just send any feature request with an <em>order by<\/em>\u00a0to the layer.<br \/>\n<em>It is planned that for best compatibility this will be implemented in a provider independent way.\u00a0Due to performance considerations we plan to add the possibility to delegate this job to the database in the future and will keep this in mind during the implementation.<\/em><\/p>\n<h2>Expressions<\/h2>\n<p>A series of expressions will need to be developed<br \/>\n<strong>Translation of a geometry<\/strong><\/p>\n<pre class=\"lang:default decode:true\">geometry translate( geometry, x, y )<\/pre>\n<p><strong>Extrusion of a 2D geometry<\/strong><\/p>\n<pre class=\"lang:default decode:true\">geometry extrude( geometry, x, y )<\/pre>\n<p><strong>Evaluation of a string as expression<\/strong><\/p>\n<pre class=\"lang:default decode:true\">expression eval( string )<\/pre>\n<p><strong>Degrees to radians<\/strong><\/p>\n<pre class=\"lang:default decode:true\">float radians( float )<\/pre>\n<p><strong>Extract the individual points of a linestring<\/strong><\/p>\n<pre class=\"lang:default decode:true\">point pointn( linestring, index )<\/pre>\n<p><strong>Azimuth of a line\u00a0segment<\/strong><\/p>\n<pre class=\"lang:default decode:true\">float azimuth( point1, point2 )<\/pre>\n<p><strong>Order a multipolygon by centroid (to render the walls of a building in the appropriate sequence)<\/strong><\/p>\n<pre class=\"lang:default decode:true\">multipolygon multipolygon_order_by_centroid( multipolygon )<\/pre>\n<h2>Style variables<\/h2>\n<p>To make it easy to configure the style a new possibility to assign style variables will be introduced. This will make it possible to specify an expression which will define the height of individual buildings one single time on the style dialog and then reference and use\u00a0this variable from various places within the rendering system.<\/p>\n<h2>Detailed specification<\/h2>\n<p>We have written a document that contains more detailed specifications for the individual parts. If you would like to get access to this, please contact us and we will send you a digital copy of it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" class=\"wp-image-1868 size-full\" src=\"https:\/\/www.opengis.ch\/wp-content\/uploads\/2015\/10\/title.png\" alt=\"2.5D rendering\" height='180'\/><\/p>\n","protected":false},"author":3,"featured_media":1868,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,31,5,15],"tags":[125],"class_list":["post-1867","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-3d","category-cpp","category-featured","category-qgis","tag-qgis-org"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":2235,"url":"https:\/\/www.opengis.ch\/de\/2017\/05\/02\/qgis-expressions-engine-performance-boost\/","url_meta":{"origin":1867,"position":0},"title":"QGIS Expressions Engine: Performance boost","author":"Matthias Kuhn","date":"2. Mai 2017","format":false,"excerpt":"Expressions in QGIS are more and more widely used for all kinds of purposes. For example the recently introduced geometry generators allow drawing awesome effects with modified feature geometries on the fly. The last days at the QGIS developer meeting 2017, I spent some time looking into and improving the\u2026","rel":"","context":"In &quot;Expressions&quot;","block_context":{"text":"Expressions","link":"https:\/\/www.opengis.ch\/de\/category\/programming\/expressions\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1985,"url":"https:\/\/www.opengis.ch\/de\/2015\/12\/10\/geometry-generator-symbology\/","url_meta":{"origin":1867,"position":1},"title":"Geometry generator symbology","author":"Matthias Kuhn","date":"10. Dezember 2015","format":false,"excerpt":"Say hello to geometry generators, a new way to use expression syntax to generate a geometry on the fly during the rendering process.","rel":"","context":"In &quot;Featured&quot;","block_context":{"text":"Featured","link":"https:\/\/www.opengis.ch\/de\/category\/featured\/"},"img":{"alt_text":"Configuration Dialog","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2015\/12\/Screenshot-from-2015-12-10-16-06-12-300x203.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":12905,"url":"https:\/\/www.opengis.ch\/2022\/06\/27\/swiss-qgis-user-group-meeting-berne-2022\/","url_meta":{"origin":1867,"position":2},"title":"Swiss QGIS user group Meeting Berne 2022","author":"Fabian Binder","date":"27. Juni 2022","format":false,"excerpt":"What a blast it was! The first QField user day in Bern with around 40 participants from Switzerland and neighbouring countries was packed with use case presentations and interesting discussions.","rel":"","context":"In &quot;Events&quot;","block_context":{"text":"Events","link":"https:\/\/www.opengis.ch\/de\/category\/events\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2022\/06\/P6153915-scaled.jpg?fit=1200%2C896&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2022\/06\/P6153915-scaled.jpg?fit=1200%2C896&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2022\/06\/P6153915-scaled.jpg?fit=1200%2C896&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2022\/06\/P6153915-scaled.jpg?fit=1200%2C896&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2022\/06\/P6153915-scaled.jpg?fit=1200%2C896&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":14623,"url":"https:\/\/www.opengis.ch\/de\/2024\/06\/25\/swiss-locator-plugin-3-0-is-here-with-exciting-features\/","url_meta":{"origin":1867,"position":3},"title":"QGIS Swiss Locator 3.0 brings elevation profiles and vector tiles","author":"Germ\u00e1n Carrillo","date":"25. Juni 2024","format":false,"excerpt":"Swiss Locator 3.0 for #QGIS is here! Access high-precision elevation profiles from Swisstopo's swissALTI3D data and integrate vector tiles easily. \ud83c\udf0d\ud83d\uddfa\ufe0f #SwissGIS #Swisstopo #SwissLocator","rel":"","context":"In &quot;3D&quot;","block_context":{"text":"3D","link":"https:\/\/www.opengis.ch\/de\/category\/3d\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2024\/06\/swiss_locator_profile.jpg?fit=1200%2C871&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":1726,"url":"https:\/\/www.opengis.ch\/de\/2015\/07\/29\/postgres-expression-compiler\/","url_meta":{"origin":1867,"position":4},"title":"Postgres Expression Compiler for QGIS","author":"Matthias Kuhn","date":"29. Juli 2015","format":false,"excerpt":"Performance This project is all about performance of QGIS with a postgres\/postgis database. A lot of people have QGIS connected to postgres\/postgis (if you don't: it's a great combination in the open source geo stack). Databases are really optimized for querying. They keep indexes of geometries to be able to\u2026","rel":"","context":"In &quot;Uncategorised&quot;","block_context":{"text":"Uncategorised","link":"https:\/\/www.opengis.ch\/de\/category\/uncategorised\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4737,"url":"https:\/\/www.opengis.ch\/de\/2019\/01\/08\/qfield-1-0-rc1\/","url_meta":{"origin":1867,"position":5},"title":"New Year&#8217;s present &#8211; QField 1.0 RC1","author":"Marco Bernasocchi","date":"8. Januar 2019","format":false,"excerpt":"It was a long and winding road but we are very excited to announce the General availability of QField 1.0 Release Candidate 1. We ask you to help us test as much as possible this Release Candidate so that we can iron out as many bugs as possible before the\u2026","rel":"","context":"In &quot;Android QGIS&quot;","block_context":{"text":"Android QGIS","link":"https:\/\/www.opengis.ch\/de\/category\/gis\/qfield\/android-qgis\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/01\/QField_RC.png?fit=1200%2C584&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/01\/QField_RC.png?fit=1200%2C584&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/01\/QField_RC.png?fit=1200%2C584&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/01\/QField_RC.png?fit=1200%2C584&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.opengis.ch\/wp-content\/uploads\/2019\/01\/QField_RC.png?fit=1200%2C584&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"jetpack_shortlink":"https:\/\/wp.me\/pbdBtI-u7","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts\/1867","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/comments?post=1867"}],"version-history":[{"count":1,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts\/1867\/revisions"}],"predecessor-version":[{"id":11150,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/posts\/1867\/revisions\/11150"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/media?parent=1867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/categories?post=1867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.opengis.ch\/de\/wp-json\/wp\/v2\/tags?post=1867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}