Subversion Repositories mkgmap

Rev

Rev 4175 | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed

package uk.me.parabola.mkgmap.osmstyle.function;

import java.util.Locale;

import uk.me.parabola.imgfmt.app.Coord;
import uk.me.parabola.mkgmap.reader.osm.Element;
import uk.me.parabola.mkgmap.reader.osm.Way;

/**
 * Calculates the area size of a polygon in garmin units ^ 2.
 *
 * if orderByDecreasingArea then the area of the polygon has already been
 * calculated and we use it here.
 * To be totally consistent, ie no possible difference to mkgmap behaviour when
 * --order-by-decreasing-area is not set, this flag should be set from the option;
 * However it is now considered that 'fullArea' is what the user might expect, rather
 * than various different values for the same original because of clipping and cutting to
 * expose holes.
 *
 * @author WanMil
 */

public class AreaSizeFunction extends CachedFunction {

        public AreaSizeFunction() {
                super(null);
        }

        protected String calcImpl(Element el) {
                if (el instanceof Way) {
                        Way w = (Way)el;
                        // a non closed way has size 0
                        if (!w.hasEqualEndPoints()) {
                                return "0";
                        }
                        long fullArea = w.getFullArea();
                        if (fullArea == Long.MAX_VALUE)
                                return "0";
                        //  convert from high prec to value in map units
                        double areaSize = (double) fullArea / (2 * (1<<Coord.DELTA_SHIFT) * (1<<Coord.DELTA_SHIFT));
                        return String.format(Locale.US, "%.3f", Math.abs(areaSize));
                }
                return null;
        }

        @Override
        public String getName() {
                return "area_size";
        }
       
        @Override
        public boolean supportsWay() {
                return true;
        }

        @Override
        public int getComplexity() {
                return 2;
        }
}