2010-01-12 13 views
0

J'ai un fichier (* .shp utilisé dans GIS) qui contient la collection de polygones et peut-être d'autres objets vectoriels (mais les polygones sont les plus importants pour moi). Je dois enlever les objets non imprimables.Vérification si l'objet vectoriel sera visible à l'impression avec dpi donné et taille d'impression

Je ne sais pas quels critères ont choisi. Je pense que supprimer des objets avec une petite longueur de bordure serait préférable, puis supprimer des objets avec une petite surface (de sorte que les objets longs se réduisent à la ligne). Mais peut-être existe-t-il un algorithme spécial pour cela? En d'autres termes, je ne souhaite trouver que les objets visibles à un niveau de zoom donné.

Répondre

1

C'est assez simple. Comme vous ne parler aucune langue considèrent le pseudocode

drawRect = myDevice.GetDrawRect(); 
for(oneShape in allShapes) 
{ 
    shapeRect = oneShape.GetRect() 
    if(! drawRect.Contains(shapeRect)) 
     oneShape.MarkAsInvisible(); 
    else 
     oneShape.Draw(); 
} 

suivant la fonction contains() ressemblerait à quelque chose comme ça, en supposant que les valeurs y augmentent de bas en haut:

bool Rect::Contains(OtherRect) 

{ 
    if(left <= OtherRect.right && 
     right >= OtherRect.left && 
     top >= OtherRect.bottom && 
     bottom <= OtherRect.top) 
     return true 

    return false; 
} 
+0

Merci. Mais si j'ai bien compris, ce code vérifie seulement si oneShape appartient à une région particulière. Je pense que "en d'autres termes" était déroutant. Bien sûr, votre code est important pour atteindre cette chauve-souris, je veux aussi enlever les petits objets. Par exemple, à faible niveau de zoom, je veux montrer uniquement les continents et au niveau supérieur, je veux montrer les villes. Cependant je ne veux pas décider arbitrairement ce qui sera visible à un niveau de zoom donné. Parce que si quelqu'un l'imprime en haute résolution, il devrait être autorisé à imprimer des pays à des villes à faible niveau de zoom (et utiliser une loupe peut-être). –

1

Les polygones pour éliminer dépendrait de la dpi de l'image que vous souhaitez créer. Si une ligne ne remplit qu'un pixel, elle doit être éliminée ou remplacée par une représentation ponctuelle. Bien sûr, cela sera effectué par la largeur de la ligne. Beaucoup de ces problèmes seraient résolus en utilisant une bibliothèque de cartographie dédiée telle que mapnik.org

+0

C'est exactement ce dont j'ai besoin. Mais je préfère utiliser Geotools (www.geotools.org) car je suis plus en Java qu'en C++. Malheureusement, je ne sais pas comment le faire dans Geotools. –