Java tutorial
/** * Copyright (c) 2002-2011 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.gis.spatial; import org.apache.commons.lang.ArrayUtils; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.PropertyContainer; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; /** * @author Davide Savazzi */ public abstract class AbstractGeometryEncoder implements GeometryEncoder, Constants { // Public methods public void init(Layer layer) { this.layer = layer; } public void encodeEnvelope(Envelope mbb, PropertyContainer container) { container.setProperty(PROP_BBOX, new double[] { mbb.getMinX(), mbb.getMinY(), mbb.getMaxX(), mbb.getMaxY() }); } public void encodeGeometry(Geometry geometry, PropertyContainer container) { container.setProperty(PROP_TYPE, encodeGeometryType(geometry.getGeometryType())); container.setProperty(PROP_SRID, geometry.getSRID()); encodeEnvelope(geometry.getEnvelopeInternal(), container); encodeGeometryShape(geometry, container); } public Envelope decodeEnvelope(PropertyContainer container) { double[] bbox = new double[] { 0, 0, 0, 0, }; Object bboxProp = container.getProperty(PROP_BBOX); if (bboxProp instanceof Double[]) { bbox = ArrayUtils.toPrimitive((Double[]) bboxProp); } else if (bboxProp instanceof double[]) { bbox = (double[]) bboxProp; } // Envelope parameters: xmin, xmax, ymin, ymax return new Envelope(bbox[0], bbox[2], bbox[1], bbox[3]); } // Protected methods protected abstract void encodeGeometryShape(Geometry geometry, PropertyContainer container); protected Integer encodeGeometryType(String jtsGeometryType) { // TODO: Consider alternatives for specifying type, like relationship to // type category // objects (or similar indexing structure) if ("Point".equals(jtsGeometryType)) { return GTYPE_POINT; } else if ("MultiPoint".equals(jtsGeometryType)) { return GTYPE_MULTIPOINT; } else if ("LineString".equals(jtsGeometryType)) { return GTYPE_LINESTRING; } else if ("MultiLineString".equals(jtsGeometryType)) { return GTYPE_MULTILINESTRING; } else if ("Polygon".equals(jtsGeometryType)) { return GTYPE_POLYGON; } else if ("MultiPolygon".equals(jtsGeometryType)) { return GTYPE_MULTIPOLYGON; } else { throw new IllegalArgumentException("unknown type:" + jtsGeometryType); } } /** * This method wraps the hasProperty(String) method on the geometry node. * This means the default way of storing attributes is simply as properties * of the geometry node. This behaviour can be changed by other domain * models with different encodings. * * @param geomNode * @param attribute * to test * @return */ public boolean hasAttribute(Node geomNode, String name) { return geomNode.hasProperty(name); } /** * This method wraps the getProperty(String,null) method on the geometry * node. This means the default way of storing attributes is simply as * properties of the geometry node. This behaviour can be changed by other * domain models with different encodings. If the property does not exist, * the method returns null. * * @param geomNode * @param attribute * to test * @return attribute, or null */ public Object getAttribute(Node geomNode, String name) { return geomNode.getProperty(name, null); } // Attributes protected Layer layer; }