/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.gis.map; import java.util.ArrayList; import java.util.List; import java.util.Random; import com.opendoorlogistics.api.geometry.LatLong; import com.opendoorlogistics.api.tables.ODLDatastore; import com.opendoorlogistics.api.tables.ODLDatastoreAlterable; import com.opendoorlogistics.api.tables.ODLTable; import com.opendoorlogistics.api.tables.ODLTableAlterable; import com.opendoorlogistics.api.tables.ODLTableDefinitionAlterable; import com.opendoorlogistics.api.tables.ODLTableReadOnly; import com.opendoorlogistics.api.tables.TableFlags; import com.opendoorlogistics.core.geometry.ODLGeomImpl; import com.opendoorlogistics.core.gis.map.data.DrawableObject; import com.opendoorlogistics.core.gis.map.data.DrawableObjectImpl; import com.opendoorlogistics.core.gis.map.data.LatLongBoundingBox; import com.opendoorlogistics.core.tables.beans.BeanMapping.BeanDatastoreMapping; import com.opendoorlogistics.core.tables.beans.BeanMapping.BeanTableMappingImpl; import com.opendoorlogistics.core.tables.memory.ODLDatastoreImpl; import com.opendoorlogistics.core.tables.utils.DatastoreCopier; import com.opendoorlogistics.core.tables.utils.ExampleData; import com.opendoorlogistics.core.utils.Colours; import com.opendoorlogistics.core.utils.Pair; import com.opendoorlogistics.core.utils.strings.Strings; import com.vividsolutions.jts.geom.Envelope; final public class MapUtils { public static ODLDatastoreAlterable<ODLTableAlterable> createExampleDatastore(){ int n = 100; return createExampleDatastore(n); } public static List<DrawableObjectImpl> getDrawables(ODLDatastore<? extends ODLTableReadOnly> ds) { ODLTableReadOnly table = ds.getTableAt(0); return getDrawables(table); } public static List<DrawableObjectImpl> getDrawables(ODLTableReadOnly table) { BeanTableMappingImpl btm = DrawableObjectImpl.getBeanMapping().getTableMapping(0); List<DrawableObjectImpl >pnts = btm.readObjectsFromTable(table); return pnts; } // public static List<LatLong> getLatLongs(Iterable<? extends DrawableObject> drawables,String legendKeyFilter){ // ArrayList<LatLong> ret = new ArrayList<>(); // for (DrawableObject pnt : drawables) { // if(Strings.isEmpty(legendKeyFilter) || Strings.equalsStd(pnt.getLegendKey(), legendKeyFilter)){ // if(pnt.getGeometry()==null){ // ret.add(pnt); // }else if(pnt.getGeometry().isValid()){ // for(Coordinate coord:pnt.getGeometry().getJTSGeometry().getCoordinates()){ // ret.add(new LatLongImpl(coord.y,coord.x)); // } // } // } // } // return ret; // } public static LatLongBoundingBox getLatLongBoundingBox(Iterable<? extends DrawableObject> drawables,String legendKeyFilter){ LatLongBoundingBox ret = new LatLongBoundingBox(); for (DrawableObject pnt : drawables) { if(Strings.isEmpty(legendKeyFilter) || Strings.equalsStd(pnt.getLegendKey(), legendKeyFilter)){ if(pnt.getGeometry()==null){ ret.add(pnt); } else if(pnt.getGeometry().getWGSBounds()!=null){ Envelope env = pnt.getGeometry().getWGSBounds(); ret.add(env.getMinY(), env.getMinX()); ret.add(env.getMinY(), env.getMaxX()); ret.add(env.getMaxY(), env.getMinX()); ret.add(env.getMaxY(), env.getMaxX()); } else if(pnt.getGeometry().getWGSCentroid()!=null){ ret.add(pnt.getGeometry().getWGSCentroid()); } } } return ret; } public static ODLDatastoreAlterable<ODLTableAlterable> createExampleDatastore(int n){ List<DrawableObjectImpl> objs = createExampleObjects(n); return convertToDatastore(objs,true); } public static ODLDatastoreAlterable<ODLTableAlterable> convertToDatastore(List<DrawableObjectImpl> objs, boolean writeGlobalIdBackToList) { ODLDatastoreAlterable<ODLTableAlterable> ret = createEmptyDatastore(); BeanDatastoreMapping mapping = DrawableObjectImpl.getBeanMapping(); ODLTable table = ret.getTableAt(0); BeanTableMappingImpl tm = mapping.getTableMapping(0); for(DrawableObjectImpl o:objs){ long gid = tm.writeObjectToTable(o, table); if(writeGlobalIdBackToList){ o.setGlobalRowId(gid); } } return ret; } public static List<DrawableObjectImpl> createExampleUKPlaces(){ ArrayList<DrawableObjectImpl> ret = new ArrayList<>(); for(Pair<String, LatLong> pair : ExampleData.getUKPlaces()){ DrawableObjectImpl drawable = new DrawableObjectImpl(pair.getSecond().getLatitude(), pair.getSecond().getLongitude(), Colours.getRandomColour(pair.getFirst()), pair.getFirst()); ret.add(drawable); } return ret; } public static List<DrawableObjectImpl> createExampleObjects(int n){ ArrayList<DrawableObjectImpl> ret = new ArrayList<>(n); String [] names = ExampleData.getExampleNouns(); String [] legendItems = new String[]{"Group A", "Group B" , "Group C"}; Random random = new Random(); for(int i =0 ; i < n ; i++){ String name = names[i%names.length]; DrawableObjectImpl obj = new DrawableObjectImpl( 52 + 2.0*random.nextDouble(),-1 + 2.0*random.nextDouble(),Colours.getRandomColour(name),name); obj.setPixelWidth(10); obj.setLegendKey(legendItems[i%legendItems.length]); obj.setTooltip("My name is " + name); ret.add(obj); } return ret; } public static ODLDatastoreAlterable<ODLTableAlterable> createEmptyDatastore() { ODLDatastoreAlterable<ODLTableAlterable> ret = ODLDatastoreImpl.alterableFactory.create(); createLatLongPointsTable(ret); return ret; } public static void createLatLongPointsTable(ODLDatastoreAlterable<? extends ODLTableDefinitionAlterable> ds){ DatastoreCopier.copyTableDefinition(DrawableObjectImpl.getBeanMapping().getDefinition().getTableAt(0), ds); ODLTableDefinitionAlterable table = ds.getTableAt(ds.getTableCount()-1); // ensure the map component table can take any name as the tutorial scripts reference "DrawableObjects" // not "Drawables" table.setFlags(table.getFlags() | TableFlags.FLAG_TABLE_NAME_WILDCARD | TableFlags.FLAG_IS_DRAWABLES); } }