Il termine GIS (Geographic information system) indica la cartografia numerica, un sistema per acquisizione, elaborazione e restituzione di dati territoriali. Per capirci, lavorare con le mappe al computer.
Software GIS ne esistono di vario genere, ad esempio ArcGIS, QGIS, Ilwis, ecc.
Ho ritrovato un programmino in C che ho scritto qualche anno fa, diciamo così per divertimento, poi riporto il codice, screenshot e spiego gli aspetti principali.
Prima i concetti fondamentali (ovviamente poi un software professionale avrà anche altre funzioni di vario genere) di come viene elaborato il tutto:
- la mappa, dati da acquisire ed elaborare è una matrice di celle (un quadrato formato da tanti quadratini)
- ogni cella (quadratino) non è un dato semplice (es. numero intero) ma un dato strutturato, che contiene più elementi, valori
- solitamente i dati geografici reali vengono importati e in tal caso occorre adottare uniformità di riferimenti, coordinate ecc (nel mio caso per semplicità li ho invece creati ad-hoc, random)
- l'elaborazione può essere di questo tipo: per ogni cella, si fa una somma pesata dei valori, in base al peso che si attribuisce ad ognuno di essi: alcuni sono vincolanti, altri invece vanno semplicemente pesati, esempio:
- vincolo paesaggistico: se c'è un vincolo per cui non si può intervenire, il valore da prendere è zero, indipendentemente se gli altri sarebbero buoni, ottimali
- se non c'è un vincolo, sommiamo i vari pesi, ad esempio (esempio a caso) la quota conta per il 50%, l'esposizione conta per il 30%, ecc... Il totale quindi è una somma pesata: dunque i valori risultanti più elevati indicano le celle (quindi le zone di territorio) con le condizioni ottimali, per i pesi assegnati ai parametri, è un criterio oggettivo per la scelta, questo è valido per interventi di vario genere a seconda dei casi
Con il mio programmino scritto in C, ho fatto questo:
- creo una matrice Nx * Ny (50x50)
- vincolo paesaggistico random, con il 5% di possibilità che ci sia, 95% che non ci sia
- quota random fra 0 e 1000, aggiustata in modo tale che siano meno probabili massimi o minimi ai bordi (scelta così, che ho deciso di fare)
- l'assegnazione dei pesi (tipo media pesata di cui parlavo prima) nel mio caso l'ho fatta in modo un po' più complesso ovvero dando maggiore importanza alla quota rispetto ai valori delle quote vicine (ad esempio, un punto di massimo locale, è più esposto al vento quindi adatto es. all'installazione di un impianto eolico...); nello specifico, valore 2 se vengono identificati come punto di massimo, valore 0 punti di minimo, altrimenti valore 1, situazione intermedia (che è poi la maggior parte dei casi)
- risultati: tenendo conto quindi di quota e vincolo paesaggistico, come risultati possiamo avere 0,1,2; nel primo caso, sono zone proprio da escludere (vincolo e/o punti di minimo), poi c'è il caso intermedio e le zone invece con valore 2 sono quelle che risultano ottimali, quindi le migliori da considerare per quello scopo
Riporto il codice del mio programmino (sono riuscito a restare sotto le 100 righe di codice 😁 ):
#include <stdio.h>
#include <stdlib.h>
#define Nx 50
#define Ny 50
#define MAX 1000
#define MIN 0
typedef struct{
float quota;
int val; //risultante
int vp; //0-1, vincolo paesaggistico
}cella;
int randomx(int min, int max);
int main() {
srand(time(0));
FILE *f1,*f2,*fvp;
f1=fopen("quote.txt","w");
cella V[Nx][Ny];
register short i,j;
//ciclo creazione dominio (anzichè caricarne uno)
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
V[i][j].val=1;
V[i][j].quota=randomx(MIN,MAX);
V[i][j].vp=randomx(0,19);
if(V[i][j].vp>1){V[i][j].vp=1;} //5% con vincolo, 95% senza vincolo
//no minimi, massimi ai bordi
if(i==0||i==N-1||j==0||j==N-1){
V[i][j].quota=randomx((int)(1.5*MIN),(int)(2.0/3*MAX));
}
}
}
fvp=fopen("vincolo_paes.txt","w");
//ciclo scrittura vicolo paesaggistico
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
fprintf(fvp,"%d",V[i][j].vp);
}fprintf(fvp,"\n");
}
fclose(fvp);
//ciclo scrittura rif.txt
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
if(V[i][j].vp==0){
V[i][j].val=0;
}else{
if(i!=0&&i!=Nx-1&&j!=0&&j!=Ny-1){ //no boundaries
//ricerca max,min neighbourhood
if(V[i][j].quota<V[i-1][j].quota&&V[i][j].quota<V[i+1][j].quota&&V[i][j].quota<V[i-1][j-1].quota&&V[i][j].quota<V[i][j-1].quota&&V[i][j].quota<V[i+1][j-1].quota&&V[i][j].quota<V[i-1][j+1].quota&&V[i][j].quota<V[i][j+1].quota&&V[i][j].quota<V[i+1][j+1].quota){
V[i][j].val=0; //min
}else{
if(V[i][j].quota>V[i-1][j].quota&&V[i][j].quota>V[i+1][j].quota&&V[i][j].quota>V[i-1][j-1].quota&&V[i][j].quota>V[i][j-1].quota&&V[i][j].quota>V[i+1][j-1].quota&&V[i][j].quota>V[i-1][j+1].quota&&V[i][j].quota>V[i][j+1].quota&&V[i][j].quota>V[i+1][j+1].quota){
V[i][j].val=2; //max
}
}
}
}
fprintf(f1,"%.0f ",V[i][j].quota);
}
fprintf(f1,"\n");
}
//fprintf(f1,"Legenda: 0=min, 1=intermedio, 2=max");
fclose(f1);
f2=fopen("results.txt", "w");
//ciclo scrittura results.txt (punteggi 0-1000)
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
fprintf(f2,"%d ",V[i][j].val);
}
fprintf(f2,"\n");
}
fclose(f2);
//ciclo stampa grafica a video
printf("0=min, 1=intermedio, 2=max:\n");
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
switch(V[i][j].val){
case 0: printf("0"); break; //min
case 1: printf("1"); break; //intermedio
case 2: printf("2"); break; //max
}
}
printf("\n");
}
return 0;
}
int randomx(int min, int max){
if(max>min){
return rand()%(max-min+1)+min;
}else{
return rand()%(min-max+1)+max;
}
}
Infine due immagini, uno screenshot del mio programma (file di testo creati e il risultato anche su terminale), poi altre rappresentazioni di software GIS.


Cosa ne pensate? Conoscete l'argomento GIS e cartografia numerica? 🙂