28
2013
Podział naturalny Jenks w PHP – Mapa Choropleth
Podaję opis użycia algorytmu podziału naturalnego Jenks dla map Choropleth. Autorem adaptacji tego algorytmu w PHP jest David Drake.
Szukałem długo rozwiązania swojego problemu z grupowaniem wyników na zakresy/klasy. Nie znalazłem nic co by omawiało od A do Z ten temat. Myślę, że także Tobie to się przyda :) Smacznego.
Zastosowanie
Algorytm podziału naturalnego pozwala na grupowanie wyników o zbliżonych do siebie wartościach. Następnie otrzymane zgrupowane wartości nanosimy na mapę. Jedna grupa, jeden kolor. Dzięki temu otrzymujemy mapę choropletha.
Przydatne przy dzieleniu/kolorowaniu map na obszary według podanych wartości.

Przykład
Mamy tablicę wartości zaludnienia dla województw (liczby abstrakcyjne):
- Świętokrzyskie => 45
- Lubelskie => 50
- Małopolskie => 55
- Mazowieckie => 57
- Kujawsko-Pomorskie => 58
- Warmińsko-Mazurskie => 60
- Podkarpackie => 60
- Wielkopolskie => 61
- Podlaskie => 61
- Łódzkie => 61
- Zachodniopomorskie => 62
- Pomorskie => 64
- Lubuskie => 66
- Dolnośląskie => 67
- Śląskie => 69
- Opolskie => 82
Przepuszczamy powyższe wartości przez funkcję grupującą.
Wynik:
I grupa 45-50:
- Świętokrzyskie => 45
- Lubelskie => 50
II grupa 55-58:
- Małopolskie => 55
- Mazowieckie => 57
- Kujawsko-Pomorskie => 58
III grupa 60-62:
- Warmińsko-Mazurskie => 60
- Podkarpackie => 60
- Wielkopolskie => 61
- Podlaskie => 61
- Łódzkie => 61
- Zachodniopomorskie => 62
IV grupa 64-69:
- Pomorskie => 64
- Lubuskie => 66
- Dolnośląskie => 67
- Śląskie => 69
V grupa 82:
- Opolskie => 82
Po naniesieniu na mapę otrzymujemy województwa zgrupowane wg. pięciu kolorów:

Użycie
Będziemy używać tylko dwóch funkcji getOptimalClassInformation oraz getMapKeys zawartych w skrypcie Davida.
1. Najpierw musimy doprowadzić do otrzymania tablicy o wyglądzie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Array ( [0] => 45 [1] => 50 [2] => 55 [3] => 57 [4] => 58 [5] => 60 [6] => 60 [7] => 61 [8] => 61 [9] => 61 [10] => 62 [11] => 64 [12] => 66 [13] => 67 [14] => 69 [15] => 82 ) |
Elementy muszą być posortowane według wartości od min do max, a klucze tablicy muszą być indeksowane co jeden.
2. Tablicę wrzucamy do funkcji getOptimalClassInformation.
1 |
$breaks = getOptimalClassInformation($arrayIn, 5, 5); |
Zwrotnie otrzymujemy tablicę zagnieżdżoną, która zawiera:
- Tablicę z maksymalnymi granicami grup.
- Tablicę z liczbą elementów zakwalifikowanych do każdej z grup.
Przekazywane parametry:
- Jako pierwszy parametr podajemy naszą tablicę z posortowanymi wartościami od min do max.
- Jako drugi parametr podajemy minimalną ilość grup jakie możemy otrzymać.
- Jako trzeci parametr podajemy maksymalną ilość grup jakie możemy otrzymać.
- Jeżeli chcemy otrzymać wyłącznie określoną liczbę grup, wpisujemy dwie takie same wartości dla drugiego i trzeciego parametru. W innym przypadku funkcja dobierze najbardziej odpowiednią liczbę klas/grup.
Wynik:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Array ( [0] => Array ( [0] => 45 // od zera do 45, 0 elementów [1] => 55 // od 45 do 55, 2 elementy [2] => 60 // od 55 do 60, 3 elementy [3] => 64 // od 60 do 64, 6 elementów [4] => 82 // od 64 do 82, 4 elementy [5] => 82 // od 82 do 82, 1 element ) [1] => Array ( [0] => 2 [1] => 3 [2] => 6 [3] => 4 [4] => 1 ) ) |
3. Używamy funkcję getMapKeys,
1 |
$arrayResult = getMapKeys($arrayIn, $breaks[0]); |
aby otrzymać ostateczny wynik pogrupowanych wartości w postaci zakresów.
1 2 3 4 5 6 7 8 |
Array ( [0] => 0 - 50 // dlaczego nie od 45? Because :) Poprawka we własnym zakresie. [1] => 55 - 58 [2] => 60 - 62 [3] => 64 - 69 [4] => 82 ) |
Przekazywane parametry:
- Jako pierwszy parametr wrzucamy tablicę wejściową, którą mieliśmy do obróbki $arrayIn.
- Jako drugi parametr przekazujemy zerowy element wynikowej tablicy $breaks do funkcji.
Dodatkowe informacje:
- Skrypt w PHP autora David Drake: https://github.com/randomdrake/jenks.
- Opis map choropleth: http://en.wikipedia.org/wiki/Choropleth_map.
Wkrótce opiszę jak wygenerować mapę choropleth w PHP przy pomocy biblioteki Imagick.
Stay tuned!

Podobne tematy
Dodaj komentarz
O mnie
Najnowsze wpisy
- Drzewo kategorii – budowa struktury od dołu do góry
- PHPExcel – export + import pliku XLS
- WordPress + Polylang – Tworzenie klasy CSS z ID strony/wpisu w wybranym języku
- Mailing – Poprawna konstrukcja szablonu maila HTML/CSS i prawidłowy wygląd w programie pocztowym
- Szukasz programisty PHP dla e-commerce?