Suite

Changer les données au format binaire ArcSDE en types de données MSSQL Géographie ou Géométrie ?


Nous utilisons actuellement ArcSDE 9.3 pour stocker nos géodonnées. Dans un projet en cours de mise en œuvre, le logiciel utilisé peut accéder à la plupart des formats de données dont le format binaire ArcSDE et/ou le format MSSQL Géométrie ou Géographie. Notre problème actuel est que le nouveau logiciel ne peut pas implémenter de requêtes SQL imbriquées compliquées ou utiliser certaines fonctions sur le format binaire SDE avec l'API ArcSDE 9.3. Selon la société de logiciels, ces fonctionnalités ne fonctionnent apparemment qu'avec le format MSSQL de géométrie ou de géographie.

Sur la base du contexte ci-dessus, je recherche des conseils concernant les points suivants :

  1. Comment puis-je modifier toutes mes données actuellement stockées en tant que binaire SDE au format de données MSSQL Geometry ou Geography ?

  2. Les formats MSSQL Geometry et Geography sont-ils entièrement compatibles avec ArcSDE et ArcGIS ?

  3. Quels sont les inconvénients des formats de géométrie et de géographie par rapport au binaire SDE ?


Votre question est un mélange de désinformation et de sujets croisés, ce qui rend la réponse extrêmement difficile.

Tout d'abord, il n'y a pas de comparaison entre l'"API SDE" et le "format de géodonnées MSSQL Native". ArcSDE, c'est beaucoup de choses, y compris une bibliothèque de codes pour accéder Les données (ne pas données spatiales, tous les types de données, y compris la géométrie) dans plusieurs bases de données SQL (et non SQL), un protocole réseau, plusieurs implémentations de stockage de géodonnées, un serveur d'applications et une suite d'utilitaires écrits à l'aide de l'API. L'API ArcSDE est compatible avec le stockage de géométrie dans MSSQLGÉOMÉTRIEetLA GÉOGRAPHIEformatage.

Tout La requête SQL "compliquée" peut être soumise à la fois via l'API ArcSDE et via l'interface ArcObjects (et Python), telle quelle. Ce n'est pas compliqué ce qui cause autant de problèmes que les types de données de retour non standard/non pris en charge, ou les résultats auxquels il manque un identifiant unique (qui est une exigence ArcObjects, pas ArcSDE).

Esri supprime progressivement la prise en charge directe de l'API ArcSDE depuis un certain temps. ArcGIS 10.2 était la dernière version dans laquelle l'API, les utilitaires de ligne de commande et les serveurs d'applications étaient disponibles. La plupart des fonctionnalités des utilitaires de ligne de commande ont été soit supprimées, soit remplacées par des utilitaires de géotraitement ArcObjects/Python (certains travaux pour prendre en charge l'enregistrement des vues spatiales sont toujours en cours). En outre, ArcGIS 10.0 a introduit des couches de requête, qui sont des requêtes SQL directes via des pilotes SGBDR (pas ArcSDE), qui ont supprimé l'exigence d'une installation complète de géodatabase d'entreprise pour l'accès aux données spatiales.

Enfin, il n'y a pas un option de configuration pour le type de stockage des géodonnées. Toute installation de géodatabase d'entreprise Esri a accès à tous les formats de stockage pris en charge pour ce SGBDR à tout moment (à l'aide des mots clés DBTUNE). Vous pouvez certainement choisir de migrer une partie ou la totalité de vos données vers l'un des formats pris en charge, bien qu'il puisse y avoir des implications de performances spécifiques aux jeux de données individuels et aux options de réglage, mais vous pouvez continuer à créer de nouvelles classes d'entités dans n'importe quel format pris en charge.

D'une manière générale, les types GEOMETRY et GEOGRAPHY sont plus performants que le stockage SDEBINARY (+/-10 %), même s'ils devraient en réalité être bien meilleurs, compte tenu des avantages naturels qu'ils présentent (ces avantages, notamment la solution "une table" vice une jointure à trois voies laide, sont pourquoiGÉOMÉTRIEest le format de stockage par défaut depuis ArcGIS 10.1). Le problème est généralement la difficulté de régler le schéma d'index spatial de Microsoft. Avec un réglage approprié, la plupart des ensembles de données au format GEOMETRY peuvent au moins égaler les performances de SDEBINARY, bien que certains utilisateurs aient abandonné les formats natifs et sont revenus à SDEBINARY.

Au final, les utilisateurs d'Esri peuvent choisir le format de stockage qui répond à leurs besoins, qui couvre trop de paramètres potentiels pour une solution unique. Comme pour toutes les situations de réglage, il est probablement sage d'évaluer les performances avec des données réelles (ou un échantillon représentatif correctement mis à l'échelle) avant de s'engager dans un changement de format.


Migration des données d'un type de stockage à un autre

Vous pouvez utiliser l'outil de géotraitement Migrer le stockage pour migrer des colonnes binaires, spatiales ou raster existantes d'un type de stockage vers un autre. Cela se fait en spécifiant un mot-clé de configuration qui contient un paramètre ATTRBUTE_BINARY, GEOMETRY_STORAGE ou RASTER_STORAGE défini sur le nouveau type de stockage vers lequel vous souhaitez convertir les données.

Il est important de créer le mot-clé de configuration pour inclure le paramètre et la valeur corrects. Si vous spécifiez un mot-clé avec des informations incorrectes ou manquantes, les informations sont lues à partir du mot-clé DEFAULTS. Esri vous recommande de créer un mot-clé personnalisé spécifiquement pour la migration. Assurez-vous que le mot-clé contient le paramètre et la valeur vers lesquels vous migrez les données, ainsi qu'un paramètre UI_TEXT. Le paramètre UI_TEXT rend le mot-clé disponible pour les clients ArcGIS.

Voici les chemins de migration pris en charge pour chaque système de gestion de base de données (SGBD) :

LONG RAW (SDEBINARY) à BLOB (SDELOB)

LONG RAW (SDEBINARY) à ST_GEOMETRY

BLOB (SDELOB) vers ST_GEOMETRY

SDO_GEOMETRY à ST_GEOMETRY

Si la table en cours de migration est enregistrée comme versionnée, sa migration vers un type de stockage différent met également à jour les colonnes correspondantes dans la table des ajouts. Si l'archivage est activé pour la classe d'entités, les colonnes de la table d'archivage sont également mises à jour.


Existe-t-il un exemple SQLAlchemy UserDefinedType pour les types de géographie/géométrie Microsoft SQL Server ?

Comment puis-je créer un SQLAlchemy UserDefinedType qui me permettra d'insérer dans un type de données Geography sur SQL Server ?

J'utilise Python 3.6 et Pandas to_sql pour écrire dans une table SQL Server qui aura une colonne avec un type de données géographiques. J'utilise SQLAlchemy.create_engine pour créer une connexion de base de données à SQLExpress à l'aide de DRIVER=. J'ai des polygones stockés dans une base de données GeoPandas.

SQLAlchemy 1.3.10 ne prend pas directement en charge les types de données Geography ou Geometry et GeoAlchemy2 ne prend pas en charge MS SQL Server. J'ai essayé d'utiliser UserDefinedType de SQLAlchemy pour voir si je peux obtenir quelque chose qui donne :

Je suis bloqué sur ce résultat (notez les guillemets entourant le tout. :

Je sais que cela fonctionnera est SQL :

L'utilisation de pandas.DataFrame.to_sql génère une erreur :

Je suppose que l'erreur est due aux guillemets environnants provoquant une chaîne, et non aux fonctions transmises à SQL.

J'ai essayé d'utiliser sqlalchemy.sql.expression.text sur la chaîne de retour bind_processor mais j'obtiens cette erreur :

Et j'ai regardé sqlalchemy.sql.expression.func mais, je ne sais pas comment l'utiliser avec le complexe GÉOGRAPHIE::STGeomFromText méthode.

Ma présomption peut cependant être incorrecte, car cela fonctionnera en SQL :

Cela entraînera cette erreur, même si les paramètres semblent être corrects. Il obtient toujours la même erreur de conflit de type d'opérande :

J'aimerais voir une prise en charge directe de la géographie et de la géométrie pour MS SQL Server dans SQLAlchemy ou GeoAlchemy.


Cela fonctionne pour les types de géométrie dans le serveur SQL

La boule magique 8 dit "tous les signes indiquent 'oui'". La documentation montre les méthodes Lat et Long. Alors, tu ferais :

Soit dit en passant, s'il est en votre pouvoir de changer le nom de cette colonne, faites-le, vous n'appelleriez pas une colonne avec un type de données entier "int".

Le post date un peu, mais.

Vous devez utiliser une ressource qui peut faire des projections. De nombreux magasins ont accès aux services ESRI REST Geometry et un service exposé commun est Project .

Voici les étapes manuelles, vous pouvez les reconditionner dans un script/une procédure à l'aide de vos outils de base de données habituels :

--Données QA à partir d'un point connu avec geom nommé ShapeGeom

renvoie : POINT (5786835.7214864492 2235317.366254434) 35.10721420 -120.59089280

--extraire/reformater x,y de POINT : 5786835.7214864492,2235317.366254434

--Appel REST - votre chemin sera différent

--http. /rest/services/Utilitaires/Geometry/GeometryServer/project?inSR=2229&outSR=4251&geométries=5786835.7214864492%2C+2235317.366254434&f=json


Pourquoi migrer des données ?

  • Pour accéder à vos données spatiales ou raster à l'aide du langage de requête structuré (SQL)
  • Pour passer d'un type de données qui ne sera peut-être pas pris en charge à l'avenir à un autre qui est pris en charge
  • Pour déplacer les informations d'attribut de géométrie d'une table annexe dans SQL Server vers une colonne de la table de base afin d'améliorer les performances dans les ateliers parcellaires et pour vous permettre d'enregistrer la classe d'entités pour la gestion des versions de branche

Accéder aux données à l'aide de SQL

L'accès aux informations d'une géodatabase via SQL permet aux applications externes (celles qui ne sont pas développées dans un environnement ArcObjects) de travailler avec les données tabulaires gérées par la géodatabase. Si ces applications ont besoin d'accéder à des données spatiales ou raster dans la géodatabase, vous devez stocker vos données spatiales ou raster dans des types de données qui autorisent l'accès SQL. Par exemple, l'utilisation du type de stockage ST_Geometry vous permet d'accéder à vos données d'entités avec SQL, ce que vous ne pouvez pas faire facilement si vos données sont stockées dans un BLOB ou un champ brut long.

Déplacer des types qui pourraient ne pas être pris en charge dans les futures versions

Les classes d'entités créées dans les géodatabases ArcGIS 10.1 et versions ultérieures dans SQL Server utilisent le type Microsoft Geometry par défaut. Pour déplacer vos classes d'entités existantes vers le type de stockage Géométrie, utilisez l'outil de géotraitement Migrer le stockage ou un script Python.

Déplacer les attributs de géométrie pour améliorer les performances

Depuis ArcGIS Pro 1.4, le stockage des attributs de géométrie pour les objets paramétriques (tels que les vraies courbes) et pour les patchs de surface (tels que les pointID et les multipatches) s'est amélioré : ils sont stockés directement dans la table métier. Dans les versions antérieures, ces données d'attribut étaient stockées dans une table associée qui était jointe à la table métier. Cette jointure pouvait entraîner de mauvaises performances et était souvent remarquée lors de l'utilisation d'ateliers parcellaires.

    Le type de stockage est Microsoft Geometry et vous souhaitez continuer à utiliser le type Geometry.

Pour migrer les attributs de géométrie de la table associée vers une nouvelle colonne dans la table métier de la classe d'entités, spécifiez un mot-clé de configuration dont le paramètre GEOMETRY_STORAGE est défini sur Geometry et exécutez l'outil Migrer le stockage.

Pour migrer les attributs de géométrie de la table associée vers une nouvelle colonne dans la table métier de la classe d'entités, spécifiez un mot-clé de configuration dont le paramètre GEOMETRY_STORAGE est défini sur Géographie et exécutez l'outil Migrer le stockage.

Dans ce cas, spécifiez un mot-clé de configuration dont le paramètre GEOMETRY_STORAGE est défini sur Geography et exécutez l'outil Migrate Storage. Cela migre les attributs de géométrie vers le nouveau format de stockage.

Dans ce cas, spécifiez un mot-clé de configuration dont le paramètre GEOMETRY_STORAGE est défini sur Geography et exécutez l'outil Migrate Storage. Cela migre à la fois le type de données spatiales et les attributs de géométrie vers le nouveau format de stockage.

Une fois les données migrées vers ce format, seuls les clients ArcGIS 10.3.1 et versions ultérieures peuvent accéder aux données.


le résultat de la requête ci-dessus est ci-dessous :

vous pouvez utiliser max_length pour la taille de chaque type de données.

T-SQL a une fonction pour cela : DATALENGTH pour toutes les versions de SQL Server.

Résultat : 3.1415142 et 5 (car DECIMAL(10,7) utilise 5 octets à stocker).

Par exemple, j'ai une table appelée Applications avec ces colonnes : ( id VARCHAR (32), debug BIT, connectionString VARCHAR (2048), firebaseKey VARCHAR (4096) ). Comme nous le savons, VARCHAR n'alloue pas tout l'espace (juste ce dont vous avez besoin, donc 'A' correspond à 1 octet dans VARCHAR).

renverra ma taille de données (dans mon cas, avec mes lignes, est de 8, 2, 366, 4698 (total : 5074). Il y a 2 lignes dans ce tableau.

Notez que cela ne représente PAS la taille totale de ma base de données (il y a des pages, des descripteurs, des index, etc. impliqués.)*

MSSQL dispose de procédures stockées internes pour vous indiquer la taille exacte de votre base de données sur le disque :

  • EXEC sp_spaceused pour toutes les bases de données
  • EXEC sp_spaceused N'schema.TableName' pour une table spécifique
  • EXEC sp_helpdb N'DatabaseName' si vous voulez des détails sur chaque fichier.

Si la table spécifiée dans la clause where contient un nvarchar, cette requête vous donnera correctement combien de caractères il y a pour cette colonne !

Cela détecte si la colonne est "large" et se divise essentiellement par 2. Plus large que simplement nvarchar.

Bien sûr, vous pouvez simplement diviser max_length sur sys.columns par 2 si vous savez que la colonne est un nvarchar. C'est plus pour découvrir le schéma de la table d'une manière qui semble meilleure si de nouveaux types de données SQL sont introduits à l'avenir. Et vous choisissez donc de le mettre à niveau. Assez petit boîtier de bord.

Veuillez modifier et corriger cette réponse si vous trouvez un cas limite où les octets et les bits sont incorrects.


Safe Software, le premier fournisseur de transformation et de chargement de données spatiales pour SQL Server, est connu depuis longtemps pour ses produits phares FME Desktop et FME Server (qui incluent un plan de travail spatial pour la transformation et le chargement, prennent en charge une tonne de formats spatiaux, l'intégration SSIS et Suite). Mais saviez-vous qu'ils viennent de lancer une solution abordable, [&hellip]

OK, dernier pour la soirée, il se fait tard à Berlin. Et BTW, nous pourrions avoir un peu de bonté Denali ici à TechEd. Recherchez des "futurs"s, peut-être. Il existe un nouvel indice pour les requêtes spatiales dans Denali CTP1, à savoir SPATIAL_WINDOW_MAX_CELLS. Il s'agit d'un indice de table qui, pour autant que je sache, affecte la requête [&hellip]


Pourquoi devrais-je migrer mes données ?

  • Pour accéder à vos données spatiales ou raster à l'aide du langage de requête structuré (SQL)
  • Pour passer d'un type de données qui pourrait ne pas être pris en charge à l'avenir à un type pris en charge

Accéder aux données à l'aide de SQL

L'accès aux informations d'une géodatabase via SQL permet aux applications externes (celles qui ne sont pas développées dans un environnement ArcObjects) de travailler avec les données tabulaires gérées par la géodatabase. Si ces applications ont besoin d'accéder à des données spatiales ou raster dans la géodatabase, vous devez stocker vos données spatiales ou raster dans des types de données qui autorisent l'accès SQL. Par exemple, l'utilisation du type de stockage ST_Raster vous permet d'accéder à vos données raster avec SQL, ce que vous ne pouvez pas faire facilement si vos données raster sont stockées dans un champ BLOB, LONG RAW, IMAGE, BINARY ou BYTEA.

Déplacer des types qui pourraient ne pas être pris en charge dans les futures versions

Oracle recommande l'utilisation de types de données BLOB ou BFILE au lieu de types de données LONG RAW dans ses bases de données. Bien que les colonnes LONG RAW soient toujours prises en charge, si vous avez des champs d'attribut, de géométrie ou de raster LONG RAW dans votre géodatabase actuelle dans Oracle, vous devez les migrer vers un format différent en prévision du moment où elles ne seront pas prises en charge.

Le stockage des colonnes attributaires, géométriques et raster dans une géodatabase est contrôlé par les paramètres DBTUNE ATTRIBUTE_BINARY, GEOMETRY_STORAGE et RASTER_STORAGE, respectivement. Les valeurs par défaut de ces paramètres sous le mot-clé de configuration DBTUNE DEFAULTS sont différentes selon la version d'ArcGIS que vous utilisiez lorsque vous avez créé votre géodatabase. Le tableau suivant montre le paramètre par défaut sous le mot-clé DEFAULTS dans la table DBTUNE des géodatabases dans Oracle.

Par défaut dans ArcGIS 9.3 et versions ultérieures

Par défaut avant ArcGIS 9.2

Les données créées dans les nouvelles géodatabases (non mises à niveau) 9.3 ou version ultérieure à l'aide des paramètres par défaut n'utilisent pas le type de stockage LONG RAW. Cependant, toutes les données existantes créées avec tout ou partie de ces paramètres définis sur LONG RAW ou toute nouvelle donnée dans les géodatabases mises à niveau dont ces paramètres sont définis sur LONG RAW contiendront toujours des colonnes LONG RAW. Pour modifier les types de données de ces colonnes, vous devez modifier vos paramètres DBTUNE et migrer les données.

À partir d'ArcGIS 10.1, les classes d'entités créées dans les géodatabases dans SQL Server utilisent le type de géométrie Microsoft par défaut. Pour déplacer vos classes d'entités existantes vers le type de stockage de géométrie, utilisez l'outil de géotraitement Migrer le stockage ou un script Python.


2 réponses 2

En utilisant le lien d'Aaron pour une adaptation encore plus fine de mon processus, je recommanderais une fonction et une vue/requête pour signaler la taille par ligne par table, y compris les index.

Le script sélectionné comme réponse présente certains inconvénients :

Ne prend pas en compte certains types de données SQL Server :

image, texte, identificateur unique, sql_variant, ntext, idhiérarchie, géométrie, géographie, xml, sysname

et (max) des structures de structures de données telles que varchar(max) pour n'en nommer que quelques-unes.

  1. Prend en compte les colonnes calculées qui ne devraient pas affecter la taille de l'enregistrement.
  2. Ne prend pas en compte la table de faits a des colonnes NULLable.
  3. Ne prend pas en compte le fait que certains types de données ont une taille différente selon l'échelle spécifiée (par exemple, time(0) et time(7) doivent avoir une longueur de colonne différente)

Le script suivant montre la taille de l'enregistrement telle qu'elle se trouve sur une page de données. Il montre la taille maximale pouvant être prise par l'enregistrement, la taille minimale (dans le cas où toutes les valeurs de l'enregistrement sont NULL si la structure de la table le permet). Il affiche le type de table (CLUSTERED/NONCLUSTERED), le nombre total de colonnes de données et le schéma auquel appartient la table.

Notez que ce script ne prend pas en compte les index.

Mise à jour : le script compte chaque colonne de bits comme 1/8e d'octet. Les tailles minimale et maximale sont ajustées pour garantir que les enregistrements ne peuvent pas être inférieurs à la taille du talon de transfert.


Avant de migrer.

Les conditions suivantes doivent être remplies avant de convertir vos données :

  • Vous devez effectuer une sauvegarde des données avant de les migrer.
  • Si vous convertissez le type de colonne spatiale, les données doivent être stockées en haute précision. Si vos données sont actuellement stockées avec une précision de base, vous devez d'abord les migrer vers une haute précision avant de migrer le type de stockage. Cela peut être fait avec l'outil de géotraitement Mettre à niveau la référence spatiale ou la commande sdelayer avec l'opération alter. Voir Migration vers une haute précision pour plus d'informations sur la migration de la précision d'un jeu de données.
  • Si vous convertissez la colonne spatiale, la table doit contenir une colonne d'ID d'objet. L'enregistrement d'une couche avec la géodatabase ajoute automatiquement cette colonne, ou vous pouvez utiliser la commande sdetable avec l'opération alter_reg pour l'ajouter.
  • Le mot-clé de configuration que vous spécifiez lors de la migration du type de données doit contenir la valeur correcte pour le paramètre GEOMETRY_STORAGE, ATTRIBUTE_BINARY ou RASTER_STORAGE. Par exemple, si vous souhaitez migrer une colonne géométrique LONG RAW vers ST_GEOMETRY, mais que vous spécifiez un mot-clé dont le paramètre GEOMETRY_STORAGE est défini sur SDO_GEOMETRY, la migration échouera car ce n'est pas un chemin de migration pris en charge.
  • Lorsque les données sont migrées d'un type de données à un autre, un nouveau segment est créé dans la base de données vers laquelle les données sont copiées. Une fois la migration terminée, les métadonnées sont redirigées vers le nouveau segment et l'ancien est supprimé. Cela signifie que lors de la migration, il y a deux copies des données. Par conséquent, assurez-vous d'avoir suffisamment de place dans la base de données pour deux copies des données.
  • Étant donné que le stockage d'attributs, de raster et de géométrie peut être migré vers un type de données BLOB dans Oracle, il est recommandé de lire la rubrique Stockage de données BLOB dans les géodatabases dans Oracle avant de procéder à la migration.
  • Vous devez être connecté en tant que propriétaire de la table qui contient la colonne en cours de migration.
  • La migration d'une classe d'entités vers le type SQL Server GEOGRAPHY nécessite que les données se trouvent dans l'un des systèmes de coordonnées géographiques pris en charge par le type GEOGRAPHY et que la classe d'entités ne contienne pas de valeurs de coordonnées z ou m.


Voir la vidéo: How to create and add Enterprise Geodatabase SQL Server ArcMap, two ways (Octobre 2021).