Colorare migliaia di poligoni in modo che ognuno sia distinto dai suoi vicini?


28

Sto usando ArcGIS 10 e ho livelli dei blocchi censimento 2010, gruppi di blocchi e volantini. Ci sono migliaia di poligoni in questi strati.

Voglio colorarli in modo che ognuno sia distinto dai suoi vicini, ma tutto quello che riesco a capire è come dare a ciascuno un colore distinto. Il colore di ogni poligono non ha importanza; Voglio solo distinguere facilmente ciascuno dal suo vicino per colore, piuttosto che con un bordo.

O è qualcosa che vedi solo in una mappa della scuola elementare dei 50 Stati Uniti?


9
(1) punto di vista tecnico, ArcGIS non fornire colori distinti, perché può selezionarli casualmente tra (credo) una tavolozza di 2 ^ 24, e quindi le probabilità di due vicini di ottenere esattamente lo stesso colore sono bassi. Questo suggerisce che vuoi davvero riparare un piccolo numero di colori facilmente differenziabili e assegnarli in modo che nessun poligono vicino ottenga lo stesso colore. C'è un algoritmo per farlo per cinque o più colori quando tutti i poligoni sono collegati e semplicemente connessi. (Il collettore ha una procedura integrata per colorare ogni strato di poligono in cinque colori :-).)
whuber

6
C'è anche un plugin in QGIS chiamato "topocolour" che fornisce questa funzionalità. Potresti essere in grado di guardare il loro codice e creare qualcosa da solo se non riesci a trovare un'utilità fissa in ArcGIS.
Ryan Dalton,

9
Ho scritto il summenzionato plugin topocolour! Penso che potrebbe avere difficoltà con migliaia di poligoni, per risolvere tutte le adiacenze. Di recente ho anche scritto una versione in R nel caso in cui qualcuno volesse colorare le mappe in R in quel modo. Non toccherò ArcGIS però!
Spacedman

2
A proposito, ArcGIS ha ora procedure interne efficienti per il calcolo delle adiacenze dei poligoni. Ricordo di aver fatto tutti i blocchi all'interno di uno stato (circa mezzo milione di essi) in circa 30 minuti: 15 per i calcoli, 15 per la scrittura del file di adiacenza. Con le macchine più recenti il ​​lavoro andrebbe 5-10 volte più veloce. Quindi potresti avere il tuo codice R da masticare su un file di adiacenza prodotto da ArcGIS, che suona come un modo ottimale per utilizzare entrambe le piattaforme per questo problema.
whuber

2
"Quattro colori bastano" (qualcuno doveva dirlo).
Barrycarter,

Risposte:




0

Ho codificato uno strumento ArcPy che assegna un attributo dall'elenco fornito ai poligoni usando una tabella di vicinato in modo che nessun vicino condivida lo stesso colore. Di solito riesce a usare meno di sei colori usando un semplice grafico euristico di colorazione (o, se necessario, può assegnare i colori in modo casuale, rispettando comunque il vicinato).

La cassetta degli attrezzi insieme ad alcuni documenti può essere scaricata da http://geocite.ic.cz/coloring.zip .



0

Esegui un riempimento Flood sui poligoni in Python aggiungendo una determinata quantità di cambio colore a una chiamata ricorsiva alla funzione di riempimento flood, alterando il colore mentre procedi.


-2

potresti applicare la classificazione della simbologia su un campo identificatore / GWID univoco.


9
Ciò non garantisce un colore unico tra i poligoni vicini

Dovrebbe essere poiché il valore RGB può variare da 0 a 255 per ciascuno, il che significa che esiste una vasta gamma di combinazioni per i valori R, B e G. quindi tecnicamente non avrai la stessa tonalità, a meno che tu non abbia ben oltre un miliardo di record unici.
GISdork,

4
Questa tecnica non garantisce che due poligoni adiacenti abbiano colori diversi per "distinguere facilmente ogni [poligono] dal suo vicino". Anche se le combinazioni RGB sono uniche, possono sembrare molto simili. Quindi se a due poligoni vicini vengono assegnati valori simili, non sarà facile / possibile distinguerli. Si prega di vedere il primo commento di Whuber sulla domanda originale.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.