<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le Blog SQL Server d&#039;ElSüket &#187; Systèmes d&#039;information géographiques</title>
	<atom:link href="https://blog.developpez.com/elsuket/pcategory/systemes-dinformation-geographiques/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/elsuket</link>
	<description>Nicolas Souquet - Expert SQL Server</description>
	<lastBuildDate>Mon, 05 Apr 2021 07:32:41 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Convertir des coordonnées sexagésimales en degrés et en radians</title>
		<link>https://blog.developpez.com/elsuket/p8247/snippets/convertir_des_coordonnees</link>
		<comments>https://blog.developpez.com/elsuket/p8247/snippets/convertir_des_coordonnees#comments</comments>
		<pubDate>Tue, 27 Oct 2009 17:14:11 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Systèmes d&#039;information géographiques]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Souvent, les coordonnées géographiques sont exprimées en degrés, minutes, secondes. Mais nos systèmes sont bien plus à l&#8217;aise avec des nombres décimaux, et il est donc nécessaire de convertir des coordonnées sexagésimales en degrés ou bien en radians. Voici une &#8230; <a href="https://blog.developpez.com/elsuket/p8247/snippets/convertir_des_coordonnees">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Souvent, les coordonnées géographiques sont exprimées en degrés, minutes, secondes.<br />
Mais nos systèmes sont bien plus à l&rsquo;aise avec des nombres décimaux, et il est donc nécessaire de convertir des coordonnées sexagésimales en degrés ou bien en radians.<br />
Voici une petite fonction pour le faire &#8230;</p>
<p><span id="more-159"></span></p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">------------------------------- <br />
-- Nicolas SOUQUET - 28/10/2009 <br />
------------------------------- <br />
ALTER FUNCTION Fn_CoordonneesSexagesimalesToDegresRadians <br />
&nbsp; ( <br />
&nbsp; &nbsp; @degresLat TINYINT, <br />
&nbsp; &nbsp; @minutesLat TINYINT, <br />
&nbsp; &nbsp; @secondesLat TINYINT, <br />
&nbsp; &nbsp; -------------------- <br />
&nbsp; &nbsp; @degresLong TINYINT, <br />
&nbsp; &nbsp; @minutesLong TINYINT, <br />
&nbsp; &nbsp; @secondesLong TINYINT <br />
&nbsp; ) <br />
&nbsp; RETURNS TABLE <br />
AS <br />
RETURN <br />
( <br />
&nbsp; SELECT latitudeDeg, <br />
&nbsp; &nbsp; &nbsp; longitudeDeg, <br />
&nbsp; &nbsp; &nbsp; RADIANS(latitudeDeg) AS latitudeRad, <br />
&nbsp; &nbsp; &nbsp; RADIANS(longitudeDeg) AS longitudeRad <br />
&nbsp; FROM <br />
&nbsp; ( <br />
&nbsp; &nbsp; SELECT @degresLat + @minutesLat / 60.0 + @secondesLat / 3600.0 AS latitudeDeg, <br />
&nbsp; &nbsp; &nbsp; &nbsp; @degresLong + @minutesLong / 60.0 + @secondesLong / 3600.0 AS longitudeDeg <br />
&nbsp; ) AS TMP <br />
)</div></td></tr></tbody></table></div>
<p>ElSuket</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vérifier l&#8217;unicité d&#8217;une position avec le type GEOGRAPHY sous SQL Server 2008</title>
		<link>https://blog.developpez.com/elsuket/p8257/moteur-de-base-de-donnees-sql-server/indexation/verifier_l_unicite_d_une_position_avec_l_2008</link>
		<comments>https://blog.developpez.com/elsuket/p8257/moteur-de-base-de-donnees-sql-server/indexation/verifier_l_unicite_d_une_position_avec_l_2008#comments</comments>
		<pubDate>Thu, 29 Oct 2009 22:33:34 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Indexation]]></category>
		<category><![CDATA[Moteur de base de données SQL Server]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Systèmes d&#039;information géographiques]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[SQL Server 2008 a introduit de nombreux nouveaux types de données, dont le type de données géographiques GEOGRAPHY. Ce n&#8217;est pas un type habituel, puisque c&#8217;est un type CLR.NET intégré à SQL Server. L&#8217;avantage présenté par l&#8217;intégration de ce type &#8230; <a href="https://blog.developpez.com/elsuket/p8257/moteur-de-base-de-donnees-sql-server/indexation/verifier_l_unicite_d_une_position_avec_l_2008">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>SQL Server 2008 a introduit de nombreux nouveaux types de données, dont le type de données géographiques GEOGRAPHY.<br />
Ce n&rsquo;est pas un type habituel, puisque c&rsquo;est un type CLR.NET intégré à SQL Server.</p>
<p>L&rsquo;avantage présenté par l&rsquo;intégration de ce type est l&rsquo;ensemble des méthodes standard &laquo;&nbsp;livrées&nbsp;&raquo; avec ce type, qui permettent d&rsquo;extraire très simplement une latitude (attribut Lat), une longitude (attribut Long), ou encore de connaître la distance entre deux points géographiques avec la méthode <a href="http://msdn.microsoft.com/fr-fr/library/bb933808.aspx">STDistance</a>.</p>
<p>Mais il devient alors plus complexe de garantir l&rsquo;unicité de positions dans une table où l&rsquo;on stocke la celle de plusieurs villes.<br />
En effet, si une colonne de ce type est spécifiée comme clé d&rsquo;une contrainte d&rsquo;unicité, le moteur de base de données SQL Server lève une exception.</p>
<p>Est-il possible de contourner ce problème ?</p>
<p><span id="more-160"></span></p>
<p>Si nous tentons de créer la table suivante :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE dbo.TbCoordonneeVille <br />
( <br />
&nbsp; IDCoordonneeVille INT NOT NULL IDENTITY CONSTRAINT PK_TbCoordonneeVille PRIMARY KEY, <br />
&nbsp; nomVille VARCHAR(45) NOT NULL CONSTRAINT UQ_TbCoordonneeVille_nomVille UNIQUE, <br />
&nbsp; geoPositionVille GEOGRAPHY NOT NULL CONSTRAINT UQ_TbCoordonneeVille_geoPositionVille UNIQUE &nbsp;<br />
)</div></td></tr></tbody></table></div>
<p>Nous obtenons l&rsquo;erreur :</p>
<blockquote><p>Msg 1919, Niveau 16, État 1, Ligne 1<br />
La colonne &lsquo;geoPositionVille&rsquo; dans la table &lsquo;TbCoordonneeVille&rsquo; n&rsquo;est pas d&rsquo;un type valide lui permettant d&rsquo;être utilisée en tant que colonne clé dans un index.<br />
Msg 1750, Niveau 16, État 0, Ligne 1<br />
Impossible de créer la contrainte. Voir les erreurs précédentes.</p></blockquote>
<p>Nous sommes donc contraints de créer la table sans la contrainte d&rsquo;unicité sur la colonne geoPositionVille :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE dbo.TbCoordonneeVille <br />
( <br />
&nbsp; IDCoordonneeVille INT NOT NULL IDENTITY CONSTRAINT PK_TbCoordonneeVille PRIMARY KEY, <br />
&nbsp; nomVille VARCHAR(45) NOT NULL CONSTRAINT UQ_TbCoordonneeVille_nomVille UNIQUE, <br />
&nbsp; geoPositionVille GEOGRAPHY NOT NULL <br />
)</div></td></tr></tbody></table></div>
<p>Comment faire pour garantir l&rsquo;unicité des positions des villes sans perdre les avantages offerts par le type GEOGRAPHY ?<br />
Il est possible de créer une contrainte d&rsquo;unicité sur des colonnes calculées persistantes.</p>
<p>Ajoutons donc deux colonnes calculées, une pour la latitude, et une autre pour la longitude.<br />
Attention, la casse sur les méthodes CLR est importante.</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">------------------------------- <br />
-- Nicolas SOUQUET - 29/10/2009 <br />
------------------------------- <br />
ALTER TABLE dbo.TbCoordonneeVille <br />
ADD latitudeVille AS (geoPositionVille.Lat) PERSISTED NOT NULL, <br />
&nbsp; longitudeVille AS (geoPositionVille.Long) PERSISTED NOT NULL</div></td></tr></tbody></table></div>
<p>Il nous suffit ensuite de créer une contrainte d&rsquo;unicité sur ces deux colonnes :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">------------------------------- <br />
-- Nicolas SOUQUET - 29/10/2009 <br />
------------------------------- <br />
ALTER TABLE dbo.TbCoordonneeVille <br />
ADD CONSTRAINT UQ_TbCoordonneeVille_latitudeVille_longitudeVille <br />
&nbsp; UNIQUE (latitudeVille, longitudeVille)</div></td></tr></tbody></table></div>
<p>Essayons maintenant d&rsquo;insérer deux villes dont le nom est différent, mais dont les coordonnées sont identiques :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">INSERT INTO dbo.TbCoordonneeVille (nomVille, geoPositionVille) <br />
VALUES ('Toulouse', GEOGRAPHY::STPointFromText('POINT(43.604503 1.444026)', 4326)) <br />
GO <br />
&nbsp;<br />
INSERT INTO dbo.TbCoordonneeVille (nomVille, geoPositionVille) <br />
VALUES ('Lyon', GEOGRAPHY::STPointFromText('POINT(43.604503 1.444026)', 4326)) <br />
GO</div></td></tr></tbody></table></div>
<p>La première instruction se passe sans problèmes.<br />
En revanche la seconde échoue, et nous obtenons l&rsquo;erreur suivante :</p>
<blockquote><p>Msg 2627, Niveau 14, État 1, Ligne 1<br />
Violation de la contrainte UNIQUE KEY &lsquo;UQ_TbCoordonneeVille_latitudeVille_longitudeVille&rsquo;. Impossible d&rsquo;insérer une clé en double dans l&rsquo;objet &lsquo;dbo.TbCoordonneeVille&rsquo;.<br />
L&rsquo;instruction a été arrêtée.</p></blockquote>
<p>Vérifions le contenu de la table :</p>
<p><img src="http://blog.developpez.com/media/geographyUnique1.PNG" width="1079" height="363" alt="" /></p>
<p>Une solution alternative est de créer une vue indexée, ce qui présentera un bon avantage si la table est souvent lue.<br />
Supprimons la table puis recréons-la :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DROP TABLE dbo.TbCoordonneeVille <br />
GO <br />
&nbsp;<br />
CREATE TABLE dbo.TbCoordonneeVille <br />
( <br />
&nbsp; IDCoordonneeVille INT NOT NULL IDENTITY CONSTRAINT PK_TbCoordonneeVille PRIMARY KEY, <br />
&nbsp; nomVille VARCHAR(45) NOT NULL CONSTRAINT UQ_TbCoordonneeVille_nomVille UNIQUE, <br />
&nbsp; geoPositionVille GEOGRAPHY NOT NULL <br />
)</div></td></tr></tbody></table></div>
<p>Créons ensuite la vue :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">------------------------------- <br />
-- Nicolas SOUQUET - 29/10/2009 <br />
------------------------------- <br />
CREATE VIEW dbo.VwCoordonneeVille <br />
&nbsp; WITH SCHEMABINDING <br />
AS <br />
SELECT nomVille, <br />
&nbsp; &nbsp; geoPositionVille.Lat AS latitudeVille, <br />
&nbsp; &nbsp; geoPositionVille.Long AS longitudeVille <br />
FROM dbo.TbCoordonneeVille</div></td></tr></tbody></table></div>
<p>Puis indexons-la :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">------------------------------- <br />
-- Nicolas SOUQUET - 29/10/2009 <br />
------------------------------- <br />
CREATE UNIQUE CLUSTERED INDEX IXUQC_VwCoordonneeVille_latitudeVille_longitudeVille <br />
ON dbo.VwCoordonneeVille(latitudeVille, longitudeVille)</div></td></tr></tbody></table></div>
<p>Et tentons les mêmes insertions que celles que nous avons faites pour tester la contrainte d&rsquo;unicité sur les colonnes calculées persistantes :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">INSERT INTO dbo.TbCoordonneeVille (nomVille, geoPositionVille) <br />
VALUES ('Toulouse', GEOGRAPHY::STPointFromText('POINT(43.604503 1.444026)', 4326)) <br />
GO <br />
&nbsp;<br />
INSERT INTO dbo.TbCoordonneeVille (nomVille, geoPositionVille) <br />
VALUES ('Lyon', GEOGRAPHY::STPointFromText('POINT(43.604503 1.444026)', 4326)) <br />
GO</div></td></tr></tbody></table></div>
<p>Là encore, la première instruction se passe sans problème, mais la seconde échoue, provoquant l&rsquo;erreur suivante :</p>
<blockquote><p>Msg 2601, Niveau 14, État 1, Ligne 1<br />
Impossible d&rsquo;insérer une ligne de clé en double dans l&rsquo;objet &lsquo;dbo.VwCoordonneeVille&rsquo; avec un index unique &lsquo;IXUQC_VwCoordonneeVille_latitudeVille_longitudeVille&rsquo;.<br />
L&rsquo;instruction a été arrêtée.</p></blockquote>
<p>Interrogeons néanmoins la vue :</p>
<p><img src="http://blog.developpez.com/media/geographyUnique2.PNG" width="770" height="348" alt="" /></p>
<p>ElSuket</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtenir une représentation sexagésimale d&#8217;une coordonnée géographique en degrés</title>
		<link>https://blog.developpez.com/elsuket/p8378/snippets/obtenir_une_representation_sexagesimale</link>
		<comments>https://blog.developpez.com/elsuket/p8378/snippets/obtenir_une_representation_sexagesimale#comments</comments>
		<pubDate>Thu, 19 Nov 2009 18:19:49 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Systèmes d&#039;information géographiques]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Faisant suite à ce billet, voici une petite fonction pour représenter sexagésimalement une coordonnée géographique exprimée en degrés : 12345678910111213141516171819202122232425262728------------------------------- -- Nicolas SOUQUET - 19/11/2009 ------------------------------- ALTER FUNCTION Fn_SIG_CoordonneesDegresToSexagesimales &#160; (@_degresDecimaux FLOAT) &#160; RETURNS VARCHAR(16) &#160; WITH SCHEMABINDING AS BEGIN &#8230; <a href="https://blog.developpez.com/elsuket/p8378/snippets/obtenir_une_representation_sexagesimale">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Faisant suite à <a href="http://blog.developpez.com/elsuket/p8247/t-sql/convertir-des-coordonnees/">ce billet</a>, voici une petite fonction pour représenter sexagésimalement une coordonnée géographique exprimée en degrés :<br />
<span id="more-161"></span></p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">------------------------------- <br />
-- Nicolas SOUQUET - 19/11/2009 <br />
------------------------------- <br />
ALTER FUNCTION Fn_SIG_CoordonneesDegresToSexagesimales <br />
&nbsp; (@_degresDecimaux FLOAT) <br />
&nbsp; RETURNS VARCHAR(16) <br />
&nbsp; WITH SCHEMABINDING <br />
AS <br />
BEGIN <br />
&nbsp; -- Extraction des degrés <br />
&nbsp; DECLARE @nDegresSexagesimaux TINYINT <br />
&nbsp; SELECT @nDegresSexagesimaux = CAST(@_degresDecimaux AS TINYINT) <br />
&nbsp;<br />
&nbsp; -- Extraction des minutes <br />
&nbsp; DECLARE @fMinutesSexagesimaux FLOAT <br />
&nbsp; SELECT @fMinutesSexagesimaux = (@_degresDecimaux - @nDegresSexagesimaux) * 60 <br />
&nbsp; DECLARE @nMinutesSexagesimaux TINYINT <br />
&nbsp; SELECT @nMinutesSexagesimaux = CAST(@fMinutesSexagesimaux AS TINYINT) <br />
&nbsp;<br />
&nbsp; -- Extraction des secondes <br />
&nbsp; DECLARE @fSecondesSexagesimaux FLOAT <br />
&nbsp; SELECT @fSecondesSexagesimaux = (@fMinutesSexagesimaux - @nMinutesSexagesimaux) * 60 <br />
&nbsp;<br />
&nbsp; -- Resultat <br />
&nbsp; RETURN CAST(@nDegresSexagesimaux AS VARCHAR(2)) + '° ' + <br />
&nbsp; &nbsp; &nbsp; CAST(@nMinutesSexagesimaux AS VARCHAR(2)) + '&amp;#8242; ' + <br />
&nbsp; &nbsp; &nbsp; CAST(@fSecondesSexagesimaux AS VARCHAR(14)) + '&quot;' <br />
END</div></td></tr></tbody></table></div>
<p>Ainsi l&rsquo;exécution de :</p>
<p><code class="codecolorer text default"><span class="text">SELECT dbo.Fn_SIG_CoordonneesDegresToSexagesimales (47.51027)</span></code></p>
<p>Nous retourne 47° 30&prime; 36.972&Prime; <img src="https://blog.developpez.com/elsuket/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>ElSuket</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vérifier qu&#8217;un point est contenu dans un polygone de type GEOGRAPHY</title>
		<link>https://blog.developpez.com/elsuket/p8448/systemes-dinformation-geographiques/verifier_point_dans_polygone_geography</link>
		<comments>https://blog.developpez.com/elsuket/p8448/systemes-dinformation-geographiques/verifier_point_dans_polygone_geography#comments</comments>
		<pubDate>Thu, 10 Dec 2009 14:29:56 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Systèmes d&#039;information géographiques]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici comment vérifier qu&#8217;un point de type GEOGRAPHY, c&#8217;est à dire une position définie par sa latitude et sa longitude, appartient à la surface définie par un polygone, toujours sous le type GEOGRAPHY Comme je suis toulousain, j&#8217;ai pris pour &#8230; <a href="https://blog.developpez.com/elsuket/p8448/systemes-dinformation-geographiques/verifier_point_dans_polygone_geography">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Voici comment vérifier qu&rsquo;un point de type GEOGRAPHY, c&rsquo;est à dire une position définie par sa latitude et sa longitude, appartient à la surface définie par un polygone, toujours sous le type GEOGRAPHY<br />
<span id="more-162"></span><br />
Comme je suis toulousain, j&rsquo;ai pris pour exemple des coordonnées de positions aux 4 coins de la Place du Capitole pour définir le polygone que voici :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @gPlaceCapitole GEOGRAPHY <br />
&nbsp;<br />
SET @gPlaceCapitole = GEOGRAPHY::STGeomFromText <br />
&nbsp; &nbsp; ( <br />
&nbsp; &nbsp; &nbsp; 'POLYGON <br />
&nbsp; &nbsp; &nbsp; ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; (43.604832 1.442787,43.60492 1.443754,43.603922 1.443987,43.603823 1.443028,43.604832 1.442787) <br />
&nbsp; &nbsp; &nbsp; )', <br />
&nbsp; &nbsp; &nbsp; 4326 <br />
&nbsp; &nbsp; );</div></td></tr></tbody></table></div>
<p>Il est nécessaire que :</p>
<p>&#8211; le premier point soit la même que la dernier point pour qu&rsquo;on dispose effectivement d&rsquo;un polygone,<br />
&#8211; les points soient ordonnés dans le sens inverse des aiguilles d&rsquo;une montre,<br />
&#8211; les coordonnées soit données suivant un couple {latitude, longitude}</p>
<p>Prenons maintenant un point sur la Croix du Languedoc qui se situe sur la Place du Capitole, et un point dans l&rsquo;Hôtel de Ville, qui jouxte la Place du Capitole :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @pCroixLanguedoc GEOGRAPHY <br />
SET @pCroixLanguedoc = GEOGRAPHY::Point(1.443304, 43.604386, 4326) <br />
&nbsp;<br />
DECLARE @pHotelDeVille GEOGRAPHY <br />
SET @pHotelDeVille = GEOGRAPHY::Point(43.604526,1.444323, 4326)</div></td></tr></tbody></table></div>
<p>Ici, il est nécessaire les coordonnées soient données suivant un couple {longitude, latitude}.<br />
Faites-y attention, on se fait <a href="http://www.developpez.net/forums/d841230/bases-donnees/ms-sql-server/sql2k8-gis-verifier-quun-point-polygone-geographique/">facilement avoir</a> <img src="https://blog.developpez.com/elsuket/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></p>
<p>Vérifions maintenant que la Croix du Languedoc est bien sur la Place du Capitole :</p>
<p><code class="codecolorer text default"><span class="text">SELECT @g.STIntersects(@pCroixLanguedoc )</span></code></p>
<p>L&rsquo;exécution de ce code nous retourne un BIT ayant pour valeur 1.</p>
<p>Qu&rsquo;en est-il de l&rsquo;Hôtel de Ville ?</p>
<p><code class="codecolorer text default"><span class="text">SELECT @g.STIntersects(@pHotelDeVille)</span></code></p>
<p>Ici nous obtenons 0.</p>
<p>Bons SIGs !</p>
<p>ElSuket.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
