Realm Android和大型数据集,具有多字形计算功能

时间:2016-07-27 09:45:50

标签: android realm coordinates polygon large-data

我正在解析一个Json文件,其中包含许多Realm的多重多边形。我按照以下方式进行了设置:

RealmMultiPolygon类:

public int dangerLevel;
public int timeOfDay;

public RealmList<RealmPolygon> realmPolygons

RealmPolygon类:

public RealmList<RealmPolygonCoordinate> coordinates;

RealmPolygonCoordinate

public double latitude;
public double longitude;

就项目而言:

  • RealmMultiPolygon包含8个项目
  • RealmPolygon包含22260个项目
  • RealmPolygonCoordinate包含352241个项目

我正在试图弄清楚RealmPolygon是否在我正在查看当前位置的方向。我带着31个地点样品用这样的轴承:

private void calculateUserDirectionLocations() {
    Log.d(Constants.DEBUG, "update the locationbar");
    if(compassData < 0) {
        return;
    }
    int step = 50;

    int bearingstep = 1;

    double bearing = Math.round(compassData / bearingstep) * bearingstep;

    if(userLocation != null) {
        if(Math.abs(bearing - oldBearing) > 1) {
            locationSamples.clear();

            Log.d(Constants.DEBUG, "START location samples");

            for(int i = 0; i <= Constants.MAX_DISTANCE; i+=step) {
                if (i % step == 0) {
                    locationSamples.add(locationWithBearing((double) i));
                }
            }

            Log.d(Constants.DEBUG, "END location samples");

            updateColors();
            oldBearing = bearing;
        }
    }
}

其中compassData是从RotationVectorSensor获得的(0到360度之间的值),MAX_Distance是1.5Km。

现在,如果我想知道31个locationSample点中的一个是否接近多边形,我必须遍历我目前在Realm数据库中拥有的所有polygonCoordinates 31次。意思是: 31 * 352241 = 10919471

这非常缓慢,但我似乎无法找到更好的解决方案。任何人都知道如何更好/更快地做到这一点?

更新1 目前我循环遍历这样的坐标:

for(RealmMultiPolygon rmp : area.avalanche.multiPolygon) {
                if(rmp.timeOfDay == 2) {
                    for (RealmPolygon polygon : rmp.realmPolygons) {
                        for(LatLng sample : locationSamples) {
                            tempPoint = new LatLng(polygon.coordinates.first().latitude, polygon.coordinates.first().longitude);
                            if(SphericalUtil.computeDistanceBetween(tempPoint, sample) <= 500) {
                                coords.add(tempPoint);
                            } else {
                                break;
                            }
                        }
                    }
                }
            }

1 个答案:

答案 0 :(得分:1)

我最终提出了一个完全不同的解决方案。我现在正在根据多边形所在区域的宽度和高度创建一个图像作为后台任务。然后我根据我拍摄的位置样本计算像素位置,并使用getPixel方法获取该位置上的像素。这比循环遍历每个多边形要快。