2016-07-27 11 views
2

Ich analysiere eine JSON-Datei, die eine Menge von multipolygons zu Realm enthält. Ich habe es auf die folgende Weise einstellen:Realm Android und große Datensätze mit Multipolygon-Berechnungen

RealmMultiPolygon Klasse:

public int dangerLevel; 
public int timeOfDay; 

public RealmList<RealmPolygon> realmPolygons 

RealmPolygon Klasse:

public RealmList<RealmPolygonCoordinate> coordinates; 

RealmPolygonCoordinate

public double latitude; 
public double longitude; 

Soweit Artikel betreffen:

  • RealmMultiPolygon enthält 8 Artikel
  • RealmPolygon enthält 22260 Einträge
  • RealmPolygonCoordinate enthält 352.241 Artikel

Ich versuche, herauszufinden, ob ein RealmPolygon in ist eine Richtung, in die ich schaue und in der Nähe meiner gegenwärtigen Position. Ich nehme 31 locationsamples mit Lagern wie folgt aus:

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

Wo compassData vom RotationVectorSensor (Wert zwischen 0 und 360 Grad) gewonnen wird und die MAX_DISTANCE 1.5Km ist.

Wenn ich jetzt wissen will, ob einer der 31 locationSample Punkte in der Nähe eines Polygons ist, muss ich alle PolygonCoordinates, die ich momentan in meiner Realm Datenbank habe, 31 Mal durchlaufen. Das bedeutet: 31 * 352241 = 10919471

Das ist unglaublich langsam, aber ich kann nicht wirklich eine bessere Lösung dafür finden. Hat jemand eine Idee, wie man das besser/schneller macht?

Update 1 Im Moment bin ich durch die Koordinaten wie folgt Looping:

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

Du könntest es parallel machen –

+0

* Ich muss alle polygonCoordinates, die ich momentan in meiner Realm-Datenbank habe 31 mal durchschleifen * wie machst du das? –

+0

können Sie den Codeblock anzeigen, der die Abfrage in Realm und der Schleife ausführt? –

Antwort

1

ich dies schließlich kommen mit einem ganz anderen Lösung fixiert. Ich erstelle jetzt ein Bild basierend auf der Breite und Höhe des Bereichs, in dem sich die Polygone befinden, als Hintergrundaufgabe. Dann berechne ich die Pixelposition basierend auf dem von mir verwendeten locationsample und verwende die getPixel-Methode, um die Pixel an dieser Position zu erhalten. Dies ist viel schneller als das Durchlaufen jedes Polygons.

Verwandte Themen