From 0f89b613a3b6a89cbd1ac83347286eb3e0326ecc Mon Sep 17 00:00:00 2001 From: kiselev-dv Date: Tue, 23 Sep 2014 20:36:45 +0200 Subject: [PATCH] Fix errors --- .../me/osm/gazetter/BoundariesFallbacker.java | 28 ++++++++++++++++--- .../java/me/osm/gazetter/striper/Slicer.java | 5 ++-- .../striper/builders/PlaceBuilder.java | 5 ++-- .../test/MultiPolygonBuilderTest.java | 23 +++++++++++++++ 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/Gazetteer/src/main/java/me/osm/gazetter/BoundariesFallbacker.java b/Gazetteer/src/main/java/me/osm/gazetter/BoundariesFallbacker.java index 673fbab7..88bee93b 100644 --- a/Gazetteer/src/main/java/me/osm/gazetter/BoundariesFallbacker.java +++ b/Gazetteer/src/main/java/me/osm/gazetter/BoundariesFallbacker.java @@ -19,6 +19,8 @@ import org.apache.commons.lang3.StringUtils; import org.joda.time.LocalDateTime; import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.code.externalsorting.ExternalSort; import com.vividsolutions.jts.geom.MultiPolygon; @@ -26,6 +28,8 @@ public class BoundariesFallbacker { + private static final Logger log = LoggerFactory.getLogger(BoundariesFallbacker.class); + private String fallbackPath; private HashSet fallbackTypes; @@ -35,7 +39,21 @@ public class BoundariesFallbacker { private Map cache = null; private File file; - public BoundariesFallbacker(String fallbackPath, List storeTypes) { + private volatile static BoundariesFallbacker instance = null; + + public static BoundariesFallbacker getInstance(String fallbackPath, List storeTypes) { + if(instance == null) { + synchronized (BoundariesFallbacker.class) { + if(instance == null) { + instance = new BoundariesFallbacker(fallbackPath, storeTypes); + } + } + } + + return instance; + } + + private BoundariesFallbacker(String fallbackPath, List storeTypes) { this.fallbackPath = StringUtils.stripToNull(fallbackPath); @@ -55,6 +73,7 @@ public BoundariesFallbacker(String fallbackPath, List storeTypes) { try { file = new File(this.fallbackPath); if(file.exists()) { + log.info("Load boundaries from {}", fallbackPath); buildCache(); } @@ -100,10 +119,9 @@ public MultiPolygon getGeometry(String id) { return (MultiPolygon)new WKTReader().read(wkt); } } - - } catch (Exception e) { + log.debug("Error duiring load geometry from fallback for {}. Error: {}", id, e.getMessage()); return null; } @@ -117,11 +135,13 @@ private void buildCache() throws IOException { String[] split = StringUtils.split(s, '\t'); if(split != null && split.length == 3) { String id = split[0]; - String geom = split[1]; + String geom = split[2]; cache.put(id, geom); } } + + log.info("Loaded {} lines.", cache.size()); } } diff --git a/Gazetteer/src/main/java/me/osm/gazetter/striper/Slicer.java b/Gazetteer/src/main/java/me/osm/gazetter/striper/Slicer.java index d7abb16a..1d98c32c 100644 --- a/Gazetteer/src/main/java/me/osm/gazetter/striper/Slicer.java +++ b/Gazetteer/src/main/java/me/osm/gazetter/striper/Slicer.java @@ -100,11 +100,12 @@ public void run(String poiCatalogPath, List types, List exclude, if(typesSet.contains("all") || typesSet.contains("boundaries")) { builders.add(new BoundariesBuilder(this, - new BoundariesFallbacker(boundariesFallbackIndex, boundariesFallbackTypes))); + BoundariesFallbacker.getInstance(boundariesFallbackIndex, boundariesFallbackTypes))); } if(typesSet.contains("all") || typesSet.contains("places")) { - builders.add(new PlaceBuilder(this, this)); + builders.add(new PlaceBuilder(this, this, + BoundariesFallbacker.getInstance(boundariesFallbackIndex, boundariesFallbackTypes))); } if(typesSet.contains("all") || typesSet.contains("highways")) { diff --git a/Gazetteer/src/main/java/me/osm/gazetter/striper/builders/PlaceBuilder.java b/Gazetteer/src/main/java/me/osm/gazetter/striper/builders/PlaceBuilder.java index 82ab2422..f461cc83 100644 --- a/Gazetteer/src/main/java/me/osm/gazetter/striper/builders/PlaceBuilder.java +++ b/Gazetteer/src/main/java/me/osm/gazetter/striper/builders/PlaceBuilder.java @@ -10,6 +10,7 @@ import java.util.Map.Entry; import java.util.Set; +import me.osm.gazetter.BoundariesFallbacker; import me.osm.gazetter.addresses.AddressesUtils; import me.osm.gazetter.addresses.NamesMatcher; import me.osm.gazetter.addresses.impl.NamesMatcherImpl; @@ -89,8 +90,8 @@ public static final double moveBack(double x) { return x - DEGREE_OFFSET; } - public PlaceBuilder(PlacePointHandler slicer, BoundariesHandler handler) { - super(handler, null); + public PlaceBuilder(PlacePointHandler slicer, BoundariesHandler handler, BoundariesFallbacker fallback) { + super(handler, fallback); this.handler = slicer; } diff --git a/Gazetteer/src/test/java/me/osm/gazetter/test/MultiPolygonBuilderTest.java b/Gazetteer/src/test/java/me/osm/gazetter/test/MultiPolygonBuilderTest.java index 42ca6546..41a90266 100644 --- a/Gazetteer/src/test/java/me/osm/gazetter/test/MultiPolygonBuilderTest.java +++ b/Gazetteer/src/test/java/me/osm/gazetter/test/MultiPolygonBuilderTest.java @@ -12,6 +12,8 @@ import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; import static org.junit.Assert.*; @@ -282,5 +284,26 @@ public void islandWithinHoleWithDisjuncOuter() { System.out.println("islandWithinHoleWithDisjuncOuter: " + mp.toString()); } + @Test + public void realWorldExample1() throws ParseException { + + List outers = new ArrayList(); + List inners = new ArrayList(); + + WKTReader reader = new WKTReader(f); + outers.add((LineString) reader.read("LINESTRING (42.8211884 45.3375219, 42.821406 45.3375338, " + + " 42.821478 45.3375392, 42.8214348 45.3379158, 42.8214215 45.3379422)")); + //outers.add((LineString) reader.read("LINESTRING (42.821046 45.3378754, 42.8208881 45.3378474)")); + outers.add((LineString) reader.read("LINESTRING (42.8214215 45.3379422, 42.821046 45.3378754, " + + "42.8208881 45.3378474, 42.8206616 45.3378149, 42.8205843 45.3378055, 42.8206528 45.3374546, " + + "42.8208394 45.3374756, 42.8211884 45.3375219)")); + + MultiPolygon mp = BuildUtils.buildMultyPolygon(new Relation(), outers, inners); + + assertNotNull(mp); + System.out.println("realWorldExample1: " + mp.toString()); + } + + }