Suite

Comment convertir un BLOB de géométrie SQL Server en autre chose ?


J'ai un fichier de données CSV d'un tiers qui est une table SQL Server exportée. Ils ont simplement fait unsélectionnez * à partir de fooet afficher le résultat dans un fichier texte et l'envoyer.

Dans leur table se trouve une colonne de type Geometry, donc dans mon texte brut, j'ai quelque chose comme "0xE610000010C47… ", etc. Pour le moment, je l'ai chargé dans une table dans SQL Server en tant que nvarchar.

Je pensais pouvoir revenir en arrière dans un champ Géométrie de mon côté, mais cela ne semble pas si facile.STGeomDeWKBne fonctionne pas car ce n'est pas réellement un WKB. Je ne peux pas convertir la chaîne en géométrie car elle se plaint que ce n'est pas un WKT.

Alors, y a-t-il un moyen d'obtenir cette valeur dans SQL Server comme s'il s'agissait d'un BLOB de géométrie normal ? Puis-je dire à SQL Server de le traiter comme tel ?

J'ai trouvé ce lien qui m'a au moins aidé à répondre à ma question sur ce qu'il y a dans SQL Server, mais qui ne m'a pas conduit jusqu'au bout : quel est le format du type de données Geometry de SQLServer 2008


Lorsque vous importez les données dans SQL Server, placez-les dans une colonne VARBINARY(MAX). Vous devriez alors être en mesure de METTRE en CAST une géométrie ou une géographie selon les besoins. Vous devrez faire attention à ce que la chaîne 0xE6… ne soit pas modifiée lors de l'import.

Une autre option consiste à effectuer une requête dynamique pour obtenir la sélection. Je mets quelques exemples de conversion ci-dessous.

- Comme varchar et DECLARE binaire @NV AS NVARCHAR (MAX) = '0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003' DECLARE @NB AS VARBINARY (MAX) = 0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A2 0FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003 -- Échec des conversions SELECT CAST(@NV AS Geometry) SELECT CAST(CAST(@NVAST AS VARBAST AS VARB ASINARYSELECT(MAX) Geometry) NV + 'AS Géométrie)')

En s'appuyant sur la réponse de @MickyT, puisque vous allez avoir une table avec vos valeurs déjà présentes dans WKB (ou quel que soit le nom que nous l'appelons), vous voudriez écrire sql qui convertira tous les enregistrements en géométrie, plutôt que d'avoir à déclarer une variable, etc. etc.

Donc, si vous commencez avec une simple table temporaire qui répliquerait le WKB dans un enregistrement, cela ressemblerait à ceci :

sélectionnez 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 comme wkb

Maintenant, si vous traitez cela comme une table temporaire et que vous l'entourez de SQL, vous avez une colonne avec le WKB et vous pouvez la convertir en varbinary comme suggéré ci-dessus :

sélectionnez cast(temp.wkb as varbinary(max)) as geombinary from ( select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb ) as temp

temp.wkb peut être la colonne de votre plus grand tableau contenant les valeurs WKB du CSV

Enfin, utilisez la méthode décrite par MickyT et convertissez le varbinary en géométrie :

select cast(geomconvert.geombinary as geometry) as geom from ( select cast(temp.wkb as varbinary(max)) as geombinary from ( select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb ) as temp ) as geomconvert

Ce qui renvoie une géométrie et un résultat spatial :

ÉDITER où le SRID est-il déclaré ? Comme MickyT l'a répondu, c'est dans le binaire, et vous pouvez y encapsuler 1 requête SQL supplémentaire pour tester :

sélectionnez le top 1 getsrid.geom.STSrid de ( sélectionnez cast(geomconvert.geombinary as geometry) as geom from ( select cast(temp.wkb as varbinary(max)) as geombinary from ( select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb ) asconvert ) as geom comme se débarrasse

ce qui donne, et est correct dans mon exemple, 2877 (avion de l'état du Colorado):


Affiche originale ici, lorsque j'ai essayé de terminer l'inscription, elle n'a pas lié la connexion à la publication d'origine. En tous cas…

Merci pour votre aide! Je voterai pour chaque réponse une fois que je pourrai et peut-être que si je peux comprendre comment lier ce compte et celui d'origine, je pourrai marquer une réponse. De plus, après vos indications, je ne peux pas croire que j'ai manqué d'utiliserCONVERTIRà la place deJETER. Cela le rend beaucoup plus facile.

Je pense que mon principal problème était d'obtenir la "chaîne" binaire brute en quelque chose que je pouvais utiliser. Voici un exemple de la façon dont je l'ai résolu :

DECLARE @data TABLE ( ID nvarchar (1024), ImportedGeometry nvarchar (max), FinalGeometry geometry ) INSERT INTO @data (ID, ImportedGeometry) valeurs ('1', '0xE6100000010C4703780B24B855C061C3D32B65093540') INSERT INTO (valeurs @Geometry (ID, Imported) '2', '0xE6100000010C96438B6CE7D359C0BD5296218E853440') sélectionnez d.ID, d.ImportedGeometry, CONVERT(varbinary(max), d.ImportedGeometry, 1) comme ConvertedGeometryBin, (cast(CONVERT(varbinary(max), d.ImportedGeometry), 1) géométrie)) comme FinalGeometry de @data d UPDATE @data SET FinalGeometry = (cast(CONVERT(varbinary(max), ImportedGeometry, 1) as geometry)) sélectionnez d.ID, d.FinalGeometry, d.FinalGeometry.STAsText(), d.FinalGeometry.STSrid de @data d