com.esri.geoevent.solutions.processor.geometry.RangeFanProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.esri.geoevent.solutions.processor.geometry.RangeFanProcessor.java

Source

package com.esri.geoevent.solutions.processor.geometry;

/*
 * #%L
 * Esri :: AGES :: Solutions :: Processor :: Geometry
 * $Id:$
 * $HeadURL:$
 * %%
 * Copyright (C) 2013 - 2014 Esri
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.esri.core.geometry.GeometryEngine;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.Polygon;
import com.esri.core.geometry.SpatialReference;
import com.esri.ges.core.component.ComponentException;
import com.esri.ges.core.geoevent.GeoEvent;

import com.esri.ges.manager.geoeventdefinition.GeoEventDefinitionManager;
import com.esri.ges.processor.GeoEventProcessorBase;
import com.esri.ges.processor.GeoEventProcessorDefinition;
import com.esri.ges.spatial.GeometryException;
import com.esri.ges.spatial.Spatial;
import com.esri.core.geometry.Geometry;

public class RangeFanProcessor extends GeoEventProcessorBase {
    private static final Log LOG = LogFactory.getLog(RangeFanProcessor.class);
    public Spatial spatial;
    public GeoEventDefinitionManager manager;
    //public TagManager tagMgr;
    private SpatialReference srIn;
    private SpatialReference srBuffer;
    private SpatialReference srOut;

    public RangeFanProcessor(GeoEventProcessorDefinition definition, Spatial s, GeoEventDefinitionManager m)
            throws ComponentException {
        super(definition);
        spatial = s;
        manager = m;
        //tagMgr=tm;
        geoEventMutator = true;
    }

    @Override
    public GeoEvent process(GeoEvent ge) throws Exception {
        double range;
        String rangeSource = properties.get("rangeSource").getValue().toString();
        if (rangeSource.equals("Constant")) {
            range = (Double) properties.get("range").getValue();
        } else {
            String eventfld = properties.get("rangeEvent").getValue().toString();
            String[] arr = eventfld.split(":");
            range = (Double) ge.getField(arr[1]);
        }
        String unit = properties.get("units").getValue().toString();

        double bearing;
        String bearingSource = properties.get("bearingSource").getValue().toString();
        if (bearingSource.equals("Constant")) {
            bearing = (Double) properties.get("bearing").getValue();
        } else {
            String eventfld = properties.get("bearingEvent").getValue().toString();
            String[] arr = eventfld.split(":");
            bearing = (Double) ge.getField(arr[1]);
        }

        double traversal;
        String traversalSource = properties.get("traversalSource").getValue().toString();
        if (traversalSource.equals("Constant")) {
            traversal = (Double) properties.get("traversal").getValue();
        } else {
            String eventfld = properties.get("traversalEvent").getValue().toString();
            String[] arr = eventfld.split(":");
            traversal = (Double) ge.getField(arr[1]);
        }

        int inwkid = (Integer) properties.get("wkidin").getValue();
        int outwkid = (Integer) properties.get("wkidout").getValue();
        int bufferwkid = (Integer) properties.get("wkidbuffer").getValue();
        srIn = SpatialReference.create(inwkid);
        srBuffer = SpatialReference.create(bufferwkid);
        srOut = SpatialReference.create(outwkid);

        com.esri.ges.spatial.Point eventGeo = (com.esri.ges.spatial.Point) ge.getGeometry();
        double x = eventGeo.getX();
        double y = eventGeo.getY();
        Geometry fan = constructRangeFan(x, y, range, unit, bearing, traversal);
        Geometry fanout = GeometryEngine.project(fan, srBuffer, srOut);
        String json = GeometryEngine.geometryToJson(srOut, fanout);
        com.esri.ges.spatial.Geometry outfan = spatial.fromJson(json);
        ge.setGeometry(outfan);
        return ge;
    }

    private Geometry constructRangeFan(double x, double y, double range, String unit, double bearing,
            double traversal) throws GeometryException {
        Polygon fan = new Polygon();
        Point center = new Point();
        center.setX(x);
        center.setY(y);
        // SpatialReference srIn = SpatialReference.create(wkidin);
        // SpatialReference srBuffer = SpatialReference.create(wkidbuffer);
        // SpatialReference srOut = SpatialReference.create(wkidout);
        Point centerProj = (Point) GeometryEngine.project(center, srIn, srBuffer);

        double centerX = centerProj.getX();
        double centerY = centerProj.getY();
        bearing = GeometryUtility.Geo2Arithmetic(bearing);
        double leftAngle = bearing - (traversal / 2);
        double rightAngle = bearing + (traversal / 2);
        int count = (int) Math.round(Math.abs(leftAngle - rightAngle));
        fan.startPath(centerProj);
        UnitConverter uc = new UnitConverter();
        range = uc.Convert(range, unit, srBuffer);
        for (int i = 0; i < count; ++i) {
            double d = Math.toRadians(leftAngle + i);
            double arcX = centerX + (range * Math.cos(d));
            double arcY = centerY + (range * Math.sin(d));
            Point arcPt = new Point(arcX, arcY);
            // arcPt = (Point) GeometryEngine.project(arcPt, srBuffer, srOut);
            fan.lineTo(arcPt);
        }
        fan.closeAllPaths();
        return fan;
    }
}