Package com.esri.gpt.catalog.lucene

Source Code of com.esri.gpt.catalog.lucene.GeometryProperty

/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You 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.
*/
package com.esri.gpt.catalog.lucene;
import com.esri.gpt.framework.geometry.Envelope;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.document.NumericField;

/**
* Represents the bounding envelope associated with a document.
*/
public class GeometryProperty extends Storeable {
 
  /** class variables ========================================================= */
   
  /** The Logger */
  private static Logger LOGGER = Logger.getLogger(GeometryProperty.class.getName());
       
  /** constructors ============================================================ */
 
  /**
   * Constructs with a supplied name.
   * @param name the property name
   */
  public GeometryProperty(String name) {
    super(name);
    setComparisonField(new DoubleField("envelope.area",8));
  }
     
  /** methods ================================================================= */
 
  /**
   * Appends underlying fields to a document prior to writing the
   * document to the index.
   * @param document the Lucene document
   */
  @Override
  public void appendForWrite(Document document) {
    Object value = null;
    if ((getValues() != null) && (getValues().length == 1)) {
      value = getValues()[0];
    }
    if ((value != null) && (value instanceof Envelope)) {
      Envelope envelope = (Envelope)value;
      if ((envelope != null) && !envelope.isEmpty()) {
       
        // initialize values
        ArrayList<Fieldable> alFields = new ArrayList<Fieldable>();
        double dMinX = envelope.getMinX();
        double dMinY = envelope.getMinY();
        double dMaxX = envelope.getMaxX();
        double dMaxY = envelope.getMaxY();
        double dArea = Math.abs(dMaxX - dMinX) * Math.abs(dMaxY - dMinY);
        boolean bCrossedDateLine = (dMinX > dMaxX);
        if (bCrossedDateLine) {
          dArea = Math.abs(dMaxX + 360.0 - dMinX) * Math.abs(dMaxY - dMinY);
        }
        String sFull = dMinX+";"+dMinY+";"+dMaxX+";"+dMaxY+";"+dArea+";"+bCrossedDateLine;
       
        // initialize fields
        NumericField fldMinX = new NumericField("envelope.minx",Field.Store.YES,true);
        NumericField fldMinY = new NumericField("envelope.miny",Field.Store.YES,true);
        NumericField fldMaxX = new NumericField("envelope.maxx",Field.Store.YES,true);
        NumericField fldMaxY = new NumericField("envelope.maxy",Field.Store.YES,true);
        NumericField fldArea = new NumericField("envelope.area",Field.Store.YES,true);
        Field fldXDL = new Field("envelope.xdl",""+bCrossedDateLine,Field.Store.YES,Field.Index.NOT_ANALYZED,Field.TermVector.NO);
        Field fldFull = new Field("envelope.full",sFull,Field.Store.YES,Field.Index.NOT_ANALYZED,Field.TermVector.NO);;

        fldMinX.setDoubleValue(dMinX);
        fldMinY.setDoubleValue(dMinY);
        fldMaxX.setDoubleValue(dMaxX);
        fldMaxY.setDoubleValue(dMaxY);
        fldArea.setDoubleValue(dArea);
        alFields.add(fldMinX);
        alFields.add(fldMinY);
        alFields.add(fldMaxX);
        alFields.add(fldMaxY);
        alFields.add(fldArea);
        alFields.add(fldXDL);
        alFields.add(fldFull);
       
        // add the fields
        for (Fieldable fld: alFields) {
          if (LOGGER.isLoggable(Level.FINER)) {
            StringBuffer sb = new StringBuffer();
            sb.append("Appending field:\n ");
            sb.append(" name=\"").append(fld.name()).append("\"");
            sb.append(" storageOption=\"").append(Field.Store.YES).append("\"");
            sb.append("\n  storeValue=\"").append(fld.stringValue()).append("\"");
            LOGGER.finer(sb.toString());
          }
          document.add(fld);
        }
       
      }
    }
  }
 
  /**
   * Appends underlying fields to a document prior to writing the
   * document to the index.
   * @param document the Lucene document
   * @param value the input value to write
   */
  @Override
  public void appendForWrite(Document document, Object value) {
    // Not applicable
  }
 
  /**
   * Reads the envelope associated with a document.
   * @param document the Lucene document
   * @return the envelope (null if none)
   */
  protected Envelope readEnvelope(Document document) {
    String sMinX = document.get("envelope.minx");
    String sMinY = document.get("envelope.miny");
    String sMaxX = document.get("envelope.maxx");
    String sMaxY = document.get("envelope.maxy");
    if ((sMinX != null) && (sMinY != null) && (sMaxX != null) && (sMaxY != null)) {
      Envelope envelope = new Envelope();
      envelope.put(sMinX,sMinY,sMaxX,sMaxY);
      if (!envelope.isEmpty()) {
        return envelope;
      }
    }
    return null;
  }
   
}
TOP

Related Classes of com.esri.gpt.catalog.lucene.GeometryProperty

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.