2016-12-02 15 views
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 

答えて

1

同様の問題があり、以下の結論に至りました。カスタムクラスを使用する代わりに、Morphiaが提供するものを使用する必要があります。主に次のようにポリゴンを作成することができます:

import org.mongodb.morphia.geo.Point; 
import org.mongodb.morphia.geo.Polygon; 
import org.mongodb.morphia.geo.GeoJson; 

public class Main { 
    private static PlaceDAO placeDAO = ...; 

    public static void main(String[] args) {    
     Place place = new Place(); 

     Point point1 = GeoJson.point(0.0, 0.0); 
     Point point2 = GeoJson.point(0.0, 0.1); 
     Point point3 = GeoJson.point(0.1, 0.0); 
     Point point4 = GeoJson.point(0.0, 0.0); 
     Polygon location = GeoJson.polygon(point1, point2, point3, point4); 

     place.setLocation(location); 

     placeDAO.save(place); 
     List<Place> places = shopDAO.find().asList(); 
    } 
} 

2dsphereインデックスを作成して$ intersectクエリを実行すると問題はありません。

+0

私は、 'private HashMap loc = new HashMap ()'のようなハッシュマップを作成し、 'ArrayList >座標全体をマップに値として入れました。しかしそれは回避策です。モルフィアのバグのようですか? – Arjit

+0

ポリゴンのGeoJSONフォーマットは{"タイプ": "ポイント"、 "座標":[....]}、あなたのソリューションでは{"ポイント":[...] ]}。あなたのソリューションで1つのポリゴンをdbに保存する例がありますか?とにかく、これはMorphiaのバグではありませんが、私の意見では十分ではありません。うまくいけば、私たちはこの問題に遭遇した他の人々のために十分な情報を提供することができます。私が言及したHashMapの – RafalManka

+0

私は2つの重要な値のペアを置く。 'loc.put(" type "、" Polygon "); loc.put( "coordinates"、coordinates); ' ここでcoordinateは' ArrayList > ' – Arjit

関連する問題