MATSIM
PolygonFeatureFactory.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * *
4  * *********************************************************************** *
5  * *
6  * copyright : (C) 2012 by the members listed in the COPYING, *
7  * LICENSE and WARRANTY file. *
8  * email : info at matsim dot org *
9  * *
10  * *********************************************************************** *
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * See also COPYING, LICENSE and WARRANTY file *
17  * *
18  * *********************************************************************** */
19 
20 package org.matsim.core.utils.gis;
21 
22 import java.util.Collections;
23 import java.util.LinkedHashMap;
24 import java.util.Map;
25 
26 import org.geotools.api.feature.simple.SimpleFeature;
27 import org.geotools.api.feature.simple.SimpleFeatureType;
28 import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
29 import org.geotools.feature.simple.SimpleFeatureBuilder;
30 import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
31 import org.locationtech.jts.geom.Coordinate;
32 import org.locationtech.jts.geom.GeometryFactory;
33 import org.locationtech.jts.geom.LinearRing;
34 import org.locationtech.jts.geom.MultiPolygon;
35 import org.locationtech.jts.geom.Polygon;
36 import org.matsim.api.core.v01.Coord;
37 
41 public class PolygonFeatureFactory {
42 
43  private final Map<String, Class<?>> attributes;
44  private final SimpleFeatureType featureType;
45  private final GeometryFactory fac = new GeometryFactory();
46  private final SimpleFeatureBuilder builder;
47 
48  private PolygonFeatureFactory(Map<String, Class<?>> attributes, SimpleFeatureType featureType) {
49  this.attributes = attributes;
50  this.featureType = featureType;
51  this.builder = new SimpleFeatureBuilder(this.featureType);
52  }
53 
54  public SimpleFeatureType getFeatureType() {
55  return featureType;
56  }
57 
58  public SimpleFeature createPolygon(final Coordinate[] coordinates) {
59  return this.createPolygon(coordinates, Collections.<String, Object>emptyMap(), null);
60  }
61 
62  public SimpleFeature createPolygon(final Coord[] coordinates) {
63  Coordinate[] coords = new Coordinate[coordinates.length];
64  for (int i = 0; i < coordinates.length; i++) {
65  coords[i] = new Coordinate(coordinates[i].getX(), coordinates[i].getY());
66  }
67  return this.createPolygon(coords, Collections.<String, Object>emptyMap(), null);
68  }
69 
70  public SimpleFeature createPolygon(final Coordinate[] coordinates, final Map<String, Object> attributeValues, final String id) {
71  LinearRing shell;
72  if (coordinates[0] == coordinates[coordinates.length - 1]) {
73  shell = this.fac.createLinearRing(coordinates);
74  } else {
75  Coordinate[] coordinates2 = new Coordinate[coordinates.length + 1];
76  System.arraycopy(coordinates, 0, coordinates2, 0, coordinates.length);
77  coordinates2[coordinates.length] = coordinates[0];
78  shell = this.fac.createLinearRing(coordinates2);
79  }
80  Polygon p = this.fac.createPolygon(shell, null);
81  MultiPolygon mp = this.fac.createMultiPolygon(new Polygon[] {p});
82  return this.createPolygon(mp, attributeValues, id);
83  }
84 
85  public SimpleFeature createPolygon(final Polygon polygon, final Map<String, Object> attributeValues, final String id) {
86  MultiPolygon mp = this.fac.createMultiPolygon(new Polygon[] {polygon});
87  return this.createPolygon(mp, attributeValues, id);
88  }
89 
90  public SimpleFeature createPolygon(final MultiPolygon polygon, final Map<String, Object> attributeValues, final String id) {
91  this.builder.add(polygon);
92  for (String name : this.attributes.keySet()) {
93  Object value = attributeValues.get(name);
94  this.builder.add(value);
95  }
96 
97  return this.builder.buildFeature(id);
98  }
99 
100  public SimpleFeature createPolygon(final Coordinate[] coordinates, final Object[] attributeValues, final String id) {
101  LinearRing shell;
102  if (coordinates[0] == coordinates[coordinates.length - 1]) {
103  shell = this.fac.createLinearRing(coordinates);
104  } else {
105  Coordinate[] coordinates2 = new Coordinate[coordinates.length + 1];
106  System.arraycopy(coordinates, 0, coordinates2, 0, coordinates.length);
107  coordinates2[coordinates.length] = coordinates[0];
108  shell = this.fac.createLinearRing(coordinates2);
109  }
110  Polygon p = this.fac.createPolygon(shell, null);
111  MultiPolygon mp = this.fac.createMultiPolygon(new Polygon[] {p});
112  return this.createPolygon(mp, attributeValues, id);
113  }
114 
115  public SimpleFeature createPolygon(final Polygon polygon, final Object[] attributeValues, final String id) {
116  MultiPolygon mp = this.fac.createMultiPolygon(new Polygon[] {polygon});
117  return this.createPolygon(mp, attributeValues, id);
118  }
119 
120  public SimpleFeature createPolygon(final MultiPolygon polygon, Object[] attributeValues, final String id) {
121  this.builder.add(polygon);
122  for (int i = 0; i < attributeValues.length; i++) {
123  Object value = attributeValues[i];
124  this.builder.add(value);
125  }
126 
127  return this.builder.buildFeature(id);
128  }
129 
130  public static class Builder {
131  private CoordinateReferenceSystem crs = null;
132  private String name = "";
133  private Map<String, Class<?>> attributes = new LinkedHashMap<String, Class<?>>();
134 
135  public Builder() {
136 
137  }
138 
139  public Builder setCrs(CoordinateReferenceSystem crs) {
140  this.crs = crs;
141  return this;
142  }
143 
144  public Builder addAttribute(final String name, final Class<?> type) {
145  this.attributes.put(name, type);
146  return this;
147  }
148 
149  public Builder setName(final String name) {
150  this.name = name;
151  return this;
152  }
153 
155  SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
156  b.setName(this.name);
157  b.setCRS(this.crs);
158  b.add("the_geom", MultiPolygon.class);
159  for (Map.Entry<String, Class<?>> attr : this.attributes.entrySet()) {
160  b.add(attr.getKey(), attr.getValue());
161  }
162 
163  SimpleFeatureType featureType = b.buildFeatureType();
164  return new PolygonFeatureFactory(this.attributes, featureType);
165  }
166  }
167 
168 }
SimpleFeature createPolygon(final Polygon polygon, final Object[] attributeValues, final String id)
PolygonFeatureFactory(Map< String, Class<?>> attributes, SimpleFeatureType featureType)
SimpleFeature createPolygon(final Coordinate[] coordinates)
SimpleFeature createPolygon(final MultiPolygon polygon, Object[] attributeValues, final String id)
SimpleFeature createPolygon(final Coordinate[] coordinates, final Object[] attributeValues, final String id)
SimpleFeature createPolygon(final Polygon polygon, final Map< String, Object > attributeValues, final String id)
Builder addAttribute(final String name, final Class<?> type)
SimpleFeature createPolygon(final Coord[] coordinates)
SimpleFeature createPolygon(final Coordinate[] coordinates, final Map< String, Object > attributeValues, final String id)
SimpleFeature createPolygon(final MultiPolygon polygon, final Map< String, Object > attributeValues, final String id)