All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gov.nasa.worldwind.formats.vpf.GeoSymStyleProvider Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 United States Government as represented by the Administrator of the
 * National Aeronautics and Space Administration.
 * All Rights Reserved.
 */
package gov.nasa.worldwind.formats.vpf;

import gov.nasa.worldwind.exception.WWRuntimeException;
import gov.nasa.worldwind.render.Material;
import gov.nasa.worldwind.util.*;

import java.awt.*;
import java.io.*;
import java.util.*;

/**
 * @author Patrick Murris
 * @version $Id: GeoSymStyleProvider.java 1171 2013-02-11 21:45:02Z dcollins $
 */
public class GeoSymStyleProvider
{
    //private static String TYPE_POINT = "Point";
    private static String TYPE_LINE_PLAIN = "LinePlain";
    private static String TYPE_LINE_COMPLEX = "LineComplex";
    private static String TYPE_AREA_PLAIN = "AreaPlain";
    private static String TYPE_AREA_PATTERN = "AreaPattern";

    // CSV columns
    private static final int CODE = 0;
    private static final int TYPE = 1;
    private static final int LINE_WIDTH = 2;
    private static final int LINE_COLOR = 3;
    private static final int STIPPLE_PATTERN = 4;
    private static final int STIPPLE_FACTOR = 5;
    private static final int FILL_COLOR = 6;

    private Map attributes;
    private double lineWidthFactor = 3d; // mm to pixels

    public GeoSymStyleProvider(String filePath)
    {
        try
        {
            this.loadStylesFromFile(filePath);
        }
        catch (IOException e)
        {
            String message = Logging.getMessage("generic.ExceptionWhileReading", filePath);
            Logging.logger().severe(message);
            throw new WWRuntimeException(message);
        }
    }

    protected void loadStylesFromFile(String filePath) throws IOException
    {
        InputStream inputStream = WWIO.openFileOrResourceStream(filePath, this.getClass());
        if (inputStream == null)
        {
            String message = Logging.getMessage("generic.ExceptionWhileReading", filePath);
            Logging.logger().severe(message);
            throw new WWRuntimeException(message);
        }

        this.attributes = new HashMap();
        Scanner scanner = new Scanner(inputStream);
        while (scanner.hasNextLine())
        {
            String s = scanner.nextLine().trim();
            if (s.length() == 0 || s.startsWith("#"))
                continue;

            String[] tokens = s.split(",");
            String code = tokens[0];
            VPFSymbolAttributes attr = getAttributes(tokens);
            if (attr != null)
                this.attributes.put(code, attr);
        }

        inputStream.close();
    }

    private VPFSymbolAttributes getAttributes(String[] tokens)
    {
        VPFSymbolAttributes attr = new VPFSymbolAttributes(null, null);
        if (tokens[TYPE].equals(TYPE_AREA_PLAIN) || tokens[TYPE].equals(TYPE_AREA_PATTERN))
        {
            attr.setInteriorMaterial(new Material(Color.decode(tokens[FILL_COLOR])));
            if (tokens[TYPE].equals(TYPE_AREA_PATTERN))
            {
                attr.setImageSource(tokens[CODE]);
            }
        }
        else if (tokens[TYPE].equals(TYPE_LINE_PLAIN) || tokens[TYPE].equals(TYPE_LINE_COMPLEX))
        {
            attr.setOutlineMaterial(new Material(Color.decode(tokens[LINE_COLOR])));
            attr.setOutlineWidth(Double.parseDouble(tokens[LINE_WIDTH]) * this.lineWidthFactor);
            if (tokens[TYPE].equals(TYPE_LINE_COMPLEX))
            {
                attr.setOutlineStipplePattern(Integer.decode(tokens[STIPPLE_PATTERN]).shortValue());
                attr.setOutlineStippleFactor(Integer.parseInt(tokens[STIPPLE_FACTOR]));
            }
        }

        return attr;
    }

    public VPFSymbolAttributes getAttributes(String code)
    {
        return this.attributes.get(code);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy