Suite

Écriture d'un fichier de formes à l'aide d'OGR, à partir de Shapely Geometry - Aucune fonctionnalité ajoutée Erreur

Écriture d'un fichier de formes à l'aide d'OGR, à partir de Shapely Geometry - Aucune fonctionnalité ajoutée Erreur


J'essaie d'écrire un fichier de formes à partir d'une géométrie Shapely en utilisant PyQGIS dans la console QGIS 2.6.0.

Lignes de code avant la méthode OGR pour écrire le fichier de formes :

extnt = poly.extent() # donne une sortie QtRectangle -> extnt x_min = extnt.xMinimum() x_max = extnt.xMaximum() y_min = extnt.yMinimum() y_max = extnt.yMaximum() A_bbox = QgsPoint(x_min, y_min ) B_bbox = QgsPoint(x_max, y_min) C_bbox = QgsPoint(x_max, y_max) D_bbox = QgsPoint(x_min, y_max)

où poly est un fichier de formes de polygone.

Source du code ci-dessous : Comment écrire des géométries Shapely dans des fichiers de formes ? et publication GitHub

linelyr = ogr.Geometry(ogr.wkbLineString) linelyr.AddPoint(x_min, y_min) linelyr.AddPoint(x_min, y_max) out_line = ogr.Geometry(ogr.wkbLineString) out_line.AddGeometry(linelyr) out_line.ExportToWkbDriver ("Esri Shapefile") ds = driver.CreateDataSource("outputlocation.shp") layr1 = ds.CreateLayer(", None, ogr.wkbLineString) layr1.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) defn = layr1.GetLayerDefn() feat = ogr.Feature(defn) feat.SetField('id', 1) geom = ogr.CreateGeometryFromWkb(out_line.wkb) # ou peut-être simplement 'outline' feat.SetGeometry(geom) layr1.CreateFeature (feat) ds = layr1 = feat = geom = Aucun

Le shapefile est créé, avec tous les fichiers nécessaires, c'est-à-dire aucune erreur. Mais le fichier de formes, lorsqu'il est ouvert dans QGIS, n'a aucune fonctionnalité. Juste une table attributaire construite.

S'il vous plaît aider…

P.S. Toute autre solution en dehors de l'utilisation d'OGR fonctionne également, tant qu'elle peut être codée dans la console Python de QGIS


Quelques remarques car vous mélangez beaucoup de choses ( si vous voulez utiliser votre script en dehors de la console de QGIS, installez le module Python GDAL (osgeo) dans votre installation Python : il est installé dans la version Python de QGIS si vous êtes sous Windows).

1) Il n'y a pas de géométries Shapely dans votre script, seulement

  • Géométries PyQGISQgsPoint(x_min, y_min),…
  • géométries ogrlinelyr = ogr.Geometry(ogr.wkbLineString),…

2)présenterest inutile carlyreest déjà un ogr LineString (et votre création deprésenterdonne des géométries invalides (LineStrings vides = LineString(LineString))

linelyr = ogr.Geometry(ogr.wkbLineString) linelyr.AddPoint(5, 47) linelyr.AddPoint(5, 55) print linelyr.ExportToJson() { "type": "LineString", "coordinates": [ [ 5.0, 47.0 , 0.0 ], [ 5.0, 55.0, 0.0 ] ] } # et out_line = ogr.Geometry(ogr.wkbLineString) out_line.AddGeometry(linelyr) print out_line.ExportToWkt() LINESTRING EMPTY

3) De la même manière, vous n'avez pas besoingeom = ogr.CreateGeometryFromWkb(out_line.wkb)car comme dit,présenterou alorslyresont déjà ogr LineStrings.

3) A la fin du processus, avec ogr, si vous ne fermez pas le shapefile résultant, il reste vide.

Alors:

from osgeo import ogr # create ogr geometry linelyr = ogr.Geometry(ogr.wkbLineString) linelyr.AddPoint(5, 47) linelyr.AddPoint(5, 55) # create the shapefile driver = ogr.GetDriverByName("Esri Shapefile") ds = driver.CreateDataSource("outputlocation.shp") layr1 = ds.CreateLayer(",None, ogr.wkbLineString) # crée le champ layr1.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) # Crée la fonctionnalité et définissez les valeurs defn = layr1.GetLayerDefn() feat = ogr.Feature(defn) feat.SetField('id', 1) feat.SetGeometry(linelyr) layr1.CreateFeature(feat) # ferme le fichier de formes ds.Destroy()

Si vous souhaitez utiliser Shapely :

from shapely.geometry import Point, LineString line = LineString([Point(5,47),Point(5,55)]) # conversion en géométrie ogr linelyr = ogr.CreateGeometryFromWkt(line.wkt) print linelyr.ExportToJson() { "type": "LineString", "coordinates": [ [ 5.0, 47.0, 0.0 ], [ 5.0, 55.0, 0.0 ] ] }

Si vous souhaitez utiliser PyQGIS :

line = QgsGeometry.fromPolyline([QgsPoint(5,47),QgsPoint(5,55)])) # conversion en géométrie ogr linelyr = ogr.CreateGeometryFromWkt(line.exportToWkt()) print linelyr.ExportToJson() { "type" : "LineString", "coordinates": [ [ 5.0, 47.0 ], [ 5.0, 55.0 ] ] }

R comme SIG pour les économistes

La grande majorité des gens utilisent encore ArcGIS pour gérer les données spatiales, qui possède son propre système de stockage de données spatiales 40 appelé shapefile. Il est donc probable que vos collaborateurs utilisent des fichiers de formes. De plus, il existe de nombreuses données SIG en ligne qui ne sont disponibles que sous forme de fichiers de formes. Il est donc important d'apprendre à lire et à écrire des fichiers de formes.

2.3.1 Lire un fichier de formes

Nous pouvons utiliser st_read() pour lire un shapefile. Il lit un fichier de formes, puis transforme les données en un objet sf. Regardons un exemple.

En règle générale, vous avez deux arguments à spécifier pour st_read() . Le premier est dsn , qui est essentiellement le chemin d'accès au dossier dans lequel le fichier de formes que vous souhaitez importer est stocké. Le second est le nom du fichier de formes. Notez que vous n'ajoutez pas l'extension .shp au nom de fichier : nc , pas nc.shp . 41 .

2.3.2 Écriture dans un fichier de formes

L'écriture d'un objet sf en tant que fichier de formes est tout aussi simple. Vous utilisez la fonction st_write(), le premier argument étant le nom de l'objet sf que vous exportez, et le second étant le nom du nouveau shapefile. Par exemple, le code ci-dessous exportera un objet sf appelé nc_loaded en tant que nc2.shp (avec d'autres fichiers de support).

append = FALSE force l'écriture des données lorsqu'un fichier existe déjà avec le même nom. Sans option, cela se produit.

2.3.3 De meilleures alternatives

Maintenant, si votre collaborateur utilise ArcGIS et exige qu'il/elle ait besoin d'un fichier de formes pour son travail, vous pouvez utiliser la commande ci-dessus pour écrire un fichier de formes. Mais, il n'est vraiment pas nécessaire de travailler avec le système de fichiers de formes. L'un des formats de données alternatifs considéré comme supérieur au système de fichiers de formes est GeoPackage 42 , qui surmonte diverses limitations associées au fichier de formes 43 . Contrairement au système de fichiers de formes, il ne produit qu'un seul fichier avec l'extension .gpkg. 44 Notez que les fichiers GeoPackage peuvent également être facilement lus dans ArcGIS. Ainsi, il peut être intéressant de convaincre vos collaborateurs d'arrêter d'utiliser des fichiers de formes et de commencer à utiliser GeoPackage.

Ou mieux encore, si votre collaborateur utilise R (ou s'il n'y a que vous qui allez utiliser les données), enregistrez-le simplement en tant que fichier rds en utilisant saveRDS() , qui peut bien sûr être lu en utilisant readRDS() .

L'utilisation de fichiers rds peut être particulièrement intéressante lorsque l'ensemble de données est volumineux, car les fichiers rds sont généralement plus efficaces en mémoire que les fichiers de formes, consommant moins de mémoire sur votre disque.

Comme vous pouvez le voir ici, c'est un mythe que les jeux de données spatiales doivent être stockés sous forme de fichiers de formes.

Voir ici pour savoir comment les jeux de données spatiales peuvent être stockés dans divers autres formats.↩︎

Lors du stockage d'un jeu de données spatiales, ArcGIS divise les informations en fichiers séparés. Tous ont le même préfixe, mais ont des extensions différentes. Nous disons généralement que nous lisons un fichier de formes, mais nous importons en réalité tous ces fichiers, y compris le fichier de formes avec l'extension .shp. Lorsque vous lisez ces données, vous vous référez simplement au préfixe commun car vous importez vraiment tous les fichiers, pas seulement un fichier .shp.↩︎

Suis-je le seul à être très frustré lorsque votre collaborateur joint 15 fichiers pour trois objets géographiques à un e-mail ? Cela aurait pu être juste trois fichiers utilisant le format GeoPackage.↩︎


En m'inspirant du code d'erreur TypeError: L'objet 'Polygon' n'est pas itérable Je suis parti de l'hypothèse que nous avons besoin d'une sorte d'itérable, comme une liste de polygones. En m'inspirant de cette réponse, j'ai trouvé que la fonction shapely.geometry.MultiPolygon fait le travail. Vous lui passez simplement une liste de polygones. Ajoutez un peu de logique pour n'effectuer cette action que lorsqu'un polygone plutôt qu'un multipolygone est détecté et que nous avons :

C'est une solution plutôt bidon qui imprimera le polygone deux fois, alors sachez si vous décidez plus tard de le rendre transparent ou quelque chose du genre. Alternativement, à la place de [poly, poly], vous pouvez utiliser [poly, some_other_poly_outside_map_area] .


Erreur writeOGR : la création du fichier de sortie a échoué

J'ai eu le même problème et je ne l'ai résolu que lorsque j'ai ajouté un nom complet de mon répertoire et un nom de couche plus un suffixe shp :

symbole pour abréger mon répertoire de sauvegarde. Ne faites pas cela avec writeOGR ou vous obtiendrez également ce message d'erreur. &ndash forlooper 27 novembre 17 à 18:53

J'ai résolu le mien en corrigeant le répertoire dans lequel il enregistrait (en m'assurant qu'il existait)

où save.dir est le répertoire que vous souhaitez enregistrer sous forme de chaîne et filename.save est le nom de fichier sous lequel vous souhaitez qu'il soit enregistré (hors extension)

Je suppose que vous essayez d'écrire sur un fichier existant et que la fonction writeOGR ne le permet pas. Je suppose que c'est un comportement connu de certains pilotes pris en charge par OGR (pour autant que je me souvienne en R comme en python et dans l'API C).

Vous devez vérifier si le fichier existe avant d'écrire et de le supprimer (ou de changer le chemin que vous souhaitez utiliser).

Par exemple ici la première opération d'écriture réussit mais la tentative d'écrasement du fichier échoue avec votre message d'erreur :


Ytdjtkui

Quelle est la chaise représentée dans le tableau de 1889 de Cesare Maccari « Cicerone denuncia Catilina » ?

Comment les images ont-elles été transformées du film en une grande image dans un cadre photo avant la numérisation numérique ?

Un compilateur a-t-il pleinement utilisé la virgule flottante 80 bits ?

Comment pourrions-nous simuler un alunissage maintenant ?

Dualité Tannaka pour les groupes semi-simples

Semi-groupes sans morphismes entre eux

Nombre de permutations sur un Rubik's Cube NxNxN

Le rapport de Mueller a-t-il fourni une base probante pour l'allégation d'ingérence du gouvernement russe dans les élections via les médias sociaux ?

Comment puis-je régler l'ouverture de mon reflex numérique lorsqu'il est fixé à un télescope au lieu d'un objectif ?

Le sort Sphère enflammée peut-il être enfoncé dans plusieurs créatures minuscules qui se trouvent dans le même carré de 1,50 mètre ?

Un collègue a une sonnerie agaçante

Comment comparer deux fichiers différents ligne par ligne sous Unix ?

Comment appelleriez-vous cet étrange appareil métallique qui permet de soulever des personnes ?

Qu'est-ce qu'un "asse" en anglais élisabéthain ?

Les sorciers sont-ils incapables d'utiliser l'option métamagique de sort prudent sur eux-mêmes ?

En termes musicaux, quelles propriétés sont variées par la voix humaine pour produire différents mots/syllabes ?

Combien de fois Arya a-t-elle réellement utilisé Needle ?

Quelles découvertes ont été possibles avec le rejet du positivisme ?

Le domaine Google .dev redirige étrangement vers https

Dans quelle mesure nr est-il sécurisé en tant qu'octets d'arrêt ?

Que veut dire Turing par cette affirmation ?

Comment puis-je empêcher/équilibrer l'attente et le turtling en réponse à la mécanique du temps de recharge

Dissoudre les chaînes de ligne en une seule chaîne - “Aucune géométrie galbée ne peut être créée à partir d'une valeur nulle”

Unicorn Meta Zoo #1 : Pourquoi un autre podcast ?Pourquoi feature.geometry() None dans ma fonction d'expression définie par l'utilisateur ?GDAL/OGR ogr.Layer.Intersection échoue lors de la production de résultats de géométrie mixteEnregistrer les points de départ/fin dans un autre fichier de formes à l'aide de ShapelyWeld individuel segments de ligne dans un LineString en utilisant ShapelyShapely chaîne multiligne pour shapefile en tant que ligne unique Accéder aux données des collections de géométrie Aucune géométrie Shapely peut être créée à partir d'une valeur nulle lors de la dissolution dans Geopandas? AlgorithmCreate Shapely linestring à partir d'une chaîne de coordonnées au format texte

J'ai une couche avec 7000 LineStrings, toutes représentent des itinéraires de bus :

Il semble que toutes les lignes de bus soient contiguës, mais je n'en suis pas sûr.
J'essaie d'utiliser python shapely pour dissoudre toutes ces LineStrings mais j'obtiens les erreurs suivantes :


TopologyException : intersection sans nœud trouvée entre LINESTRING (193929 -48233.6, 193930 -48234) et LINESTRING (193930 -48233.8, 193930 -48234) à 193929.98210726795 -48233.983282576017
.
ValueError : aucune géométrie Shapely ne peut être créée à partir d'une valeur nulle


J'essaie de comprendre si la TopologyException est critique et pourquoi j'obtiens l'erreur après cela. Lors de l'impression des géométries, je ne vois pas de valeurs nulles ou de données manquantes.

D'autres articles traitent des polygones, mais avec une chaîne de lignes, un tampon n'est pas une solution applicable.

Il s'agit en fait d'un problème GEOS lié à des coordonnées ayant une fausse précision. Regardez la fonction snap pour une solution possible.

J'ai une couche avec 7000 LineStrings, toutes représentent des itinéraires de bus :

Il semble que toutes les lignes de bus soient contiguës, mais je n'en suis pas sûr.
J'essaie d'utiliser python shapely pour dissoudre toutes ces LineStrings mais j'obtiens les erreurs suivantes :


TopologyException : intersection sans nœud trouvée entre LINESTRING (193929 -48233.6, 193930 -48234) et LINESTRING (193930 -48233.8, 193930 -48234) à 193929.98210726795 -48233.983282576017
.
ValueError : aucune géométrie Shapely ne peut être créée à partir d'une valeur nulle


J'essaie de comprendre si la TopologyException est critique et pourquoi j'obtiens l'erreur après cela. Lors de l'impression des géométries, je ne vois pas de valeurs nulles ou de données manquantes.

D'autres articles traitent des polygones, mais avec une chaîne de lignes, un tampon n'est pas une solution applicable.

Il s'agit en fait d'un problème GEOS lié à des coordonnées ayant une fausse précision. Regardez la fonction snap pour une solution possible.

J'ai une couche avec 7000 LineStrings, toutes représentent des itinéraires de bus :

Il semble que toutes les lignes de bus soient contiguës, mais je n'en suis pas sûr.
J'essaie d'utiliser python shapely pour dissoudre toutes ces LineStrings mais j'obtiens les erreurs suivantes :


TopologyException : intersection sans nœud trouvée entre LINESTRING (193929 -48233.6, 193930 -48234) et LINESTRING (193930 -48233.8, 193930 -48234) à 193929.98210726795 -48233.983282576017
.
ValueError : aucune géométrie Shapely ne peut être créée à partir d'une valeur nulle


J'essaie de comprendre si la TopologyException est critique et pourquoi j'obtiens l'erreur après cela. Lors de l'impression des géométries, je ne vois pas de valeurs nulles ou de données manquantes.

D'autres articles traitent des polygones, mais avec une chaîne de lignes, un tampon n'est pas une solution applicable.

J'ai une couche avec 7000 LineStrings, toutes représentent des itinéraires de bus :

Il semble que toutes les lignes de bus soient contiguës, mais je n'en suis pas sûr.
J'essaie d'utiliser python shapely pour dissoudre toutes ces LineStrings mais j'obtiens les erreurs suivantes :


TopologyException : intersection sans nœud trouvée entre LINESTRING (193929 -48233.6, 193930 -48234) et LINESTRING (193930 -48233.8, 193930 -48234) à 193929.98210726795 -48233.983282576017
.
ValueError : aucune géométrie Shapely ne peut être créée à partir d'une valeur nulle


J'essaie de comprendre si la TopologyException est critique et pourquoi j'obtiens l'erreur après cela. Lors de l'impression des géométries, je ne vois pas de valeurs nulles ou de données manquantes.

D'autres articles traitent des polygones, mais avec une chaîne de lignes, un tampon n'est pas une solution applicable.

Il s'agit en fait d'un problème GEOS lié à des coordonnées ayant une fausse précision. Regardez la fonction snap pour une solution possible.

Il s'agit en fait d'un problème GEOS lié aux coordonnées ayant une précision erronée. Regardez la fonction snap pour une solution possible.

Il s'agit en fait d'un problème GEOS lié à des coordonnées ayant une fausse précision. Regardez la fonction snap pour une solution possible.

Il s'agit en fait d'un problème GEOS lié à des coordonnées ayant une fausse précision. Regardez la fonction snap pour une solution possible.


Samedi 4 décembre 2010

Rasterisation des fichiers de formes

La conversion d'un fichier de formes en image a deux utilisations courantes. Le premier concerne les serveurs de cartographie Web. Toutes les données de la carte sont fusionnées en une image qui est ensuite facultativement mise en mosaïque et mise en cache à différentes échelles. Cette méthode est la façon dont Google Maps, ESRI ArcGIS Server et UMN Mapserver fonctionnent tous. UMN Mapserver inclut même un utilitaire de ligne de commande appelé "Shp2Image" qui convertit son fichier de configuration "mapscript" en une image pour un test rapide. La deuxième raison courante pour convertir un fichier de formes en image est de l'utiliser comme masque pour découper des images de télédétection. Dans les deux cas, la plupart des progiciels géospatiaux gèrent ces opérations pour vous en coulisses.

Le script très simple ci-dessous vous montre comment pixelliser un fichier de formes à l'aide de Python Shapefile Library (PSL) et de Python Imaging Library (PIL). PIL est une bibliothèque très ancienne et bien développée, créée à l'origine pour traiter les images de télédétection, mais elle n'a absolument aucune capacité spatiale. Ce qu'il a, c'est la capacité de lire et d'écrire plusieurs formats d'image et peut gérer de très grandes images. Il dispose également d'une API qui vous permet d'importer et d'exporter facilement des données vers et depuis d'autres bibliothèques à l'aide de chaînes et de tableaux python. Le module PIL ImageDraw fournit un moyen facile de dessiner sur un canevas d'image.

Le script suivant lit dans un fichier de formes, saisit les points du premier et unique polygone, les dessine sur une image, puis enregistre l'image en tant que fichier PNG avec un fichier mondial .pgw pour en faire une image géospatiale. La plupart des packages SIG modernes gèrent les images PNG, mais vous pouvez tout aussi facilement changer le fichier et l'extension worldfile en jpg et jgw respectivement pour une compatibilité encore meilleure. Comme d'habitude, j'ai créé des variables minimales pour garder le code court et aussi facile à comprendre que possible.

Bien sûr, vous aurez également besoin de la bibliothèque Python Shapefile que vous trouverez ici et de la dernière version de la bibliothèque d'imagerie Python à partir d'ici.

L'image créée par ce script est présentée en haut de cet article.

L'idée d'utiliser un shapefile comme masque d'écrêtage pour une image peut être réalisée avec GDAL. L'API python pour GDAL comprend l'intégration avec le célèbre package Python Numeric (NumPy) à l'aide d'un module appelé "gdalnumeric". gdalnumeric et PIL contiennent les méthodes "tostring" et "fromstring" qui vous permettent de déplacer les données d'image entre les packages. GDAL et NumPy facilitent la gestion des données géospatiales sous forme de tableaux numériques et l'API de PIL facilite grandement la création d'un masque de découpage de polygone.

Je couvrirai l'utilisation de PIL, GDAL, NumPy et PSL ensemble dans un prochain article. Je vais également montrer un moyen d'effectuer l'opération ci-dessus à l'aide de Python pur.


2 réponses 2

Fournir le exact message de la JournalERRORLOG fichier serait très utile car il existe à la fois plusieurs AppDomains et plusieurs raisons pour lesquelles les AppDomains sont déchargés.

En ce qui concerne les différents AppDomains, il existe des AppDomains créés pour des fonctionnalités intégrées basées sur CLR, comme celui qui apparaît dans le maître lorsque certaines fonctions (par exemple FORMAT ) et/ou certains types (par exemple GEOMETRY ) sont utilisés. Et il y a des AppDomains créés dans les bases de données utilisateur lors de l'accès au code SQLCLR personnalisé, situé dans les assemblages que vous avez créés.

Le déchargement des AppDomains "système" ne devrait être, au pire, un problème de performances que s'il se produit assez fréquemment. Si cela ne se produit qu'occasionnellement, il ne s'agit en réalité que d'une gêne.

Le déchargement des AppDomains « utilisateurs » a le potentiel de provoquer des erreurs et/ou un comportement imprévisible si le code SQLCLR personnalisé utilise la mémoire partagée via des variables de classe statiques.

En ce qui concerne les différentes raisons pour lesquelles AppDomains est déchargé, cela peut être dû à l'exécution de quelque chose comme :

ce qui se traduit par un message de :

AppDomain xx (master.sys[runtime].yy) est marqué pour le déchargement en raison d'opérations CLR (Common Language Runtime) ou DDL (Security Data Definition Language).

Une raison plus courante pour laquelle AppDomains est déchargé, et plus probablement le sujet de cette question, est due à la « pression de la mémoire ». La pression de la mémoire se produit lorsque la quantité de mémoire physique disponible diminue et est utilisée par les applications comme indicateur pour libérer de la mémoire de manière plus agressive. SQL Server libère de la mémoire en effaçant les éléments du cache du plan et en déchargeant AppDomains.

Les causes de la pression de la mémoire ne sont pas nécessairement l'utilisation de fonctionnalités basées sur CLR dans SQL Server : tout ce qui s'exécute sur le système, qu'il soit interne à SQL Server ou externe et non lié à SQL Server, peut utiliser de la mémoire et provoquer une pression de mémoire. Pour plus d'informations sur la « pression de la mémoire », veuillez consulter l'article MSDN : Planifier les composants internes du cache.

D'après les informations fournies dans Mise à jour 3 dans la question :

ce script ci-dessous ne reproduit PAS le problème, --seul ogr2ogr.exe pour télécharger WellKnownText/WKT sur SQLServer le fait.

il semblerait que le ogr2ogr.exe Le programme saisit en quelque sorte beaucoup de mémoire et ne la libère pas assez rapidement (ou peut-être pas du tout ?). Cela peut être dû à plusieurs raisons, y compris de mauvaises pratiques de programmation, mais il est difficile de réduire le nombre sans pouvoir voir le code source. Et même si nous pouvons voir le code source, il n'y a pas grand-chose à faire à moins que ce ne soit Open Source et que nous puissions apporter des modifications et le recompiler. Ou peut-être que ce problème peut être signalé au(x) développeur(s) de ogr2ogr.exe qui pourrait être en mesure de le réparer.

P.S. Le code de test dans la Question n'est pas exactement représentatif de ce qui est décrit dans la Question comme l'opération en cours d'exécution :

il y a environ 1 000 000 d'insertions, qui sont engagées dans une transaction de 200 insertions chacune

car il n'y a qu'une seule instruction pour chaque transaction dans l'exemple de code (et donc aucune raison réelle d'avoir même une transaction explicite).

Afin de tester de plus près le comportement décrit, utilisez l'adaptation suivante du code de test publié :

REMARQUE: Si vous annulez la requête, vous devez exécuter manuellement le dernier bloc IF pour vous assurer qu'aucune transaction n'est laissée ouverte.

Sur mon système de test (qui n'a pratiquement pas de mémoire libre car je l'utilise également pour SSMS, Visual Studio, etc.) le survived_memory_kb le champ de sys.dm_clr_appdomains n'a jamais dépassé 1 . (et je n'utiliserais pas le total_allocated_memory_kb comme une métrique fiable puisqu'il s'agit d'un total de toutes les allocations de mémoire effectuées, et non d'un actuel valeur d'attribution.)

De nouvelles informations fournies indiquent que ogr2ogr.exe s'exécute sur une machine différente de SQL Server et se connecte via TCP. Cela suggère que le problème pourrait être lié aux connexions (le pooling de connexions est-il utilisé ? les transactions sont-elles gérées sur une seule connexion ou une nouvelle connexion à chaque fois ? si de nouvelles connexions, l'application libère-t-elle l'objet de connexion afin que la connexion fermé?).

OU la consommation de mémoire pourrait être liée à la manière dont les requêtes INSERT sont soumises : une requête paramétrée aurait un seul plan dans le cache et serait réutilisée pour chaque INSERT, mais si les requêtes sont ad hoc (c'est-à-dire que la nouvelle valeur est en cours concaténés dans chaque INSERT), cela pourrait provoquer un gonflement du cache de plan. Les ressources suivantes peuvent aider à enquêter :

Le premier lien montre une commande DBCC pour vider le cache du plan dans une seule base de données (un peu plus sûr que de vider le cache pour l'ensemble de l'instance) :

Mais cette commande DBCC ne semble pas être documentée autrement.

Un test assez simple serait d'exécuter ogr2ogr.exe sur le système de test et pendant son exécution, exécutez DBCC FLUSHPROCINDB (<dbid>) plusieurs fois et voyez si la mémoire totale consommée atteint ce que vous avez vu.

J'ai confirmé que du SQL ad hoc (c'est-à-dire non paramétré) est utilisé, au moins dans la v1.11, à partir de la ligne 1041 :

Et il semble que la prise en charge des téléchargements en masse ait été ajoutée dans la v2.0. Donc, vous devez probablement mettre à niveau vers la dernière version (actuellement 2.1).

Il m'est venu à l'esprit que si le problème concerne Plan Cache Bloat, alors le code de test (même mon adaptation de celui-ci ci-dessus) ne s'applique pas car il réutilise la même instruction INSERT à chaque fois et n'augmente donc pas le nombre de plans dans le cache. Dans cet esprit, j'ai adapté le code de test pour utiliser Dynamic SQL pour modifier l'instruction INSERT à chaque fois :

Regardez les chiffres augmenter via :

Je n'étais toujours pas en mesure de forcer le déchargement de l'AppDomain dans le maître, mais je me rapprochais définitivement.


Samedi 4 décembre 2010

Rasterisation des fichiers de formes

La conversion d'un fichier de formes en image a deux utilisations courantes. Le premier concerne les serveurs de cartographie Web. Toutes les données de la carte sont fusionnées en une image qui est ensuite facultativement mise en mosaïque et mise en cache à différentes échelles. Cette méthode est la façon dont Google Maps, ESRI ArcGIS Server et UMN Mapserver fonctionnent tous. UMN Mapserver inclut même un utilitaire de ligne de commande appelé "Shp2Image" qui convertit son fichier de configuration "mapscript" en une image pour un test rapide. La deuxième raison courante de convertir un fichier de formes en image est de l'utiliser comme masque pour découper des images de télédétection. Dans les deux cas, la plupart des progiciels géospatiaux gèrent ces opérations pour vous en coulisses.

Le script très simple ci-dessous vous montre comment pixelliser un fichier de formes à l'aide de Python Shapefile Library (PSL) et de Python Imaging Library (PIL). PIL est une bibliothèque très ancienne et bien développée, créée à l'origine pour traiter les images de télédétection, mais elle n'a absolument aucune capacité spatiale. Ce qu'il a, c'est la capacité de lire et d'écrire plusieurs formats d'image et peut gérer de très grandes images. Il dispose également d'une API qui vous permet d'importer et d'exporter facilement des données vers et depuis d'autres bibliothèques à l'aide de chaînes et de tableaux python. Le module PIL ImageDraw fournit un moyen facile de dessiner sur un canevas d'image.

Le script suivant lit dans un fichier de formes, saisit les points du premier et unique polygone, les dessine sur une image, puis enregistre l'image en tant que fichier PNG avec un fichier mondial .pgw pour en faire une image géospatiale. La plupart des packages SIG modernes gèrent les images PNG, mais vous pouvez tout aussi facilement changer le fichier et l'extension worldfile en jpg et jgw respectivement pour une compatibilité encore meilleure. Comme d'habitude, j'ai créé des variables minimales pour garder le code court et aussi facile à comprendre que possible.

Bien sûr, vous aurez également besoin de la bibliothèque Python Shapefile que vous trouverez ici et de la dernière version de la bibliothèque d'imagerie Python à partir d'ici.

L'image créée par ce script est présentée en haut de cet article.

L'idée d'utiliser un shapefile comme masque d'écrêtage pour une image peut être réalisée avec GDAL. L'API python pour GDAL comprend l'intégration avec le célèbre package Python Numeric (NumPy) à l'aide d'un module appelé "gdalnumeric". gdalnumeric et PIL contiennent les méthodes "tostring" et "fromstring" qui vous permettent de déplacer les données d'image entre les packages. GDAL et NumPy facilitent la gestion des données géospatiales sous forme de tableaux numériques et l'API de PIL facilite grandement la création d'un masque de découpage de polygone.

Je couvrirai l'utilisation de PIL, GDAL, NumPy et PSL ensemble dans un prochain article. Je vais également montrer un moyen d'effectuer l'opération ci-dessus à l'aide de Python pur.


OSGP : créer des points à un intervalle de distance spécifié le long d'une ligne

Ce flux de travail avec Python en utilisant OGR et Galbé crée des points le long d'une ligne à un intervalle de distance spécifié. Je utilise le FichierGDB pilote ici pour lire et écrire des données, mais vous pouvez les modifier en fonction de vos besoins. Le code est commenté…

Cela créera une classe d'entités ponctuelles avec un seul attribut contenant la valeur de distance depuis le début de la ligne.

Veuillez laisser des commentaires constructifs si vous pensez que cela peut être amélioré ou si cela a fonctionné pour vous.

Voir également Créer des repères de chaînage pour créer des lignes perpendiculaires traversant la ligne principale à des distances spécifiées.


2 réponses 2

Vous pouvez utiliser le da.UpdateCursor avec le jeton [email protected] :

Dans le cas où l'OP ou un futur lecteur peut utiliser des géopandas au lieu d'arcpy, procédez comme suit :

@BERA J'ai oublié d'ajouter la conversion de coordonnées. Mais je suis bien conscient que l'OP voulait arcpy . Si vous lisez les prémisses de ma réponse, vous verrez que je l'ai clairement reconnu. Cependant, cela pourrait être un cas de problème X-Y pour un lecteur différent à l'avenir, auquel cas les géopandas pourraient leur faciliter la vie.

Dans epsg:4326 le premier axe (x) est lat, cependant

@mmtoken, Avec geopandas/shapely, cet ordre n'a pas d'importance. Latitude, puis longitude peut-être comment nous disons ces valeurs, mais la latitude est toujours la direction y. Lorsque je fais cela avec un fichier de forme près de Portland, OR, USA, j'obtiens des valeurs de longitude autour de -122,75 et des valeurs de latitude autour de 45,57, ce à quoi je m'attends.