Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用Morphia和Java在Mongodb中存储GeoJson多边形对象_Java_Mongodb_Polygon_Geojson_Morphia - Fatal编程技术网

无法使用Morphia和Java在Mongodb中存储GeoJson多边形对象

无法使用Morphia和Java在Mongodb中存储GeoJson多边形对象,java,mongodb,polygon,geojson,morphia,Java,Mongodb,Polygon,Geojson,Morphia,我正在尝试使用Morphia将GeoJson多边形对象存储到Mongodb。请注意,GeoJson多边形坐标必须是3级深数组,如下所示 { type: "Polygon", coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ] } 下面是我的实体类 static class Loc { private final String type = "Polygon"; priva

我正在尝试使用Morphia将GeoJson多边形对象存储到Mongodb。请注意,GeoJson多边形坐标必须是3级深数组,如下所示

{
  type: "Polygon",
  coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] ]
}
下面是我的实体类

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);

        }
    }

有同样的问题,并得出以下结论。您应该使用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();
    }
}
import org.mongodb.morphia.geo.Point;
导入org.mongodb.morphia.geo.Polygon;
导入org.mongodb.morphia.geo.GeoJson;
公共班机{
私有静态PlaceDAO PlaceDAO=。。。;
公共静态void main(字符串[]args){
地点=新地点();
point1=GeoJson.Point(0.0,0.0);
point2=GeoJson.Point(0.0,0.1);
point3=GeoJson.Point(0.1,0.0);
point4=GeoJson.Point(0.0,0.0);
多边形位置=GeoJson.Polygon(点1、点2、点3、点4);
地点。设置地点(地点);
保存(地点);
List places=shopDAO.find().asList();
}
}

您可以创建2dsphere索引并执行$intersect查询,没有问题。

我最终创建了一个hashmap,如
private hashmap loc=new hashmap()
,然后将整个
ArrayList坐标作为值放入映射中。但这是一个解决办法。似乎是Morphia中的一个bug?这不起作用,因为多边形的GeoJSON格式是{“类型”:“点”,“坐标”:[…]},而您的解决方案是{“点”:[…]}。你能给出一个用你的解决方案将一个多边形保存到db中的例子吗?无论如何,这在Morphia中不是一个bug,但在我看来,文档是不够的。希望我们能为其他偶然发现这个问题的人提供足够的信息。我放置了两个键值对<代码>位置放置(“类型”、“多边形”);位置放置(“坐标”,坐标)这里的坐标是一组类型为
ArrayList
的点。哦,如果你是对的,这实际上可能会起作用。但是有什么理由不使用Morphia提供的GeoJson工厂吗?我的选择是因为我有一个用例。我使用的是返回
ArrayList
的算法。所以我节省了一些处理和堆空间。
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();
    }
}