1
Morphiaを使用してMongodbにGeoJson Polygonオブジェクトを格納しようとしています。 GeoJsonポリゴン座標は、以下のように3レベルの深い配列でなければならないことに注意してください。Morphia with Javaを使用してMongodbにGeoJson Polygonオブジェクトを保存できません
{
type: "Polygon",
coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ]
}
以下はMy Entityクラスです。
static class Loc {
private final String type = "Polygon";
private ArrayList<ArrayList<Double[]>> coordinates = new ArrayList<ArrayList<Double[]>>();
public ArrayList<ArrayList<Double[]>> getCoordinates() {
return coordinates;
}
public void setCoordinates(ArrayList<Double[]> coordinates) {
this.coordinates.add(coordinates);
}
}
私はそれを保存すると、モルフィアは私に次の例外を与えます。
Exception in thread "main" org.mongodb.morphia.mapping.MappingException: Error mapping field:com.utils.JavaUtils$Poly.loc
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:983)
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:593)
at org.mongodb.morphia.DatastoreImpl.entityToDBObj(DatastoreImpl.java:1359)
at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:1279)
at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:775)
at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:758)
at com.utils.JavaUtils.polygonizeAndSave(JavaUtils.java:105)
at com.examples.MainExample$$anonfun$main$4.apply(MainExample.scala:71)
at com.examples.MainExample$$anonfun$main$4.apply(MainExample.scala:71)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at com.examples.MainExample$.main(MainExample.scala:71)
at com.examples.MainExample.main(MainExample.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:736)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: org.mongodb.morphia.mapping.MappingException: Error mapping field:com.utils.JavaUtils$Poly$Loc.coordinates
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:983)
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:593)
at org.mongodb.morphia.mapping.EmbeddedMapper.toDBObject(EmbeddedMapper.java:98)
at org.mongodb.morphia.mapping.Mapper.writeMappedField(Mapper.java:875)
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:981)
... 21 more
Caused by: java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [className]
at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:168)
at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:160)
at org.bson.types.BasicBSONList.removeField(BasicBSONList.java:117)
at org.mongodb.morphia.mapping.EmbeddedMapper.writeCollection(EmbeddedMapper.java:243)
at org.mongodb.morphia.mapping.EmbeddedMapper.toDBObject(EmbeddedMapper.java:90)
at org.mongodb.morphia.mapping.Mapper.writeMappedField(Mapper.java:875)
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:981)
... 25 more
私は、 'private HashMap loc = new HashMap ()'のようなハッシュマップを作成し、 'ArrayList >座標全体をマップに値として入れました。しかしそれは回避策です。モルフィアのバグのようですか? –
Arjit
ポリゴンのGeoJSONフォーマットは{"タイプ": "ポイント"、 "座標":[....]}、あなたのソリューションでは{"ポイント":[...] ]}。あなたのソリューションで1つのポリゴンをdbに保存する例がありますか?とにかく、これはMorphiaのバグではありませんが、私の意見では十分ではありません。うまくいけば、私たちはこの問題に遭遇した他の人々のために十分な情報を提供することができます。私が言及したHashMapの – RafalManka
私は2つの重要な値のペアを置く。 'loc.put(" type "、" Polygon "); loc.put( "coordinates"、coordinates); ' ここでcoordinateは' ArrayList> ' –
Arjit