Review improvements DXF module.
-------------------------------

                 Key: GEOT-3800
                 URL: https://jira.codehaus.org/browse/GEOT-3800
             Project: GeoTools
          Issue Type: Improvement
          Components: unsupported
            Reporter: Roy Braam
            Assignee: Roy Braam
            Priority: Minor


Hello,

Many people have been asking about the DXF-module lately. I have been using it 
for a quite long time in our company's internal project. For this purpose I 
have made many customizations for the dxf-module. These include
 - invertion of coordinates: eg. x in dxf becomes y in the geometries
 - much better functioning text (with unicode support)
 - support for UCS origo not in 0,0,0
 - simpler process for reading the file and setting coordinate system
 - support for closed polylines = polygons
 - better support for ellipses
 - block insertion points work better now

There's still plenty to do and the code is not the most clean, but my version 
meets more or less our requirements all ready.

Here is some useful sample code. The key to everything is to use the automatic 
style.

Creating the feature source:

File file = new File(filename);
DXFDataStoreFactory factory = new DXFDataStoreFactory();
Map map = new HashMap();
map.put(DXFDataStoreFactory.PARAM_SRS.key, CRS.decode("EPSG:xxxx"));
map.put(DXFDataStoreFactory.PARAM_URL.key, file.toURI().toURL());
store = factory.createDataStore(map);
featureSource = store.getFeatureSource("");


Automatically creating the style based on the dxf itself:


    protected FeatureTypeStyle createLineStyle() {
        org.opengis.filter.expression.Expression color;
        color = new AttributeExpressionImpl("color");

        Stroke stroke = styleFactory.createStroke(
                color, new AttributeExpressionImpl("thickness"));
        LineSymbolizer sym = styleFactory.createLineSymbolizer(stroke, null);
        org.geotools.styling.Rule rule = styleFactory.createRule();
        rule.setFilter(filterFactory.notEqual(new 
AttributeExpressionImpl("visible"),
                filterFactory.literal(0)));
        rule.setElseFilter(true);
        rule.symbolizers().add(sym);
        return styleFactory.createFeatureTypeStyle(new 
org.geotools.styling.Rule[]{rule});        
    }
       
    protected FeatureTypeStyle createPolygonStyle() {
        org.opengis.filter.expression.Expression color;
        color = new AttributeExpressionImpl("color");

        Stroke stroke = styleFactory.createStroke(color,
                new AttributeExpressionImpl("thickness"));
        PolygonSymbolizer sym = styleFactory.createPolygonSymbolizer(stroke, 
null, null);
        org.geotools.styling.Rule rule = styleFactory.createRule();
        rule.setFilter(filterFactory.notEqual(new 
AttributeExpressionImpl("visible"),
                filterFactory.literal(0)));
        rule.setElseFilter(true);
        rule.symbolizers().add(sym);
        return styleFactory.createFeatureTypeStyle(new 
org.geotools.styling.Rule[]{rule});        
    }
   
    protected FeatureTypeStyle createTextStyle() {
        org.opengis.filter.expression.Expression color;
        color = new AttributeExpressionImpl("color");

        StyleBuilder styleBuilder = new StyleBuilder();
       
        AnchorPoint anchor = new AnchorPoint();
        anchor.setAnchorPointX(new AttributeExpressionImpl("align1"));
        anchor.setAnchorPointY(new AttributeExpressionImpl("align2"));
        Fill fill = styleFactory.createFill(color);
        PointPlacementImpl labelPlacement = new 
PointPlacementImpl(filterFactory);
        
labelPlacement.setRotation(filterFactory.multiply(filterFactory.literal(-1), 
new AttributeExpressionImpl("rotation")));
        labelPlacement.setAnchorPoint(anchor);
        labelPlacement.setDisplacement(Displacement.DEFAULT);
       
        Font font = styleBuilder.createFont(filterFactory.literal("SansSerif"),
                filterFactory.literal(1), filterFactory.literal(1),
                new AttributeExpressionImpl("height"));

        TextSymbolizer sym = styleFactory.createTextSymbolizer(fill,
                new Font[]{font}, null,
                new AttributeExpressionImpl("text"), labelPlacement, null);
        sym.setUnitOfMeasure(SI.METRE);        
        org.geotools.styling.Rule rule = styleFactory.createRule();
        rule.setFilter(filterFactory.notEqual(new 
AttributeExpressionImpl("visible"),
                filterFactory.literal(0)));
        rule.setElseFilter(true);
        rule.symbolizers().add(sym);
        return styleFactory.createFeatureTypeStyle(new 
org.geotools.styling.Rule[]{rule});        
    }
   
    protected Style createStyle() {
        Style s = styleFactory.createStyle();
        s.featureTypeStyles().add(createLineStyle());
        s.featureTypeStyles().add(createPolygonStyle());
        s.featureTypeStyles().add(createTextStyle());
        return s;
    }


The generated style handles font heights, colors, line widths etc.


You can download my changed version of the module (including the jar in target) 
here:
http://www.sunela.eu/maku/gt-2.7-dxf-2011-08-17.zip

And the diff is here:
http://www.sunela.eu/maku/gt-2.7-dxf-2011-08-17.diff

Regards,
        Markus 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
Get a FREE DOWNLOAD! and learn more about uberSVN rich system, 
user administration capabilities and model configuration. Take 
the hassle out of deploying and managing Subversion and the 
tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2
_______________________________________________
Geotools-devel mailing list
Geotools-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to