﻿{"id":3930,"date":"2017-03-31T12:42:47","date_gmt":"2017-03-31T11:42:47","guid":{"rendered":"http:\/\/www.sigterritoires.fr\/?p=3930"},"modified":"2017-03-31T12:42:47","modified_gmt":"2017-03-31T11:42:47","slug":"lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale","status":"publish","type":"post","link":"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/","title":{"rendered":"L\u2019analyse spatiale avec SQL:3-les fonctions de relation spatiale"},"content":{"rendered":"<p>Apr\u00e8s les deux article introductifs,L\u2019analyse spatiale avec SQL:<a href=\"http:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql1-introduction\/\">1-Introduction<\/a>, <a href=\"http:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql2-les-fausses-idees-recues\/\">2-les fausses id\u00e9es re\u00e7ues<\/a>, voici, maintenant, la dizaine de fonctions de relation spatiale de <a href=\"https:\/\/www.sigterritoires.fr\/index.php\/debuter-avec-postgrespostgis\/\">Postgis<\/a> (mais que vous trouverez aussi avec Spatialite). Comme dit pr\u00e9c\u00e9demment, ce n&rsquo;est qu&rsquo;une toute petite partie des fonctions disponibles, mais c&rsquo;est vraiment le noyau indispensable pour d\u00e9marre l&rsquo;analyse spatiale avec SQL.<!--more--><\/p>\n<h2>Les types ou dimensions des g\u00e9om\u00e9tries<\/h2>\n<p>Avant de voir les diff\u00e9rentes fonctions il faut rappeler sur quoi nous allons travailler. Les diff\u00e9rentes fonctions ont comme param\u00e8tres\u00a0 deux g\u00e9om\u00e9tries. Mais les g\u00e9om\u00e9tries ne sont pas toutes de m\u00eame type (on parle aussi de dimensions): nous avons trois types majeurs (point, ligne, surface) et trois type d\u00e9riv\u00e9s (multipoints, multilignes, multisurfaces). La distinction est importante car les fonctions fonctionnent sur la d\u00e9termination, pour chaque entit\u00e9 (g\u00e9om\u00e9trie) de ce que l&rsquo;on consid\u00e8re l&rsquo;int\u00e9rieur de l&rsquo;entit\u00e9 et de ce que l&rsquo;on consid\u00e8re l&rsquo;ext\u00e9rieur. Pour une couche de polygones vous voyez tout de suite de quoi on parle et vous n&rsquo;aurez aucun mal \u00e0 distinguer l&rsquo;int\u00e9rieur\u00a0 des polygones de leur ext\u00e9rieur.<\/p>\n<p>Pour les points, \u00e7a commence \u00e0 se corser car l&rsquo;int\u00e9rieur d&rsquo;un point est un peu plus difficile \u00e0 concevoir. Et \u00e7a devient presque m\u00e9taphysique quand on parle de l&rsquo;int\u00e9rieur d&rsquo;une entit\u00e9 multipoint.<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d1a.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3946\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__d1a\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d1a.png?fit=389%2C350&amp;ssl=1\" data-orig-size=\"389,350\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__d1a\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d1a.png?fit=389%2C350&amp;ssl=1\" class=\"aligncenter size-full wp-image-3946\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d1a.png?resize=389%2C350\" alt=\"\" width=\"389\" height=\"350\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d1a.png?w=389&amp;ssl=1 389w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d1a.png?resize=300%2C270&amp;ssl=1 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/a> Cette image peut repr\u00e9senter trois entit\u00e9s ponctuelles, dans le cas d&rsquo;une couche de points, ou bien une seule entit\u00e9 constitu\u00e9e par trois points, dans le cas d&rsquo;une couche multipoints. Mais dans les deux cas, l&rsquo;int\u00e9rieur est constitu\u00e9 par le ou les points seulement.<\/p>\n<p>Par exemple, dans la figure suivante, est-ce que la ligne traverse la g\u00e9om\u00e9trie de la couche multipoint?<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d2a.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3947\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__d2a\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d2a.png?fit=388%2C352&amp;ssl=1\" data-orig-size=\"388,352\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__d2a\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d2a.png?fit=388%2C352&amp;ssl=1\" class=\"aligncenter size-full wp-image-3947\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d2a.png?resize=388%2C352\" alt=\"\" width=\"388\" height=\"352\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d2a.png?w=388&amp;ssl=1 388w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d2a.png?resize=300%2C272&amp;ssl=1 300w\" sizes=\"auto, (max-width: 388px) 100vw, 388px\" \/><\/a>La r\u00e9ponse est NON. Pour traverse une g\u00e9om\u00e9trie, il faut qu&rsquo;il y ait une partie commune \u00ab\u00a0interne\u00a0\u00bb aux deux g\u00e9om\u00e9tries.<\/p>\n<p>Dans la figure suivante, par contre, la r\u00e9ponse est OUI, la ligne traverse l&rsquo;entit\u00e9 multipoint.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d3a.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3948\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__d3a\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d3a.png?fit=389%2C355&amp;ssl=1\" data-orig-size=\"389,355\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__d3a\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d3a.png?fit=389%2C355&amp;ssl=1\" class=\"aligncenter size-full wp-image-3948\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d3a.png?resize=389%2C355\" alt=\"\" width=\"389\" height=\"355\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d3a.png?w=389&amp;ssl=1 389w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/d3a.png?resize=300%2C274&amp;ssl=1 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/a>Vous aurez compris que l&rsquo;int\u00e9rieur d&rsquo;une ligne est la ligne elle-m\u00eame, comme pour les points.<\/p>\n<p>On peut s\u00e9parer les fonctions de relation spatiale en deux grands groupes: celles qui s&rsquo;appliquent \u00e0 tous les types de g\u00e9om\u00e9trie et ceux qui ne s&rsquo;appliquent qu&rsquo;\u00e0 certains types.<\/p>\n<p>Pour une description d\u00e9taill\u00e9e des fonctions, reportez vous \u00e0 la documentation Postgis: <a href=\"https:\/\/postgis.net\/docs\/manual-1.5\/reference.html#Spatial_Relationships_Measurements\">https:\/\/postgis.net\/docs\/manual-1.5\/reference.html#Spatial_Relationships_Measurements<\/a><\/p>\n<h2>Les fonctions applicables \u00e0 tous les types de g\u00e9om\u00e9trie<\/h2>\n<p>Les fonction d&rsquo;intersection, de diff\u00e9rence,\u00a0 de contenance ou de contenu et la fonction toucher acceptent dans les deux param\u00e8tres de la fonction n&rsquo;importe quel type de g\u00e9om\u00e9trie de base ou multiple. On peut donc calculer l&rsquo;intersection d&rsquo;une couche multipoint avec un couche polyligne, de polygones et de multipolygones, etc.<\/p>\n<h3>st_Intersect<\/h3>\n<p>C&rsquo;est la fonction la plus g\u00e9n\u00e9rique. Elle renvoie VRAI si l&rsquo;int\u00e9rieur d&rsquo;une g\u00e9om\u00e9trie occupe la m\u00eame place qu&rsquo;un autre point int\u00e9rieur de la deuxi\u00e8me g\u00e9om\u00e9trie, en d&rsquo;autres termes si elles ont au moins un point de l&rsquo;espace en commun. Si les autres fonctions telles que st_Crosses, st_Overlaps, st_touches, st_Within ou st_Contains retournent une valeur VRAI sur des g\u00e9om\u00e9tries, st_Intersect retournera aussi une valeur VRAI.<\/p>\n<p>L&rsquo;exemple suivant montre le r\u00e9sultat de la requ\u00eate permettant de trouver les parcelles qui sont affect\u00e9es par une zone inondable de risque maximal:<\/p>\n<p>SELECT parcelles.*<br \/>\nFROM parcelles,carto_risque<br \/>\nWHERE ST_Intersects(parcelles.geometry,carto_risque.geometry)<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3953\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__e2\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png?fit=1013%2C841&amp;ssl=1\" data-orig-size=\"1013,841\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__e2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png?fit=640%2C531&amp;ssl=1\" class=\"aligncenter size-full wp-image-3953\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png?resize=640%2C531\" alt=\"\" width=\"640\" height=\"531\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png?w=1013&amp;ssl=1 1013w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png?resize=300%2C249&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e2.png?resize=768%2C638&amp;ssl=1 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a>Toute parcelle qui partage ne serait-ce qu&rsquo;un point dans l&rsquo;espace avec la zone inondable est s\u00e9lectionn\u00e9e.<\/p>\n<h3>st_Disjoint<\/h3>\n<p>Est la fonction inverse de st_intersect. Elle renvoie VRAI si l&rsquo;int\u00e9rieur d&rsquo;une g\u00e9om\u00e9trie n&rsquo;occupe pas la m\u00eame place qu&rsquo;un autre point int\u00e9rieur de la deuxi\u00e8me g\u00e9om\u00e9trie, en d&rsquo;autres termes si elles n&rsquo;ont aucun point de l&rsquo;espace en commun.<\/p>\n<p>On obtient le m\u00eame r\u00e9sultat qu&rsquo;avec la commande st_intersects avec la requ\u00eate:<br \/>\nSELECT parcelles.*<br \/>\nFROM parcelles,carto_risque<br \/>\nWHERE ST_Disjoint(parcelles.geometry,carto_risque.geometry)=false<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<p>C&rsquo;est un peu tir\u00e9 par les cheveux de faire une requ\u00eate invers\u00e9e, mais si vous cherchez vraiment les g\u00e9om\u00e9tries disjointes, il vaut mieux utiliser st_Intersects =false, car une requ\u00eate utilisant st_intersect s&rsquo;effectue avec les index spatiaux tandis que st_disjoint se fait en parcourant s\u00e9quentiellement toutes les entit\u00e9s. les temps de r\u00e9ponse seront nettement diff\u00e9rents!<\/p>\n<h3>st_Contains et st_Within<\/h3>\n<p>Ces deux fonctions testent si une g\u00e9om\u00e9trie est totalement \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une autre. st_Within(geomA,geomB) retourne VRAI si la premi\u00e8re g\u00e9om\u00e9trie (geomA) est compl\u00e8tement contenue dans l&rsquo;autre (geomB).<\/p>\n<p>st_Contains(geomA,geomB) retourne VRAI si la deuxi\u00e8me g\u00e9om\u00e9trie (geomB) est compl\u00e8tement contenue dans la premi\u00e8re (geomA).<\/p>\n<p>L&rsquo;exemple suivant montre le r\u00e9sultat de la requ\u00eate permettant de trouver les parcelles totalement incluses dans une zone inondable de risque maximal:<\/p>\n<p>SELECT parcelles.*<br \/>\nFROM parcelles, carto_risque<br \/>\nWHERE ST_Within(parcelles.geometry, carto_risque.geometry)<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3952\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__e1\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png?fit=1135%2C837&amp;ssl=1\" data-orig-size=\"1135,837\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__e1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png?fit=640%2C472&amp;ssl=1\" class=\"aligncenter size-large wp-image-3952\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1-1024x755.png?resize=640%2C472\" alt=\"resultat de st_within\" width=\"640\" height=\"472\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png?resize=1024%2C755&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png?resize=300%2C221&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png?resize=768%2C566&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e1.png?w=1135&amp;ssl=1 1135w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a>Seules les parcelles dont tous les points sont \u00e0 l&rsquo;int\u00e9rieur de la zone inondable sont s\u00e9lectionn\u00e9es.<\/p>\n<p>On obtient exactement le m\u00eame r\u00e9sultat avec la requ\u00eate<\/p>\n<p>SELECT parcelles.*<br \/>\nFROM parcelles, carto_risque<br \/>\nWHERE ST_Contains(carto_risque.geometry, parcelles.geometry)<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<h3>st_Touches<\/h3>\n<p>Nous avons vu un exemple de cette fonction dans l&rsquo;article pr\u00e9c\u00e9dent. Cette fonction retourne VRAI si les deux g\u00e9om\u00e9tries ont au moins un point en commun mais que leurs int\u00e9rieurs ne s&rsquo;intersectent pas. En d&rsquo;autres termes seuls les contours ont un ou plusieurs points en commun.<\/p>\n<h2>Les fonctions applicables selon le type de g\u00e9om\u00e9trie<\/h2>\n<h3>st_Equals<\/h3>\n<p>St_Equals ne fonctionne que sur des g\u00e9om\u00e9tries de m\u00eame type. Il renvoie VRAI si les deux g\u00e9om\u00e9tries partagent tous les points de l&rsquo;espace, c&rsquo;est \u00e0 dire si toutes les coordonn\u00e9es XY de la premi\u00e8re g\u00e9om\u00e9trie sont identiques aux coordonn\u00e9es de la deuxi\u00e8me. L&rsquo;ordre des entit\u00e9s dans la couche n&rsquo;intervient pas du tout dans la comparaison.<\/p>\n<h3>st_Crosses<\/h3>\n<p>St_Crosses ne s&rsquo;applique pas \u00e0 toutes les combinaisons de g\u00e9om\u00e9tries. Elle s&rsquo;applique aux combinaisons suivantes:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e3-1.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3955\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__e3-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e3-1.png?fit=413%2C253&amp;ssl=1\" data-orig-size=\"413,253\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__e3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e3-1.png?fit=413%2C253&amp;ssl=1\" class=\"aligncenter size-full wp-image-3955\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e3-1.png?resize=413%2C253\" alt=\"\" width=\"413\" height=\"253\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e3-1.png?w=413&amp;ssl=1 413w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e3-1.png?resize=300%2C184&amp;ssl=1 300w\" sizes=\"auto, (max-width: 413px) 100vw, 413px\" \/><\/a>Les couches de points sont exclues. La fonction retourne VRAI si le r\u00e9sultat de l&rsquo;intersection se retrouve \u00e0 l&rsquo;int\u00e9rieur des deux g\u00e9om\u00e9tries<\/p>\n<p>Si on reprend notre exemple pr\u00e9c\u00e9dent, la figure suivante montre le r\u00e9sultat de la requ\u00eate permettant de trouver les parcelles qui sont partiellement affect\u00e9es par une zone inondable de risque maximal:<\/p>\n<p>SELECT parcelles.*<br \/>\nFROM parcelles,carto_risque<br \/>\nWHERE ST_Overlaps(parcelles.geometry,carto_risque.geometry)<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3956\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__e4\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png?fit=969%2C793&amp;ssl=1\" data-orig-size=\"969,793\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__e4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png?fit=640%2C524&amp;ssl=1\" class=\"aligncenter size-full wp-image-3956\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png?resize=640%2C524\" alt=\"\" width=\"640\" height=\"524\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png?w=969&amp;ssl=1 969w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png?resize=300%2C246&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e4.png?resize=768%2C629&amp;ssl=1 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a>Seules les parcelles qui ont des points \u00e0 l&rsquo;int\u00e9rieur ET \u00e0 l&rsquo;ext\u00e9rieur de la zone inondable sont s\u00e9lectionn\u00e9es.<\/p>\n<h3>St_Distance<\/h3>\n<p>Contrairement aux autres fonctions, cette fonction ne renvoie pas VRAI ou FAUX mais la valeur de la plus petite distance calcul\u00e9e entre les deux g\u00e9om\u00e9tries.<\/p>\n<p>Si une partie (ou toute) de la g\u00e9om\u00e9trie de A se retrouve \u00e0 l&rsquo;int\u00e9rieur de la g\u00e9om\u00e9trie B, la distance calcul\u00e9e sera 0.<\/p>\n<p>L&rsquo;exemple suivant montre le r\u00e9sultat de la requ\u00eate permettant de trouver les parcelles situ\u00e9es \u00e0 moins de 200 m\u00e8tres d&rsquo;une zone inondable de risque maximal:<\/p>\n<p>SELECT parcelles.*<br \/>\nFROM parcelles,carto_risque<br \/>\nWHERE ST_Distance(parcelles.geometry,carto_risque.geometry) &lt; 200<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3958\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/lanalyse-spatiale-avec-sql3-les-fonctions-de-relation-spatiale\/__e5-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png?fit=848%2C729&amp;ssl=1\" data-orig-size=\"848,729\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"__e5\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png?fit=640%2C550&amp;ssl=1\" class=\"aligncenter size-full wp-image-3958\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png?resize=640%2C550\" alt=\"\" width=\"640\" height=\"550\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png?w=848&amp;ssl=1 848w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png?resize=300%2C258&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2017\/03\/e5-1.png?resize=768%2C660&amp;ssl=1 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a>Mais cette fonction est surtout utilis\u00e9e pour calculer les distances entre g\u00e9om\u00e9tries, car elle n&rsquo;utilise pas les index spatiaux et fait un traitement s\u00e9quentiel qui prend beaucoup plus de temps. Pour obtenir le m\u00eame r\u00e9sultat que dans cette figure on utilise la fonction St_DWithin.<\/p>\n<h3>st_DWithin<\/h3>\n<p>La fonction prend la forme St_DWithin( geomA, geomB, Distance). Elle renvoie la valeur VRAI si la plus petite distance entre geomA et geomB est inf\u00e9rieure ou \u00e9gale \u00e0 Distance.<\/p>\n<p>Pour l&rsquo;exemple pr\u00e9c\u00e9dent la requ\u00eate prend la forme:<\/p>\n<p>SELECT parcelles.*<br \/>\nFROM parcelles,carto_risque<br \/>\nWHERE ST_Distance(parcelles.geometry,carto_risque.geometry,200)<br \/>\nAND carto_risque.zone = &lsquo;max&rsquo;<\/p>\n<p>Et on obtient le m\u00eame r\u00e9sultat cartographique.<\/p>\n<p>Cette fonction est tr\u00e8s utile pour r\u00e9pondre \u00e0 une question telle que \u00ab\u00a0Combien de parcelles se situent dans un buffer de 200 m\u00e8tres autour de ce cours d&rsquo;eau? ou de cette route?\u00a0\u00bb, sans avoir \u00e0 calculer le buffer. On teste tout simplement la distance entre les g\u00e9om\u00e9tries.<\/p>\n<h3>st_Covers et st_CoveredBy<\/h3>\n<p>J&rsquo;ai laiss\u00e9 pour la fin ces deux fonctions qui sont presque \u00e9quivalentes \u00e0 st_Contains et st_Within. Le r\u00e9sultat sera presque toujours le m\u00eame sauf dans certains cas tr\u00e8s particuliers. C&rsquo;est un peu tordu, mais il faut revenir \u00e0 la notion de d\u00e9but de cet article, celle d&rsquo;int\u00e9rieur et ext\u00e9rieur d&rsquo;une g\u00e9om\u00e9trie.<\/p>\n<p>Quand nous avons un polygone, l&rsquo;int\u00e9rieur c&rsquo;est l&rsquo;espace contenu par les bords du polygone. Mais cette ligne imaginaire qui fait office de contour ne fait pas partie de l&rsquo;int\u00e9rieur, ni de l&rsquo;ext\u00e9rieur non plus. C&rsquo;est une limite.<\/p>\n<p>Quand nous avons une ligne, m\u00eame si elle n&rsquo;a pas de dimension \u00ab\u00a0\u00e9paisseur\u00a0\u00bb on consid\u00e8re que la ligne est la zone \u00ab\u00a0int\u00e9rieure\u00a0\u00bb de la g\u00e9om\u00e9trie.<\/p>\n<p>Si nous avons par exemple une limite administrative de d\u00e9partement, et cette limite correspond \u00e0 une route qui est contenue dans une couche de polylignes, la fonction st_contains(polygone,ligne) va retourner FAUX car la zone int\u00e9rieure de la ligne ne sera pas \u00e0 l&rsquo;int\u00e9rieur du polygone (elle sera sur le contour).<\/p>\n<p>La fonction st_Covers agit diff\u00e9remment. Elle trouvera que la limite du polygone \u00ab\u00a0recouvre\u00a0\u00bb le tron\u00e7on de route. La fonction st_CoveredBy cherche \u00e0 savoir si la g\u00e9om\u00e9trie A et recouverte par la g\u00e9om\u00e9trie B et fonctionne de la m\u00eame mani\u00e8re que st_Covers.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apr\u00e8s les deux article introductifs,L\u2019analyse spatiale avec SQL:1-Introduction, 2-les fausses id\u00e9es re\u00e7ues, voici, maintenant, la dizaine de fonctions de relation spatiale de Postgis (mais que vous trouverez aussi avec Spatialite). Comme dit pr\u00e9c\u00e9demment, ce n&rsquo;est qu&rsquo;une&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"give_campaign_id":0,"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"sfsi_plus_gutenberg_text_before_share":"","sfsi_plus_gutenberg_show_text_before_share":"","sfsi_plus_gutenberg_icon_type":"","sfsi_plus_gutenberg_icon_alignemt":"","sfsi_plus_gutenburg_max_per_row":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"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":[311,172],"tags":[377,378,227,312,58],"class_list":["post-3930","post","type-post","status-publish","format-standard","hentry","category-postgresql","category-tutoriel","tag-analyse-spatiale","tag-fonctions","tag-postgis","tag-postgresql","tag-qgis"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p6XU0A-11o","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts\/3930","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/comments?post=3930"}],"version-history":[{"count":0,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts\/3930\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/media?parent=3930"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/categories?post=3930"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/tags?post=3930"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}