Suite

Problème avec l'épaisseur des lignes de contour dans les niveaux de zoom plus importants

Problème avec l'épaisseur des lignes de contour dans les niveaux de zoom plus importants


Je suis un utilisateur débutant des outils GDAL. J'aimerais pixelliser les lignes de contour dans un fichier Tiff (par exemple une telle région: N47E006), tout fonctionne pour des niveaux de zoom assez petits, par exemple. 10… mais le problème est avec des niveaux de zoom plus importants… les lignes de contour sont très "pixelisées" et pour les montagnes, les lignes de contour noires couvrent presque toute l'image Tiff. Existe-t-il un moyen de créer des lignes de contour plus fines pour des niveaux de zoom plus importants, par ex. 15-18 ?

J'utilise ceci pour générer des lignes de contour (10m):

gdal_contour -a elev -i 10 input.tif contours.shp

ceci pour la rastérisation :

gdal_rasterize -b 1 -b 2 -b 3 -burn 0 -burn 0 -burn 0 -l contours contours.shp input.tif

et ceci pour la découpe en tuiles :

gdal2tiles.py -z 15-18 -n -e -w openlayers input.tif out_dir

Les largeurs de ligne sont déterminées au rastérisation marcher

Autre que des lignes dans un vecteur image (par exemple SVG), lignes en vecteur Les données n'ont pas de largeur inhérente. Ce sont des lignes au sens mathématique, pas au sens graphique. Je suppose que c'est aussi le cas pourcontours.shp, la sortie du recherche de contour étape avecgdal_contour.

Ainsi, la largeur de ligne est déterminée par le rastérisation marcher.

(Carrelage, une fois terminé après la rastérisation comme ici, ne peut pas connaître les données vectorielles d'origine et ne peut donc pas contrôler les largeurs de ligne. Cela les influencera cependant par la mise à l'échelle de l'image raster, conduisant à l'alias que vous décrivez.)

Contrôle de la largeur de ligne

Comme gdal_rasterizene semble pas comporter de paramètres directement liés à celui-ci, à l'exception de(graver "tous les pixels touchés par des lignes ou des polygones [… ], pas seulement ceux sur le chemin de rendu de ligne"), je suppose qu'il utilise toujours une largeur de ligne d'un pixel.

Nous ne pouvons donc pas contrôler directement la largeur de la ligne.

Mais même si nous le pouvions, le définir sur des valeurs inférieures au pixel ne nous ferait pas beaucoup de bien : on ne peut pas colorer un demi-pixel. Et même sigdal_rasterizeétait intelligent et ferait un peu d'anticrénelage, mélangeant la couleur/valeur de l'image d'origine avec la couleur/valeur de gravure, la mise à l'échelle de l'image raster dans l'étape de mosaïque suivante introduirait toujours l'aliasing que vous décrivez.

Contrôle indirect

J'espère que nous pourrons éviter cet effet indirectement en supprimant de l'étape de la mosaïque le besoin d'une mise à l'échelle en fournissant une image déjà dans la résolution correcte de pixel par unité cartographique pourgdal2tiles.py. (Comme vous travaillez probablement en projection Mercator, l'unité cartographique ne sera ni le mètre ni le degré, mais cela ne doit pas nous concerner.)

Bien sûr, si nous prenons juste le résultat degdal_rasterizeet redimensionnez-le nous-mêmes, nous n'avons rien gagné, car nous introduisions nous-mêmes l'aliasing. Au lieu de cela, nous devons graver les contours dans une image à plus haute résolution dès l'étape de rastérisation.

Contrôle de la résolution

Je supposegdal_rasterize, lorsqu'on lui donne un fichier existant en tant que fichier de sortie, modifiera simplement les valeurs (couleurs) des pixels affectés et Ne fera pas modifier la taille/résolution de cette image préexistante. Ainsi je ne pense pas que le-troption proposée par fluidmotion ou-tsoption aurait un effet. (Je n'ai pas essayé, cependant.)

Je vous propose donc soit

  • laissergdal_rasterizegénérer l'image, en utilisant le-trou alors-tsoption

    • (qui peut recréer ou non le géo-référencement nécessaire pour le carrelage)

    ou alors

  • redimensionnez vous-même le fichier cible avant de le fournir àgdal_rasterize
    • (assurez-vous de garder le géo-référencement cohérent)

Choisir la bonne résolution

La zone couverte par une tuile de niveau de zoomNsera couvert par 4 (2x2) tuiles de niveau de zoomN+1. Ainsi, pour chaque incrément du niveau de zoom, vous devez doubler la résolution pour les directions x et y.


je ne sais pas quelle est la résolution par défaut pour gdal_translate si aucune n'est donnée, mais vous pouvez essayer de spécifier une résolution en fonction du niveau de zoom que vous désirez selon la documentation -

-tr xres ans :

(GDAL >= 1.8.0) Définir la résolution cible. Les valeurs doivent être exprimées en unités géoréférencées. Les deux doivent être des valeurs positives