2016-08-17 40 views
5

Mam zestaw danych szerokości i długości geograficznej do wypełniania mapy ciepła. Dane są zbyt duże i będą rosły z dnia na dzień. Muszę zmniejszyć ilość danych bez większego wpływu na wydajność mapy ciepła. Rozumiem, że możemy dodać jeszcze jedno pole dla "wagi" i połączyć dwa punkty poboczne, aby utworzyć nowy punkt z "wagą" jako sumą dwóch pierwszych. Ale jestem zdezorientowany, gdzie umieścić nowy punkt. Nie sądzę, że będzie to standardowy sposób na rozwiązanie mojego problemu. Używam golanga do wdrożenia, ale wszystkie pomysły są mile widziane. Dziękuję Ci.Jak agregować zestaw danych z geokodów, aby zmniejszyć tam liczby dla mapy ciepła?

+2

użycie wagi do średniej ważonej i umieścić przesunąć punkt nieznacznie. na przykład jeżeli punkt A ma 0,9, a punkt B 0,1, nowy punkt powinien wynosić około 0,1 linii łączącej A i B, w pobliżu A. –

+2

Dwa ważne pytania: 1. Co powinna reprezentować mapa termiczna, tj. jaka jest definicja idealnego, nie -lossy wynik? Kiedy już to zdefiniujesz, pytanie 2. brzmi: jakie odchylenia od 1. czy możesz zaakceptować? –

+0

@ RafałDowgird Mapa cieplna przedstawia ruch pojazdu. –

Odpowiedz

0

Jak wspomniano przez komentującego, rozważ użycie na przykład średniej ważonej punktów.

Wybierz próg bliskości, w ramach którego zostaną zebrane punkty. Dla każdego z tych punktów wygeneruj punkt syntetyczny, którego współrzędne są średnią (medianą) pozostałych, a ich waga to liczba punktów, o których mowa. Uwzględnij tylko syntetyczne punkty ważone podczas generowania mapy ciepła, aby zmniejszyć ilość danych, dostosowując próg zbliżeniowy.

Na przykład:

type Point struct{ X, Y float32 } 

type WeightedPoint struct{ Weight, X, Y float32 } 

func GetWeightedPoint(ps []Point) WeightedPoint { 
    n := float32(len(ps)) 
    wp := WeightedPoint{Weight: n} 
    if n > 0 { 
     for _, p := range ps { 
      wp.X += p.X 
      wp.Y += p.Y 
     } 
     wp.X /= n 
     wp.Y /= n 
    } 
    return wp 
} 

func main() { 
    ps := []Point{{0.0, 0.0}, {1.0, 0.0}, {0.5, 1.0}} 
    fmt.Printf("OK: %#v\n", GetWeightedPoint(ps)) 
    // OK: main.WeightedPoint{Weight:3, X:0.5, Y:0.33333334} 
}