Skip to content

Commit

Permalink
Merge pull request #2394 from telefonicaid/task/add_polyline_arcgis
Browse files Browse the repository at this point in the history
Add esri Geometry PolyLine support for Arcgis
  • Loading branch information
fgalan authored Aug 1, 2024
2 parents 7764af1 + 828d939 commit 1216124
Show file tree
Hide file tree
Showing 5 changed files with 303 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGES_NEXT_RELEASE
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[cygnus-ngsi] [mongo-sink] Add mongo_ssl, mongo_ssl_invalid_host_allowed, mongo_ssl_keystore_path_file, mongo_ssl_keystore_password, mongo_ssl_truststore_path_file and mongo_ssl_truststore_password options for mongoDB connections
[cygnus-common] [mongo-backend] Use sslEnabled, sslInvalidHostNameAllowed, sslKeystorePathFile, sslKeystorePassword, sslTruststorePathFile and sslTruststorePassword options for mongoDB connections
[cygnus-common] [mongo-backend] Allow mongodb autodiscover at connect when just one server is provided
[cygnus-ngsi] [arcgis-sink] Add esri Geometry PolyLine support (#2392)
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,20 @@ public static Feature createPointFeature(String latitud, String longitud) {
return createPointFeature(lat, lon);
}

/**
*
* @param paths
* @return
*/
public static Feature createPolyLineFeature(String paths) {
try {
return new Feature(new PolyLine(paths));
} catch (Exception e) {
LOGGER.error(e.getClass().getSimpleName() + " " + e.getMessage());
return null;
}
}

/**
* This method merges unexistent attributes from sourceFeature.
*
Expand Down Expand Up @@ -309,13 +323,22 @@ public static Feature createInstanceFromJson(String json) throws ArcgisException
*/
public static Feature createInstanceFromJson(JsonObject json) throws ArcgisException {
try {
Geometry geometry;
Geometry geometry = null;
if (json.has(GEOMETRY_TAG)) {
JsonObject jsonGeometry = json.get(GEOMETRY_TAG).getAsJsonObject();
geometry = Point.createInstanceFromJson(jsonGeometry); // TODO another
//geometry types?
} else {
geometry = null;
JsonElement jsonGeometryElement = json.get(GEOMETRY_TAG);
if (jsonGeometryElement.isJsonObject()) {
JsonObject jsonGeometry = jsonGeometryElement.getAsJsonObject();
if (jsonGeometry.get("x") != null) {
geometry = Point.createInstanceFromJson(jsonGeometry);
} else if (jsonGeometry.get("paths") != null) {
geometry = PolyLine.createInstanceFromJson(jsonGeometry);
// FIXME when MultiPoint and Polygon will be implemented
// } else if (jsonGeometry.get("points") != null) {
// // geometry = MultiPoint.createInstance(jsonGeometry);
// } else if (jsonGeometry.get("rings") != null) {
// // geometry = Polygon.createInstance(jsonGeometry);
}
}
}
Map<String, Object> attributes = attToMap(json.get(ATTRIBUTES_TAG).getAsJsonObject());
return new Feature(geometry, attributes);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
/**
* Copyright 2014-2017 Telefonica Investigación y Desarrollo, S.A.U
*
* This file is part of fiware-cygnus (FIWARE project).
*
* fiware-cygnus 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.
* fiware-cygnus 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 fiware-cygnus. If not, see
* http://www.gnu.org/licenses/.
*
* For those usages not covered by the GNU Affero General Public License please contact with iot_support at tid dot es
*/

package com.telefonica.iot.cygnus.backends.arcgis.model;

import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;

import com.telefonica.iot.cygnus.backends.arcgis.exceptions.ArcgisException;
import com.telefonica.iot.cygnus.log.CygnusLogger;

/**
*
* @author avega
*
*/
public class PolyLine implements Geometry {
private static final CygnusLogger LOGGER = new CygnusLogger(PolyLine.class);

private static final String SPATIAL_REFERENCE_TAG = "spatialReference";
private static final String WKID_TAG = "wkid";
private static final String PATHS_TAG = "paths";

public List<List<double[]>> paths;

private SpatialReference spatialReference;
private int type = Geometry.TYPE_SHAPE; // TBD

/**
* Constructor.
*
* @param paths
* @param spatialReference
*/
public PolyLine(List<List<double[]>> paths, SpatialReference spatialReference) {
this.paths = paths;
this.spatialReference = spatialReference;
}

/**
* Constructor.
*
* @param lat
* @param lng
*/
public PolyLine(List<List<double[]>> paths) {
this(paths, SpatialReference.WGS84);
}

/**
* SetValue.
*/
public void setValue(Geometry g) throws ArcgisException {
if (g.getGeometryType() == Geometry.TYPE_SHAPE) {
PolyLine polyline = (PolyLine) g;
this.paths = polyline.paths;
} else {
throw new ArcgisException("Invalid Geometry Type, Point expected.");
}
}

/**
* Constructor.
*
* @param strPoint
* @throws ArcgisException
*/
public PolyLine(String strPolyline) throws ArcgisException {
try {
JsonObject jsonObject = JsonParser.parseString(strPolyline).getAsJsonObject();
String thePathsStr = jsonObject.get("paths").toString();
Gson gson = new Gson();
Type listType = new TypeToken<List<List<double[]>>>() {}.getType();
this.paths = gson.fromJson(thePathsStr, listType);
this.spatialReference = SpatialReference.WGS84;
} catch (NumberFormatException e) {
LOGGER.error(e.getClass().getSimpleName() + " " + e.getMessage());
throw new ArcgisException("Unexpected string format for type PolyLine.");
}
}

/**
* Sets Geometry From JSON.
*/
public void setGeometryFromJSON(String json) {
// TODO Auto-generated method stub

}

/**
* @return JsonObject
*/
public JsonObject toJSON() {
JsonObject result = new JsonObject();
LOGGER.debug("toJSON ");
result.addProperty(PATHS_TAG, this.toString());

JsonObject spatialRef = new JsonObject();
spatialRef.addProperty(WKID_TAG, spatialReference.getWkid());

result.add(SPATIAL_REFERENCE_TAG, spatialRef);
return result;
}

/**
* Factroy method.
*
* @param json
* @return
* @throws ArcgisException
*/
public static Geometry createInstanceFromJson(JsonObject json) throws ArcgisException {
try {
return new PolyLine(json.get(PATHS_TAG).getAsString());
} catch (Exception e) {
LOGGER.error(e.getClass().getSimpleName() + " " + e.getMessage());
throw new ArcgisException("Unable to parse PolyLine from json " + e.getMessage());
}

}

/**
* @return String
*/
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("{ \"paths\": [");
for (int i = 0; i < this.paths.size(); i++) {
List<double[]> innerList = this.paths.get(i);
for (int j = 0; j < innerList.size(); j++) {
sb.append(" [");
sb.append("[");
double[] array = innerList.get(j);
for (double value : array) {
sb.append(" ").append(value).append(",");
}
sb.append(" ]");
sb.setLength(sb.length() - 2);
sb.append(" ],");
}
}
sb.setLength(sb.length() - 2);
sb.append(" ]}");
return sb.toString();
}

/**
* @return geometry type
*/
public int getGeometryType() {
return type;
}

/**
*
*/
public void setSpatialReference(SpatialReference spatialReference) {
this.spatialReference = spatialReference;
}

/**
*
*/
public SpatialReference getSpatialReference() {
return this.spatialReference;
}

/**
*
* @return
*/
public List<List<double[]>> getPaths() {
return this.paths;
}

@Override
public Object getValue() {
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,34 @@
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import static org.mockito.Mockito.when;
import org.mockito.junit.MockitoJUnitRunner;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.telefonica.iot.cygnus.backends.arcgis.exceptions.ArcgisException;
import com.telefonica.iot.cygnus.backends.arcgis.model.Feature;
import com.telefonica.iot.cygnus.backends.arcgis.model.PolyLine;

import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import com.google.gson.JsonObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;


/**
*
* @author dmartinez
*
*/
@RunWith(MockitoJUnitRunner.class)
public class FeatureTest {

/**
Expand Down Expand Up @@ -114,7 +129,7 @@ public void getSetObjectId() {
feature.setObjectId(255);
assertTrue("getObjectId() doesn't match", feature.getObjectId() == 255);
assertTrue("OBJECTID not properly saved",
((Long) feature.getAttributes().get("OBJECTID")) == 255);
((Long)feature.getAttributes().get("OBJECTID")) == 255);
} catch (ArcgisException e) {
fail(e.getMessage());
}
Expand Down Expand Up @@ -149,4 +164,25 @@ public void createInstanceFromJson2() {
}

}

/**
*
*/
@Test
public void getPolyFeatureTest() {
System.out.println("---------------- getNewPolyLineFeature");
try {
String paths = "{ \"paths\": [ [ [-97.06138, 32.837], [-97.06133, 33.836], [-98.2, 34.834], [-97, 40] ] ] }";
PolyLine poly = new PolyLine(paths);
System.out.println("POLY: " + poly.toString());

} catch (Exception e) {
System.out.println("Exception");
System.out.println(e.getClass().getSimpleName() + " " + e.getMessage());
}
Feature poly = FeatureTestFactory.getNewPolyLineFeature("Mi PolyLine", 33);
System.out.println("feature poly - " + poly.toJson());
assertTrue("ok.", true);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,40 @@ public static Feature getUpdatedOcupacionFeature(int objectId, String name) {
return feature;
}

/**
*
* @param description
* @param externalId
* @return
*/
public static Feature getNewPolyLineFeature(String description, Integer externalId) {
Map<String, Object> attributes = new LinkedHashMap<String, Object>();
attributes.put("IDEXTERNO", externalId);
attributes.put("DESCRIPCION", description);
attributes.put("RAZONSOCIAL", "Razon social");
attributes.put("NUMEROPOSTAL", null);
attributes.put("TIPOOCUPACION", 0);
attributes.put("FINI", new Date());
attributes.put("UNIDADMEDIDA", null);
attributes.put("EXCSABDOM", 0);
attributes.put("EXCFESTIVOS", 0);
attributes.put("PRESENCIAPOLICIAL", 0);
attributes.put("REVISADO", 0);
attributes.put("IDACTIVIDAD", 0);
attributes.put("ACTIVIDAD", "actividad");
attributes.put("IDCLASE", 0);
attributes.put("CLASE", "clase");
attributes.put("IDESTADO", 0);
attributes.put("ESTADO", "estado");
attributes.put("CALLE", "calle");
attributes.put("FFIN", new GregorianCalendar());
attributes.put("CANTIDADOCUPADA", null);
String jsonString = "{ \"paths\": [ [ [-97.06138, 32.837], [-97.06133, 33.836], [-98.2, 34.834], [-97, 40] ] ] }";
Feature feature = Feature.createPolyLineFeature(jsonString);
feature.setAttributes(attributes);
return feature;
}

/**
*
* @return
Expand Down

0 comments on commit 1216124

Please sign in to comment.