values) {
- this.values = values;
- }
-
- @Override
- public Boolean convert(SimpleFeature feature) {
- String key = feature.getAttribute(attributeName).toString();
- Boolean value = values.get(key);
- if (value == null) {
- value = defaultValue;
- }
- return value;
- }
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CaseBasedTraversalPermissionConverter.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CaseBasedTraversalPermissionConverter.java
deleted file mode 100644
index 11a6eaf2c23..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CaseBasedTraversalPermissionConverter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.opengis.feature.simple.SimpleFeature;
-import org.opentripplanner.common.model.P2;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-import org.opentripplanner.routing.edgetype.StreetTraversalPermission;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Calculates street traversal permissions based upon a fixed set of cases.
- *
- * For example, given a shapefile that includes a DIRECTION column with data as follows:
- *
- * | DIRECTION | NAME |
- * | ONE_WAY_F | Side St |
- * | TWO_WAY | Main St |
- * | ONE_WAY_B | Foo St. |
- *
- * You could use a CaseBasedTraversalPermissionConverter to implement the following rules:
- *
- * By default, all streets should be traversable by pedestrians and bicycles in both directions.
- *
- * If a street's DIRECTION attribute is ONE_WAY_F, it should be traversable by cars and bikes in
- * only the forward direction and traversable by pedestrians in both directions.
- *
- * If a street's DIRECTION attribute is ONE_WAY_B, it should be traversable by cars and bikes in
- * only the backward direction and traversable by pedestrians in both directions.
- *
- * If a street's DIRECTION attribute is TWO_WAY, it should be traversable by everyone in both
- * directions.
- *
- *
- * These rules could be implemented by configuring the converter bean as follows:
- *
- * {@code
- *
- *
- *
- *
- *
- *
- * }
- *
- * @see org.opentripplanner.routing.edgetype.StreetTraversalPermission
- *
- */
-public class CaseBasedTraversalPermissionConverter implements
- SimpleFeatureConverter> {
-
- private static Logger log = LoggerFactory.getLogger(CaseBasedBicycleSafetyFeatureConverter.class);
-
- private String attributeName;
-
- private P2 defaultPermission = P2.createPair(
- StreetTraversalPermission.ALL, StreetTraversalPermission.ALL);
-
- private Map> _permissions = new HashMap>();
-
- public CaseBasedTraversalPermissionConverter() {
-
- }
-
- public CaseBasedTraversalPermissionConverter(String attributeName) {
- this.attributeName = attributeName;
- }
-
- public CaseBasedTraversalPermissionConverter(String attributeName,
- StreetTraversalPermission defaultPermission) {
- this.attributeName = attributeName;
- this.defaultPermission = P2.createPair(defaultPermission, defaultPermission);
- }
-
- /**
- * The name of the feature attribute to use when calculating the traversal permissions.
- */
- public void setAttributeName(String attributeName) {
- this.attributeName = attributeName;
- }
-
- /**
- * The default permission to use when no matching case is found for a street.
- */
- public void setDefaultPermission(StreetTraversalPermission permission) {
- defaultPermission = P2.createPair(permission, permission);
- }
-
- /**
- * The mapping from attribute values to permissions to use when determining a street's traversal
- * permission.
- */
- public void setPermissions(Map permissions) {
- for (Map.Entry entry : permissions.entrySet()) {
- String attributeValue = entry.getKey();
- String perms = entry.getValue();
- String[] tokens = perms.split(",");
- if (tokens.length != 2)
- throw new IllegalArgumentException("invalid street traversal permissions: " + perms);
-
- StreetTraversalPermission forward = StreetTraversalPermission.valueOf(tokens[0]);
- StreetTraversalPermission reverse = StreetTraversalPermission.valueOf(tokens[1]);
- addPermission(attributeValue, forward, reverse);
- }
- }
-
- public void addPermission(String attributeValue, StreetTraversalPermission forward,
- StreetTraversalPermission reverse) {
- _permissions.put(attributeValue, P2.createPair(forward, reverse));
- }
-
- @Override
- public P2 convert(SimpleFeature feature) {
- if (attributeName == null) {
- return defaultPermission;
- }
- Object key = feature.getAttribute(attributeName);
- if (key == null) {
- return defaultPermission;
- }
- P2 permission = _permissions.get(key.toString());
- if (permission == null) {
- log.info("unexpected permission " + key.toString());
- return defaultPermission;
- }
- return permission;
- }
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CompositeBooleanConverter.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CompositeBooleanConverter.java
deleted file mode 100644
index bb25c58f1bc..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CompositeBooleanConverter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-
-import org.opengis.feature.simple.SimpleFeature;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-
-/**
- * A converter which is a composite of other converters. It can combine them with an "and" or "or"
- * strategy. The orPermissions variable controls that.
- *
- * @author rob, novalis
- *
- */
-public class CompositeBooleanConverter implements SimpleFeatureConverter {
-
- private Collection> converters = new ArrayList>();
-
- private boolean orPermissions = false;
-
- public CompositeBooleanConverter() {
- }
-
- public CompositeBooleanConverter(SimpleFeatureConverter... converters) {
- this.converters = new ArrayList>(Arrays.asList(converters));
- }
-
- /**
- * Is the or combination strategy being used?
- *
- * @return whether the or combination strategy is used
- */
- public boolean isOrPermissions() {
- return orPermissions;
- }
-
- public void setOrPermissions(boolean orPermissions) {
- this.orPermissions = orPermissions;
- }
-
- /**
- * set the list of converters used to the passed in parameter
- *
- * @param converters
- * list of converters to use
- */
- public void setConverters(
- Collection> converters) {
- this.converters = converters;
- }
-
- /**
- * use the permission combination strategy to combine the results of the list of converters
- */
- @Override
- public Boolean convert(SimpleFeature feature) {
- Boolean result = null;
- for (SimpleFeatureConverter converter : converters) {
- Boolean value = converter.convert(feature);
- if (result == null) {
- result = value;
- } else {
- if (orPermissions) {
- result = result || value;
- } else {
- result = result && value;
- }
- }
-
- }
- return result;
- }
-
- /**
- * add a converter to the list to be applied
- * @param converter the new converter
- */
- public void add(SimpleFeatureConverter converter) {
- converters.add(converter);
- }
-
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CompositeStreetTraversalPermissionConverter.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CompositeStreetTraversalPermissionConverter.java
deleted file mode 100644
index 6d8884cd6fd..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/CompositeStreetTraversalPermissionConverter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.opengis.feature.simple.SimpleFeature;
-import org.opentripplanner.common.model.P2;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-import org.opentripplanner.routing.edgetype.StreetTraversalPermission;
-
-/**
- * A converter which is a composite of other converters. It can combine them with an "and" or "or"
- * strategy. The orPermissions variable controls that.
- *
- * @author rob
- *
- */
-public class CompositeStreetTraversalPermissionConverter implements SimpleFeatureConverter> {
-
- private Collection>> converters = new ArrayList>>();
-
- private boolean orPermissions = false;
-
- public CompositeStreetTraversalPermissionConverter() {
- }
-
- /**
- * Is the or combination strategy being used?
- *
- * @return whether the or combination strategy is used
- */
- public boolean isOrPermissions() {
- return orPermissions;
- }
-
- public void setOrPermissions(boolean orPermissions) {
- this.orPermissions = orPermissions;
- }
-
- /**
- * set the list of converters used to the passed in parameter
- *
- * @param converters
- * list of converters to use
- */
- public void setConverters(
- Collection>> converters) {
- this.converters = converters;
- }
-
- /**
- * use the permission combination strategy to combine the results of the list of converters
- */
- @Override
- public P2 convert(SimpleFeature feature) {
- P2 result = null;
- for (SimpleFeatureConverter> converter : converters) {
- P2 value = converter.convert(feature);
- if (result == null) {
- result = value;
- } else {
- StreetTraversalPermission first, second;
- if (orPermissions) {
- first = result.first.add(value.first);
- second = result.second.add(value.second);
- } else {
- first = StreetTraversalPermission.get(result.first.code & value.first.code);
- second = StreetTraversalPermission.get(result.second.code & value.second.code);
- }
- result = new P2(first, second);
- }
-
- }
- return result;
- }
-
- /**
- * add a converter to the list to be applied
- * @param converter the new converter
- */
- public void add(SimpleFeatureConverter> converter) {
- converters.add(converter);
- }
-
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/DirectSafetyReader.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/DirectSafetyReader.java
deleted file mode 100644
index 74eec5b290b..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/DirectSafetyReader.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import org.opengis.feature.simple.SimpleFeature;
-import org.opentripplanner.common.model.P2;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-
-/*
- * Read safety factors directly from shapefiles (contributed by Guillaume Barreau)
- */
-public class DirectSafetyReader implements SimpleFeatureConverter> {
- private String safetyAttributeName;
-
- public static final P2 oneone = new P2(1.0, 1.0);
-
- @Override
- public P2 convert(SimpleFeature feature) {
- Double d = (Double) feature.getAttribute(safetyAttributeName);
- if (d == null) {
- return oneone;
- }
- return new P2(d, d);
- }
-
- public void setSafetyAttributeName(String safetyAttributeName) {
- this.safetyAttributeName = safetyAttributeName;
- }
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/FeatureIdConverter.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/FeatureIdConverter.java
deleted file mode 100644
index c44cbe8543c..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/FeatureIdConverter.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import org.opengis.feature.simple.SimpleFeature;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-
-public class FeatureIdConverter implements SimpleFeatureConverter {
-
- @Override
- public String convert(SimpleFeature feature) {
- return feature.getID();
- }
-
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/JoinedFeatureConverter.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/JoinedFeatureConverter.java
deleted file mode 100644
index 2bf1208526b..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/JoinedFeatureConverter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-import org.geotools.data.FeatureSource;
-import org.geotools.feature.FeatureCollection;
-import org.geotools.feature.FeatureIterator;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opentripplanner.graph_builder.services.shapefile.FeatureSourceFactory;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This is a simple feature converter that gets features from a secondary feature source. This is
- * useful if you have (say) bike lane data in another file.
- */
-public class JoinedFeatureConverter implements SimpleFeatureConverter {
-
- private static Logger log = LoggerFactory.getLogger(JoinedFeatureConverter.class);
-
- private SimpleFeatureConverter converter;
-
- private String joinedKey;
-
- private String mainKey;
-
- private FeatureSource joinedSource;
-
- private HashMap cache;
-
- public JoinedFeatureConverter() {
- }
-
- public JoinedFeatureConverter(String mainKey, String joinedKey,
- SimpleFeatureConverter converter,
- FeatureSource joinedSource) {
- this.mainKey = mainKey;
- this.joinedKey = joinedKey;
- this.converter = converter;
- this.joinedSource = joinedSource;
- }
-
- @Override
- public T convert(SimpleFeature feature) {
- ensureCached();
- String mainKeyValue = toHashableString(feature.getAttribute(this.mainKey));
- if (mainKeyValue == null) {
- log.warn("Feature " + feature.getID() + " has null value for its mainKey (" + mainKey + ")");
- return null;
- }
- SimpleFeature joinedFeature = cache.get(mainKeyValue);
-
- if (joinedFeature == null) {
- return null;
- } else {
- return converter.convert(joinedFeature);
- }
- }
-
- /** We have to cache all the features in the supplemental file, because
- * if we try to load them on the fly, GeoTools wigs out.
- */
- private void ensureCached() {
- if (cache != null) {
- return;
- }
- cache = new HashMap();
- try {
- FeatureCollection features = joinedSource
- .getFeatures();
- FeatureIterator it = features.features();
- while (it.hasNext()) {
- SimpleFeature feature = it.next();
- String joinedKeyValue = toHashableString(feature.getAttribute(joinedKey));
- if (joinedKeyValue != null) {
- cache.put(joinedKeyValue, feature);
- } else {
- log.warn("Feature " + feature.getID() + " has null value for its joinedKey (" + joinedKey + ")");
- }
- }
- it.close();
-
- } catch (IOException e) {
- throw new RuntimeException("Could not cache values for joined shapefile", e);
- }
- }
-
- /**
- * Convert a feature value to a String for hashing. We use this instead of simply calling
- * toString to avoid issues when the column types for these features are slightly different. See
- * http://opentripplanner.org/ticket/226
- *
- * @param keyValue
- * @return a string to use as the hash key
- */
- private String toHashableString(Object keyValue) {
- if (keyValue == null) {
- return null;
- }
- if (keyValue instanceof Number) {
- keyValue = ((Number)keyValue).doubleValue();
- }
- return keyValue.toString();
- }
-
- public void setConverter(SimpleFeatureConverter converter) {
- this.converter = converter;
- }
-
- /**
- * The name of the attribute in the joined feature source to use as the join key.
- */
- public void setJoinedKey(String joinedKey) {
- this.joinedKey = joinedKey;
- }
-
- /**
- * The name of the attribute in the main feature source to use as the join key.
- */
- public void setMainKey(String mainKey) {
- this.mainKey = mainKey;
- }
-
- public void setJoinedSourceFactory(FeatureSourceFactory factory) {
- this.joinedSource = factory.getFeatureSource();
- }
-
- public void setJoinedSource(FeatureSource joinedSource) {
- this.joinedSource = joinedSource;
- }
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/NullBooleanConverter.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/NullBooleanConverter.java
deleted file mode 100644
index 08b61594e70..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/NullBooleanConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import org.opengis.feature.simple.SimpleFeature;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-
-/**
- * A converter which converts null-valued attributes to either true or false (and all others to the other)
- *
- * @author novalis
- *
- */
-public class NullBooleanConverter implements SimpleFeatureConverter {
-
- private String attributeName;
-
- private boolean nullIsTrue = false;
-
- public NullBooleanConverter() {
- }
-
- public NullBooleanConverter(String attributeName, boolean nullIsTrue) {
- this.attributeName = attributeName;
- this.nullIsTrue = nullIsTrue;
- }
-
- @Override
- public Boolean convert(SimpleFeature feature) {
- Object value = feature.getAttribute(attributeName);
-
- if (value == null || value.equals("")) {
- return nullIsTrue;
- } else {
- return !nullIsTrue;
- }
- }
-
- /**
- * @param attributeName the attribute name to set
- */
- public void setAttributeName(String attributeName) {
- this.attributeName = attributeName;
- }
-
- /**
- * @return the attribute name
- */
- public String getAttributeName() {
- return attributeName;
- }
-
- /**
- * @param nullIsTrue whether a null value for this attribue converts to false
- */
- public void setNullIsTrue(boolean nullIsTrue) {
- this.nullIsTrue = nullIsTrue;
- }
-
- /**
- * @return whether a null value for this attribute converts to true
- */
- public boolean getNullIsTrue() {
- return nullIsTrue;
- }
-
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/ShapefileFeatureSourceFactoryImpl.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/ShapefileFeatureSourceFactoryImpl.java
deleted file mode 100644
index 101b60f84dd..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/ShapefileFeatureSourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import java.io.File;
-
-import org.geotools.data.FeatureSource;
-import org.geotools.data.shapefile.ShapefileDataStore;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opentripplanner.graph_builder.services.shapefile.FeatureSourceFactory;
-
-public class ShapefileFeatureSourceFactoryImpl implements FeatureSourceFactory {
-
- private File path;
- private ShapefileDataStore dataStore;
-
- public ShapefileFeatureSourceFactoryImpl() {
-
- }
-
- public ShapefileFeatureSourceFactoryImpl(File path) {
- this.path = path;
- }
-
- public void setPath(File path) {
- this.path = path;
- }
-
- @Override
- public FeatureSource getFeatureSource() {
-
- try {
- dataStore = new ShapefileDataStore(path.toURI().toURL());
-
- String typeNames[] = dataStore.getTypeNames();
- String typeName = typeNames[0];
-
- return dataStore.getFeatureSource(typeName);
- } catch (Exception ex) {
- throw new IllegalStateException("error creating feature source from shapefile: path="
- + path, ex);
- }
- }
-
- @Override
- public void cleanup() {
- dataStore.dispose();
- }
-
- @Override
- public void checkInputs() {
- if (!path.canRead()) {
- throw new RuntimeException("Can't read Shapefile path: " + path);
- }
- }
-}
diff --git a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/ShapefileStreetModule.java b/src/main/java/org/opentripplanner/graph_builder/module/shapefile/ShapefileStreetModule.java
deleted file mode 100644
index f5aad8ec8f9..00000000000
--- a/src/main/java/org/opentripplanner/graph_builder/module/shapefile/ShapefileStreetModule.java
+++ /dev/null
@@ -1,335 +0,0 @@
-package org.opentripplanner.graph_builder.module.shapefile;
-
-import org.geotools.data.FeatureSource;
-import org.geotools.data.Query;
-import org.geotools.feature.FeatureCollection;
-import org.geotools.feature.FeatureIterator;
-import org.geotools.geometry.jts.JTS;
-import org.geotools.referencing.ReferencingFactoryFinder;
-import org.geotools.util.factory.Hints;
-import org.locationtech.jts.geom.Coordinate;
-import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.geom.LineString;
-import org.locationtech.jts.geom.MultiLineString;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opengis.referencing.crs.CRSAuthorityFactory;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opentripplanner.common.geometry.GeometryUtils;
-import org.opentripplanner.common.model.P2;
-import org.opentripplanner.graph_builder.DataImportIssueStore;
-import org.opentripplanner.graph_builder.services.DefaultStreetEdgeFactory;
-import org.opentripplanner.graph_builder.services.GraphBuilderModule;
-import org.opentripplanner.graph_builder.services.StreetEdgeFactory;
-import org.opentripplanner.graph_builder.services.shapefile.FeatureSourceFactory;
-import org.opentripplanner.graph_builder.services.shapefile.SimpleFeatureConverter;
-import org.opentripplanner.model.StreetNote;
-import org.opentripplanner.routing.edgetype.StreetEdge;
-import org.opentripplanner.routing.edgetype.StreetTraversalPermission;
-import org.opentripplanner.routing.graph.Graph;
-import org.opentripplanner.routing.services.notes.StreetNotesService;
-import org.opentripplanner.routing.vertextype.IntersectionVertex;
-import org.opentripplanner.util.NonLocalizedString;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Loads a shapefile into an edge-based graph.
- *
- */
-public class ShapefileStreetModule implements GraphBuilderModule {
- private static Logger log = LoggerFactory.getLogger(ShapefileStreetModule.class);
-
- private FeatureSourceFactory featureSourceFactory;
-
- private ShapefileStreetSchema schema;
-
- public StreetEdgeFactory edgeFactory = new DefaultStreetEdgeFactory();
-
- public List provides() {
- return Arrays.asList("streets");
- }
-
- public List getPrerequisites() {
- return Collections.emptyList();
- }
-
- public void setFeatureSourceFactory(FeatureSourceFactory factory) {
- featureSourceFactory = factory;
- }
-
- public void setSchema(ShapefileStreetSchema schema) {
- this.schema = schema;
- }
-
- @Override
- public void buildGraph(
- Graph graph,
- HashMap, Object> extra,
- DataImportIssueStore issueStore
- ) {
-
- try {
-
- FeatureSource featureSource = featureSourceFactory
- .getFeatureSource();
- CoordinateReferenceSystem sourceCRS = featureSource.getInfo().getCRS();
-
- Hints hints = new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE);
- CRSAuthorityFactory factory = ReferencingFactoryFinder.getCRSAuthorityFactory("EPSG",
- hints);
- CoordinateReferenceSystem worldCRS = factory
- .createCoordinateReferenceSystem("EPSG:4326");
-
- Query query = new Query();
- query.setCoordinateSystem(sourceCRS);
- query.setCoordinateSystemReproject(worldCRS);
-
- FeatureCollection features = featureSource
- .getFeatures(query);
-
- features = featureSource.getFeatures(query);
-
- HashMap> intersectionNameToId = new HashMap>();
-
- SimpleFeatureConverter streetIdConverter = schema.getIdConverter();
- SimpleFeatureConverter streetNameConverter = schema.getNameConverter();
- SimpleFeatureConverter> permissionConverter = schema
- .getPermissionConverter();
- SimpleFeatureConverter noteConverter = schema.getNoteConverter();
-
- HashMap intersectionsByLocation =
- new HashMap();
-
- SimpleFeatureConverter> safetyConverter = schema.getBicycleSafetyConverter();
-
- SimpleFeatureConverter slopeOverrideCoverter = schema.getSlopeOverrideConverter();
-
- SimpleFeatureConverter featureSelector = schema.getFeatureSelector();
-
- // Keep track of features that are duplicated so we don't have duplicate streets
- Set