Suite

OGR2OGR FileGDB 2 autre format avec structure de changement de requête -SQL


J'utilise GDAL 1.11.1 avec le pilote ESRI FileGDB, GDB version 10.x.

Lorsque j'utilise ogr2ogr, mon objectif est de trier différemment mes champs et dans certains cas, de les renommer. Le problème est que lorsque j'appelle le pilote FileGDB dans un autre format, la structure de ma table change pour chaque chaîne.

Par exemple:

  • Input FileGDB :champ de chaîne, 3 de longueur
  • Output FileGDB:string field, tous les champs sont définis sur 0 (ogrinfo) ou 65536 (ArcGIS 10.1)
  • Sortie SHP:champ de chaîne, chaque champ est défini sur 80 (par ogrinfo)

voici mon cmd. ogr2ogr -f "FileGDB" TEMP.GDB Source.gdb -sql "select * from input_layer"

J'ai essayé de faire un caractère ALTER TABLE nation ALTER COLUMN myfield2 TYPE (15) mais cela ne fonctionne pas sur FileGDB?

Des idées?


Ce problème a été fermé et corrigé dans https://trac.osgeo.org/gdal/ticket/5806


Création de fichiers de forme à partir de SQL Server à l'aide d'Ogr2ogr

J'essaie d'exécuter le code suivant dans une fenêtre de commande. Le code s'exécute, mais il ne me donne aucune valeur dans les fichiers .SHP. La table a GeographyCollections et Polygons stockés dans un champ de type Geography. J'ai essayé de nombreuses variantes pour le type de géographie dans l'instruction sql - binaire, texte, etc. mais sans succès. Le fichier de sortie .DBF contient des données, donc la connexion à la base de données fonctionne, mais le fichier de forme .Shp et le fichier .shx n'ont pas de données et sont de taille 17K et 11K, respectivement.


Ouvrez la ligne de commande psql et tapez :

avec la requête ci-dessus, vous pouvez colonnes et son type de données

'^(hello world)$ au lieu de simplement c.relname = 'hello world' ? &ndash Thomas 1 avril 19 à 12:26

N'oubliez pas d'ajouter le nom du schéma au cas où vous auriez plusieurs schémas avec les mêmes noms de table.

Une version qui prend en charge la recherche des noms de colonnes et des types d'une table dans un schéma spécifique, et utilise des JOIN sans aucune sous-requête

Réponse Pratik mise à jour pour prendre en charge plus de schémas et de valeurs nullables :

Pour rendre ce sujet "plus complet".

J'ai requis les noms de colonnes et les types de données sur une instruction SELECT (pas une table).

Si vous souhaitez le faire sur une instruction SELECT au lieu d'une table existante, vous pouvez procéder comme suit :

Brève explication, il crée une table (temporaire) de votre instruction select, que vous pouvez "appeler" via la requête fournie par (entre autres) @a_horse_with_no_name et @selva.


Arborescences de segments avec insertion/suppression

J'ai un problème de requête de plage à résoudre. Ce problème nécessite non seulement des requêtes de plage et une mise à jour, mais également l'insertion ou la suppression d'un élément du tableau. Il y a une série d'opérations qui doivent être effectuées dans l'ordre où elles apparaissent dans l'entrée. Les opérations peuvent être l'une des suivantes : mettre à jour une position du tableau avec une nouvelle valeur, insérer un nouvel élément à un certain index du tableau, supprimer un élément à un certain index du tableau et rechercher des informations sur une plage du tableau.

J'ai essayé une implémentation de Segment Tree où les nœuds sont stockés dans un tableau. L'enfant gauche du nœud à l'index p est à l'index 2p, l'enfant droit est à l'index 2p + 1. Cette implémentation n'est pas suffisante, car l'arbre est statique. Tout ce que je peux faire, ce sont des requêtes de plage et des positions de mise à jour du tableau d'origine. L'insertion ou la suppression d'éléments dans le tableau d'origine nécessite la reconstruction de l'arbre, donc le temps d'exécution est O(n) (trop lent pour les cas de test). Mon programme est correct, mais trop lent.

J'ai recherché sur Google les arbres de segment avec insertion/suppression et j'ai lu qu'il était possible de le faire avec des arbres de recherche binaires auto-équilibrés, comme les arbres AVL ou rouge-noir. Mais j'ai du mal à comprendre comment l'insertion ou la suppression fonctionnerait dans cet arbre à segments dynamique dont j'ai besoin.


OGR2OGR FileGDB 2 autre format avec structure de changement de requête -SQL - Systèmes d'Information Géographique

#####Avant d'entreprendre ce projet, assurez-vous de télécharger le dossier zippé contenant tous les projets, images et instructions nécessaires. Pour ceux qui ne connaissent pas ce type de téléchargement, regardez en haut à droite du référentiel et cliquez sur "Télécharger ZIP".

Dans le cadre de l'engagement de LINZ envers la communauté ouverte, nous publions tous les scripts de projet et de support pour les fonds de carte LINZ NZ Terrain pour la création de fonds de carte personnels. Les instructions suivantes détaillent les processus de création de fonds de carte LINZ sur les plates-formes Linux et Windows. Pour de meilleurs résultats, il est utile d'avoir ces programmes et éléments en place avant de commencer :

  • Moulin à carreaux https://gist.github.com/bsudekum/b4606871250d9d834b3d
  • PostgreSQL avec les extensions PostGIS http://postgis.net/ ou http://www.postgresql.org
  • QGIS (pour les utilisateurs Windows) http://www.qgis.org/en/site/forusers/download.html (version OSGeo4W)
  • GDAL (pour les utilisateurs Linux)
  • Fichier Géodatabase de couches vectorielles
  • Tuiles raster DEM et d'ombrage
  • Motifs de remplissage de texture

Ce projet utilise une collection de données vectorielles et matricielles dérivées du service de données LINZ (LDS) et de la base de données sur la couverture terrestre (LCDB 3.3) de Landcare Research. Pour ceux qui ne connaissent pas LDS ou LRIS, les liens suivants aideront les utilisateurs à se familiariser avec ces services et les données qu'ils fournissent.

#######Les données de la couche LCDB 3.3 doivent être téléchargées à partir du site Web Landcare Research répertorié ci-dessous.

## Configuration du projet La reconstruction des fonds de carte nécessite l'utilisation de TileMill, QGIS et d'une base de données PostgreSQL avec des extensions PostGIS. Vous trouverez ci-dessous des liens vers des logiciels et des instructions générales pour les versions sur les systèmes Linux et Windows.

Les dernières installations pour TileMill, Windows et Linux se trouvent ici :

Installez TileMill comme indiqué. Selon la version Linux que les utilisateurs exécutent, TileMill peut avoir des exigences de construction supplémentaires. Les versions récentes de Tilemill intégrées à Atom Shell peuvent simplement être téléchargées et exécutées à partir du dossier installé sans autre installation.

Un package complet pour Windows 32 ou 64 bits, comprenant PostgreSQL, PostGIS et PGAdmin III est disponible en téléchargement ici :

Nous recommandons PostgreSQL version 9.1+ et PostGIS version 2.1+

Installez PostgreSQL, PostGIS et créez une base de données spatiale comme recommandé avec les paramètres ci-dessous. Si vous exécutez la base de données PostgreSQL sur votre hôte local, avec l'intention de générer des fonds de carte, la configuration du serveur doit être configurée pour toutes les connexions de confiance à partir de l'hôte local. Cela peut être fait en ajoutant héberger tous tous les 127.0.0.1/32 confiance à votre pg_hba.conf puis redémarrer le serveur. Pour créer la base de données, exécutez le SQL suivant :

Vous devez ensuite créer un utilisateur de base de données normal avec lequel Tilmill se connectera. Exécutez le SQL suivant :

Votre chaîne de connexion à la base de données ressemblera alors (sauf si vous n'avez pas autorisé les connexions de confiance)

Dans la nouvelle base de données, NZ_Data, exécutez le code SQL suivant :

permettant la fonctionnalité spatiale de la base de données PostgreSQL.

####3. QGIS (OSGeo4W) pour Windows ou GDAL pour les utilisateurs Linux

QGIS fournit un accès facile à la lisibilité GDAL et FileGDB via le shell OSGeo4W dans les systèmes Windows. Pour ce projet, l'accès à GDAL et la capacité de lire FileGDB sont requis. Les systèmes Windows n'ont pas intrinsèquement accès à la lecture de GDAL via la ligne de commande. L'accès est rendu disponible en installant OSGeo4W et en exécutant des processus de ligne de commande via le shell OSGeo4W. Les utilisateurs de Linux n'ont besoin d'installer GDAL que via les processus standard fournissant des commandes via un terminal standard.

La version OSGeo4W de QGIS donne aux utilisateurs l'accès à GDAL et la possibilité de lire FileGDB via le shell QSGeo4W sous Windows. Installez QGIS comme indiqué. Les utilisateurs de Linux n'ont besoin d'installer les pilotes GDAL que s'ils le souhaitent, cependant, une installation complète de QGIS est recommandée, car elle est souvent utile pour visualiser et tester les données.

Ce projet contient un mélange de données raster et vectorielles avec une taille combinée d'environ 21 Go. Il y a une limite de 3,5 Go pour les téléchargements directs depuis LDS, donc actuellement, il n'est pas possible d'obtenir l'ensemble du package vectoriel et raster en un seul téléchargement. Les vecteurs et les ombrages doivent être commandés via le service de messagerie de LDS. Cependant, les rasters DEM nécessitent une livraison par messagerie. Il est recommandé aux utilisateurs de combiner toutes les données dans un colis par courrier car il s'agit d'une méthode utile pour regrouper toutes les tables et rasters nécessaires sur un seul lecteur stick. ESRI File GDB et GeoTIFF sont les formats de couche recommandés. Ce qui suit décrit l'obtention du package contenant les données vectorielles et raster nécessaires à la construction de la carte de base.

Utilisez ce lien géographique vers LDS afin de précharger toutes les couches nécessaires à la reconstruction des fonds de carte. La connexion à LDS avec ce lien sélectionne les couches et les prépare pour le téléchargement. Il devrait y avoir dix-huit couches vectorielles et deux fichiers raster sélectionnés. Veuillez noter les commentaires concernant les téléchargements DEM ci-dessous.

Après avoir cliqué sur le lien, vous êtes redirigé vers le service de données LINZ (LDS), avec les couches préchargées et prêtes à être téléchargées. Regardez dans le coin supérieur droit du site Web LDS et sélectionnez « Télécharger ou commander ».

Actuellement, en raison du DEM dépassant la limite de téléchargement de 3,5 Go pour LDS, les utilisateurs doivent commander cette couche via un service de messagerie. Ce service est accessible via LDS et peut être configuré via la fenêtre de téléchargement :

Il est recommandé que les tuiles DEM soient au format .tif. Il y a 115 tuiles DEM séparées livrées dans un seul dossier. Ce dossier doit être placé sur votre système local dans un endroit facilement accessible. Notez le chemin du fichier car vous en aurez besoin plus tard pour créer un .vrt et éventuellement lier les données DEM à Tilemill.

Les dalles Hillshade sont disponibles en tant que service de messagerie ou en téléchargement direct. Il est suggéré aux utilisateurs de commander simultanément le hillshade et le DEM en tant que service de messagerie. Conservez toutes les tuiles d'ombrage dans un seul dossier.

Il est recommandé que les tuiles Hillshade soient au format .tif. Il y a 115 tuiles d'ombrage séparées livrées dans un seul dossier. Ce dossier doit être placé sur votre système local dans un endroit facilement accessible. Notez le chemin du fichier car vous en aurez besoin plus tard pour créer un .vrt et éventuellement lier les données d'ombrage à Tilemill.

######La base de données sur la couverture terrestre (LCDB 3.3) sur le portail des systèmes d'information sur les ressources foncières (LRIS)

La base de données sur la couverture terrestre 3.3 (LCDB 3.3), développée par Land Research, figure en bonne place dans le fond de carte en couleur et est nécessaire à la fois pour les cartes en couleur et en noir et blanc. Les données sont téléchargées à partir du portail LRIS de la même manière que le format de téléchargement utilisé par LDS. FileGDB est le format de fichier recommandé. Vous trouverez ci-dessous le lien vers le LRIS et le LCDB 3.3 :

Web Mercator WGS84 (EPSG:3857) est suggéré pour éviter les erreurs de projection imprévues dans TileMill et est le plus adapté aux applications de cartographie Web standard. Les utilisateurs peuvent sélectionner la projection souhaitée pour leurs couches avant de commander leur téléchargement dans LDS.

L'utilisation d'autres projections, par exemple NZTM2000 (EPSG:2193) ou WGS84 (EPSG:4326), est possible. Le blog suivant décrit le processus de modification de la projection source des projets TileMill de EPSG:3857 au format de projection souhaité :

######Conversion de base de données FileGDB en PostgreSQL

Une fois toutes les données vectorielles obtenues, les utilisateurs doivent charger et convertir les couches de la géodatabase fichier en tables Postgres. Ce qui suit décrit ce processus.

Les tables FileGDB ne peuvent pas être importées directement dans les bases de données PostgreSQL. Sous Windows, l'utilisation de l'outil de ligne de commande ogr2ogr via le shell OSGeo4W accomplit cette tâche. Les utilisateurs de Linux peuvent simplement exécuter ogr2ogr dans le terminal si GDAL est correctement installé. L'importation de FileGDB dans PostgreSQL est terminée à l'aide des fonctions de ligne de commande suivantes (assurez-vous de changer de répertoire dans le dossier contenant les données) :

Noter: Vous devrez peut-être modifier votre Nom d'utilisateur et le mot de passe paramètres pour s'adapter à votre configuration de base de données PostgreSQL.

Une fois installé, TileMill se construit dans le dossier /Documents de Windows et sous Linux sous le dossier /Documents/Mapbox.

Les dossiers de projet contiennent des feuilles de style utilisées par TileMill pour créer chaque projet de carte. Ces dossiers, NZ Terrain Graphite et NZ Terrain Natural Colour, sont contenus dans le fichier zippé téléchargé au début de ce manuel d'instructions. Les couches de chaque feuille de style pointent actuellement vers la base de données PostgreSQL. Aucune modification ne devrait être nécessaire, cependant, il peut y avoir des cas où l'utilisateur devra relier les chemins de fichiers, par exemple en reconnectant DEM et Hillshade .vrt à chaque projet. Placez les feuilles de style téléchargées localement dans le dossier des projets de MapBox. (…DocumentsMapBoxproject)

Le remplissage de texture raster est inclus dans le package téléchargé d'origine. Ils peuvent également être consultés et téléchargés ici : https://github.com/linz/linz_basemaps/tree/master/img . Placez les textures localement dans : . DocumentsMapBoxcache. Les fichiers de texture requis pour ce projet sont :

Une fois le raster et l'ombrage en place, créez un fichier .vrt dans le même dossier que les rasters respectifs. Un fichier au format virtuel GDAL (VRT) est requis pour l'ombrage et le raster DEM, cependant, ne sont PAS fournis avec les packages raster. Les utilisateurs devront créer eux-mêmes ces .vrt et les intégrer dans leurs dossiers respectifs. Pour ceux qui ne connaissent pas le format vrt, voici un guide utile :

Les processus de ligne de commande GDAL suivants créeront un fichier .vrt. Un .vrt est nécessaire pour les fichiers raster hillshade et DEM, alors exécutez la commande GDAL dans les deux dossiers raster. Avant d'exécuter les commandes ci-dessous, assurez-vous de changer de répertoire, en naviguant jusqu'au dossier contenant les fichiers raster. Créez le .vrt dans le même dossier que les fichiers raster.

Windows (exécuté via OSGeo4W Command Shell):

######Relier Hillshade et DEM

Une fois qu'un projet est démarré pour la première fois dans Tilemill, les utilisateurs sont invités à rattacher Hillshade et DEM au .vrt. Ouvrez l'onglet Calques dans le coin inférieur gauche de la fenêtre Tilemill, recherchez le calque d'ombrage ou DEM et sélectionnez la forme de crayon ouvrant la fenêtre de l'éditeur. Accédez à l'emplacement de stockage de votre .vrt, sélectionnez-le et enregistrez-le.

Ce projet est publié sous les termes du nouveau Creative Commons Attribution 3.0 Nouvelle-Zélande licence et se trouve ici :

Copyright 2013 Crown copyright (c) Land Information New Zealand et le gouvernement néo-zélandais.


Si vous souhaitez réellement fermer la connexion (pourquoi ? si vous « exécutez fréquemment des commandes SQL », vous souhaitez probablement la réutiliser, ou encore mieux - utiliser le pool de connexions), vous devez le faire dans le rappel des résultats de la requête. Toutes les commandes sont placées dans la file d'attente des commandes et traitées séquentiellement.

C'est ce que tu fais :

  • ouvrir le flux de connexion à mysql
  • ajouter la commande Handshake à la file d'attente
  • ajouter la commande Query à la file d'attente
  • ajouter la commande Quitter à la file d'attente, marquer la connexion comme fermée
  • commencer à traiter les commandes
  • maintenant la poignée de main est traitée lorsque la connexion est à l'état de « fermeture »

Étant donné que le nœud js est asynchrone, connection.connect() et connection.end() sont exécutés en parallèle,

Si vous souhaitez spécifier la séquence d'exécution, utilisez des rappels tels que


3 réponses 3

L'objectif de la normalisation est de supprimer les anomalies de mise à jour. Plus précisément, la modification d'un seul fait devrait entraîner la modification d'une colonne d'une seule ligne. Considérez comment cela s'appliquerait à vos conceptions proposées si, par exemple, la destination d'expédition était modifiée, ce qui est une exigence commerciale très raisonnable.

Dans la première conception, plusieurs lignes peuvent changer car, potentiellement, il existe plusieurs lignes pour un seul SalesOrderNumber, chacune avec son propre PartID. Avec la deuxième conception, une seule ligne est mise à jour. Le deuxième design est donc plus normalisé.

Pour un point de vue différent, vous pouvez regarder les dépendances - quelles valeurs changent à l'unisson. Dans la première conception, si vous passez d'une ligne à une autre avec le même SalesOrderNumber, la ShippingDestination sera la même que DueDate. Cependant OrderQuantity sera différent entre ces deux lignes. Ainsi, OrderQuantity ne dépend pas uniquement de SalesOrderNumber - vous devez également connaître PartID. Deux dépendances différentes donc deux tables normalisées différentes. (Il y a plus à Dépendances fonctionnelles / Décomposition de dépendances, mais c'est l'essentiel.)

2NF parle de "dépendance de clé de partie" - si toutes les colonnes de la clé sont nécessaires pour déterminer les valeurs de toutes les colonnes non clés. En regardant la première conception, il y a une clé composite de (SalesOrderNumber, PartID). Lorsque nous passons d'une ligne avec un SalesOrderNumber particulier à la suivante avec le même numéro, certaines colonnes (ShippingDestination par exemple) seront toujours les mêmes par définition. PartID est dans la clé mais n'est pas nécessaire pour déterminer la valeur de ShippingDestination. Le premier design n'est donc pas 2NF.

3NF parle de "dépendance transitive" - ​​si la valeur d'une colonne change parce que la clé change ou parce que la valeur d'une colonne non-clé séparée change. Je ne connais pas assez les règles métier réelles pour dire si la deuxième conception est en 3NF, je vais donc inventer un scénario à démontrer. Disons qu'un client ne peut appartenir qu'à un seul canal. Lorsque nous passons d'une ligne à l'autre dans Order, nous constatons que CustomerNumber et Channel changent de valeur. Cependant, Channel change de valeur non pas parce qu'il existe un SalesOrderNumber différent, mais parce qu'il existe un CustomerNumber différent. Le canal varie selon SalesOrderNumber au moyen de (c'est-à-dire de manière transitive) CustomerNumber. Dans mon scénario inventé, le canal doit être déplacé de Order vers une nouvelle table (Customer) saisie par CustomerNumber.

Pour violer BCNF, la table doit avoir plus d'une clé candidate qui partagent au moins une colonne. Aucune des conceptions n'a cela, donc une fois dans 3NF, la conception est également dans BCNF.


Conseils de performances

Lors de l'écriture dans un SGBD transactionnel (SQLite/PostgreSQL, MySQL, etc. ), il peut être avantageux d'augmenter le nombre d'instructions INSERT exécutées entre les instructions BEGIN TRANSACTION et COMMIT TRANSACTION. Ce nombre est spécifié avec l'option -gt. Par exemple, pour SQLite, la définition explicite de -gt 65536 garantit des performances optimales lors du remplissage d'une table contenant plusieurs centaines de milliers ou millions de lignes. Cependant, notez que -skipfailures remplace -gt et définit la taille des transactions sur 1.

Pour PostgreSQL, l'option de configuration PG_USE_COPY peut être définie sur YES pour une amélioration significative des performances d'insertion. Voir la page de documentation du pilote PG.

Plus généralement, consultez la page de documentation des pilotes d'entrée et de sortie pour obtenir des conseils de performances.


1 réponse 1

J'ai généralement un service dédié pour répondre aux besoins de chaque application frontend. Ce service effectue tout levage du backend au nom du frontend. Cela a quelques avantages:

  • Formatez les données pour une consommation plus facile par l'interface utilisateur. Différentes interfaces utilisateur auront des exigences différentes. Par exemple, si j'ai une application Android, je peux choisir le service frontal de cette application pour utiliser un autre format de sérialisation que Json, car la bande passante de l'appareil est limitée et il existe des protocoles plus petits.
  • Découplez le format de données requis par le frontend du backend. Si vous décidez de modifier la structure Json dans l'un de vos services, vous pouvez utiliser le modèle d'adaptateur dans le service frontend.
  • Point d'accès unique pour le frontend au backend - vous pouvez contrôler l'accès ici et restreindre les domaines par exemple.
  • Combinez efficacement les requêtes : le frontend ne doit pas envoyer le moins de requêtes possible au backend, mais parfois l'interface utilisateur demande un peu de données de plusieurs services différents. Le service frontend est un bon endroit pour cette logique et il peut faire plusieurs requêtes beaucoup plus efficacement.

Tout d'abord, obtenez la liste des identifiants correspondant au prénom de l'utilisateur. Transmettez ces identifiants au service métier pour y obtenir la liste des objets métier en réalisant un filtrage.

Je recommande cette approche. Je demanderais au "service frontal" de faire une demande au service utilisateur pour obtenir tous les utilisateurs par nom, extraire les identifiants et faire une demande au service métier pour obtenir des objets métier par identifiant utilisateur. Vous devez implémenter des points de terminaison dans les services pour faciliter ces deux requêtes. Si vous faites m demandes, vous l'avez mal fait.


1 réponse 1

Tout sera renseigné à l'insertion, c'est aussi l'une des raisons pour lesquelles avoir trop d'index est considéré comme une mauvaise pratique sur les tables qui ont beaucoup d'opérations CRUD.

Dans votre cas, vous n'avez qu'un index CLUSTERED et un index NON CLUSTERED (SQL Server crée un index CLUSTERED pour un PK par défaut même si vous ne le spécifiez pas). Les index non clusterisés ont ce qu'on appelle une "clé de clustering" qui est essentiellement un pointeur vers l'index clusterisé.

Une clé de clustering se compose des valeurs des clés d'index clusterisé de la ligne pointée et de l'Uniquifier (s'il est présent). À chaque insertion, la clé groupée doit trier les valeurs en mémoire et chacun de ces pointeurs doit à son tour se déplacer. Gardez également à l'esprit que les index clusterisés dans SQL Server font immédiatement de la table une structure B-Tree (sauf s'il s'agit d'un index de stockage de colonnes), et c'est l'une des principales causes de fragmentation. Comme les règles de la structure de données B-Tree pourraient forcer les pages à se diviser et donc changer la structure entière du B-Tree (c'est comme un effet en cascade).

Afin d'éviter une certaine fragmentation lors de l'insertion, vous devez trier les données avec une requête avant de le faire. Cet article explique comment cela fonctionne et pourquoi.

Fait amusant, un index non clusterisé pointera vers quelque chose appelé RID (Row Identifier) ​​lorsqu'aucun index clusterisé n'est présent. C'est ce qu'on appelle alors une table de tas.


Voir la vidéo: GDALOGR Installation on Windows (Octobre 2021).