[Grass-de] Raster-rechnen

Martin Schweizer schweizermartin at students.unibe.ch
Sa Okt 3 00:21:58 CEST 2009


Hallo Tom

Vielen Dank für deine Antwort. Ich glaube so langsam komme ich der
Lösung näher. Nun habe ich jedoch folgendes seltsame Problem:

mapcalc> y=0
mapcalc>
"result=(if(Siedlungsflaeche,(if((Eignung42[-1,0])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[-1,1])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[0,1])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[1,1])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[1,0])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[1,-1])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[0,-1])&&(result<5),$y+Eignung42&&6,result)||if((Eignung42[-1,-1])&&(result<5),$y+Eignung42&&6,result)),0)"
syntax error, unexpected ';', expecting '='
mapcalc> Siedlungsflaeche-$y
mapcalc> y=0)

Man beachte die Zeile "syntax error, unexpected ';', expecting '='"

ähm also ich habe an keiner Stelle ein ; in diesem ganzen Befehl... Aber
sehr wohl ein =. Also sehe ich nicht ganz wo das Problem liegt...?

Vielen Dank und ein schönes Wochenende

Martin

Tom Gottfried schrieb:
> Du kannst in der Shell einer Variable einen Wert zuweisen
>
> y=3
>
> und auf diesen dann mit
>
> $y
>
> zugreifen.
>
> Tom
>
> Martin Schweizer schrieb:
>   
>> Hallo Tom
>>
>> Vielen Dank für den Hinweis. Ja, r.mapcalc kenne ich. Ich habe damit
>> auch schon herumgespielt. Ein wirklich tolles Teil (Vorallem jetzt auch
>> mit dem GUI in QGis). Ich habe dafür auch mal versucht ein Skript zu
>> schreiben:
>>
>> Endkarte = (
>>
>> if(Siedlungsraster1,(
>>
>> # Wenn eine Zelle auf dem Siedlungsraster1 nicht 0 ist, dann:
>>
>>  
>> if((Landwirtschaftsraster[-1,0])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[-1,1])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[0,1])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[1,1])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[1,0])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[1,-1])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[0,-1])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)||
>>  
>> if((Landwirtschaftsraster[-1,-1])&&(Endkarte<5),y+Landwirtschaftsraster&&6,Endkarte)),Endkarte)
>>
>> #Wenn die Zellen [-1,0 etc.] auf dem Landwirtschaftsraster nicht 0 sind
>> und auf der Endkarte nicht über 5 sind, dann addiere den Zellenwert der
>> Variable y und gib der Zelle auf der Endkarte den Wert 6. #Wenn nicht,
>> übernehme den Wert der Endkarte. Wenn auf dem Siedlungsraster NULL ist,
>> übernehme den Wert der Endkarte.
>>
>> Siedlungsraster1 - y
>>
>> # Subtrahiere den kumulierten Wert der Zellen des Landwirtschaftsrasters
>> die auf der Endkarte mit 6 markiert wurden vom Siedlungsraster
>>
>> )
>>
>> End
>>
>> (Ist jetzt hier der Übersichtlichkeitshalber mit Zeilentrenner
>> dargestellt ;-) ).
>>
>> Nun, das Hauptproblem das ich habe ist, dass mapcalc keine Variablen
>> kennt. Ich kann also nicht etwas in eine Variable schreiben und das dann
>> irgendwann von irgend einer Zelle subtrahieren (oder so). Weiss jemand
>> ob es irgend eine Möglichkeit gibt, in Mapcalc mit Variablen zu arbeiten
>> (in meinem Beispiel "y")? Oder sieht jemand eine Möglichkeit, das ganze
>> ohne Variable zu rechnen?
>>
>> Vielen Dank noch einmal und ein schönes Wochenende
>>
>> Martin
>>
>> Tom Gottfried schrieb:
>>     
>>> Hallo Martin,
>>>
>>> vielleicht in nützlicher Hinweis: r.mapcalc
>>>
>>> Tom
>>>
>>> Am 28.09.2009 um 13:52 schrieb Martin Schweizer:
>>>
>>>       
>>>> Liebe Liste
>>>>
>>>> Ich habe ein etwas komplizierteres Problem. Es handelt sich um
>>>> folgendes: Ich habe eine Rasterkarte (rast1), auf welcher einzelne
>>>> Punkte einen bestimmten Wert haben. Dieser Wert gibt an, wie viele
>>>> Rasterzellen um diesen Punkt herum "markiert" werden müssen. Dann habe
>>>> ich eine andere Rasterkarte (rast2), welche angibt, wie viel "Wert" (von
>>>> 1 - 4) diese Zellen haben. Nun sollte eine neue Rasterkarte entstehen,
>>>> auf welcher Zellen auf den Wert 5 gesetzt werden im Wert der auf rast1
>>>> angegebenen Zahl.
>>>> Beispiel: Auf Rast1 hat eine Zelle den wert 17. Auf Rast2 haben die
>>>> Zellen um diese Zelle von Rast1 herum Werte zwischen 1 und 4. Nun sollen
>>>> so viele Zellen um diese Zelle auf Rast1 herum markiert werden (auf 5
>>>> gesetzt), bis die Werte all dieser Zellen auf Rast2 (2 + 2 + 1 + 4 +
>>>> ....) den Wert 17 ergibt. Dann soll auf Rast1 weiter gefahren werden
>>>> (Sind insgesamt 245 Punkte).
>>>>
>>>> Rast1:
>>>>
>>>> 0 0 0 0 0 0 0 0 0 0
>>>> 0 0 0 0 0 0 0 0 0 0
>>>> 0 0 0 0 17  0 0 0 0
>>>> 0 0 0 0 0 0 0 0 0 0
>>>> 0 0 0 0 0 0 0 0 0 0
>>>>
>>>> Rast2:
>>>>
>>>> 2 2 2 1 1 1 2 2 3
>>>> 0 1 1 1 2 2 2 3 3
>>>> 0 0 1 2 2 2 2 2 3
>>>> 0 2 2 1 1 1 3 3 3
>>>> 0 0 3 4 4 1 1 1 1
>>>>
>>>> Endkarte:
>>>>
>>>> 0 0 0 0 0 0 0 0 0 0
>>>> 0 0 0 5 5 5 0 0 0 0
>>>> 0 0 5 5 5 5 5 0 0 0
>>>> 0 0 0 5 5 5 0 0 0 0
>>>> 0 0 0 0 0 0 0 0 0 0
>>>>
>>>>
>>>> Habt ihr irgend eine Lösung (oder Hinweise), wie ich das machen könnte?
>>>>
>>>> Vielen Dank und viele Grüsse
>>>>
>>>> Martin
>>>> _______________________________________________
>>>> Grass-de-liste mailing list
>>>> Grass-de-liste at fossgis.de
>>>> https://lists.fossgis.de/mailman/listinfo/grass-de-liste
>>>>         
>
>