使用Spring Data,Mongodb,如何避免重复顶点错误

时间:2017-09-23 17:03:54

标签: java spring mongodb

我在其中一个导入的多边形中出现错误。

{"started":"2017-09-23T10:29:30.626Z","uptime":48.709}

完整堆栈跟踪:https://gist.github.com/boundaries-io/927aa14e8d1e42d7cf516dc25b6ebb66#file-stacktrace

GeoJson MultiPolygon I am importing using Spring Data MongoDB

Write failed with error code 16755 and error message 'Can't extract geo keys: { _id: "b9c5ac0c-e469-4b97-b059-436cd02ffe49", _class: .... ] Duplicate vertices: 0 and 15'

如何在Java中避免此错误?

我可以在http://geojson.io

中加载geojson

这是GEOJSON:https://gist.github.com/boundaries-io/4719bfc386c3728b36be10af29860f4c#file-rol-ca-part1-geojson

使用以下方法删除重复项:

public class MyPolgyon {

    @Id
    String id;

    @GeoSpatialIndexed(type=GeoSpatialIndexType.GEO_2DSPHERE)
    GeoJsonPoint position;

    @GeoSpatialIndexed(type=GeoSpatialIndexType.GEO_2DSPHERE)
    GeoJsonPoint location;

    @GeoSpatialIndexed(type=GeoSpatialIndexType.GEO_2DSPHERE)
    GeoJsonPolygon polygon;





public static GeoJsonPolygon generateGeoJsonPolygon(List<LngLatAlt> coordinates) {
        List<Point> points = new ArrayList<Point>();
        for ( LngLatAlt  point: coordinates) {                          
                org.springframework.data.geo.Point dataPoint = new org.springframework.data.geo.Point( point.getLongitude() ,point.getLatitude());              
                points.add(dataPoint);          
            }   
        return new  GeoJsonPolygon(points);
    }

日志记录:

for (com.vividsolutions.jts.geom.Coordinate coordinate : geometry.getCoordinates()) {
    Point lngLatAtl = new Point(coordinate.x, coordinate.y);
    boolean isADup = points.contains(lngLatAtl);
    if ( !notDup ){
        points.add(lngLatAtl);
    }else{
        LOGGER.debug("Duplicate,  [" + lngLatAtl.toString() +"] index["  + count  +"]");
    }
    count++;
}

1 个答案:

答案 0 :(得分:2)

在这种情况下,您在索引0处具有重复的顶点,而在第二个多边形处具有索引1341。

[ -62.95859676499998, 46.20653318300003 ]

当Mongo db尝试为文档构建2d球体索引时,插入失败。删除索引1341处的坐标,您应该能够成功保留。

您必须在发现错误时清理数据。 您可以编写一个小程序来读取mongo db中的错误,并将更新提供给客户端。客户可以对这些消息采取行动,然后再次尝试请求。

可以找到有关地理错误的更多信息here。 您可以在此处查看GeoParser的代码,以了解如何生成错误/生成错误。对于您遇到的具体错误,您可以查看GeoParser。这个error由Mongodb用于验证的S2库生成。