Mehr

Wie überschreiben Sie die erforderlichen Create Fishnet-Parameter in ArcMap 10.1?

Wie überschreiben Sie die erforderlichen Create Fishnet-Parameter in ArcMap 10.1?


Ich schreibe ein Python-Skript, das ein Netz in einem angegebenen Bereich (Parzellen-Shapefile) erstellt, das Benutzereingaben akzeptiert, um ein Polygon-Shapefile zu erstellen, das ein Gebäude darstellt, und ein Polylinien-Shapefile, das einen Parkplatz im Flurstück darstellt. In ArcMap können Sie den optionalen Parameter "Vorlagenausdehnung" auswählen, der automatisch die Y-Achse und die vom Werkzeug benötigten Ursprungskoordinaten auffüllt. Ich bekomme immer diese Fehlermeldung, wenn ich mein Skript ausführe:

ExecuteError: Fehler beim Ausführen. Parameter sind ungültig. FEHLER 000735: Fischnetz-Ursprungskoordinate: Wert ist erforderlich FEHLER 000735: Y-Achsen-Koordinate: Wert ist erforderlich Ausführung fehlgeschlagen (CreateFishnet).

In meiner CreateFIshnet-Syntax führt die Verwendung von "#" in origin_coord und y_axis coord zu einem Fehler, anstatt die Anforderung an das optionale {template} zu übergeben.

Gibt es einen Weg, dies zu umgehen? Ich möchte, dass der optionale Parameter {template} Priorität hat, aber ich frage mich, ob ich Punkte innerhalb des angegebenen Bereichs erstellen und diese Koordinaten an die Netzparameter übergeben muss?


Es ist immer schwierig, zu ArcPy-Code Ratschläge zu geben, wenn ein Snippet nicht in einer Frage enthalten ist.

Ich vermute jedoch, dass eine Ihrer Variablen nicht auf das eingestellt ist, was Sie denken, bevor Sie sie in der Codezeile von CreateFishnet verwenden.

Zum Testen empfehle ich, einige hinzuzufügendruckenund/oderarcpy.AddMessageLinien, um ihre Werte zu sehen.

Aus einer anderen Richtung kommend empfehle ich auch die Verwendung von Copy As Python Snippet aus demGeoverarbeitung | Ergebnisse-Fenster, um die korrekte Syntax abzurufen, die es bei einer erfolgreichen Ausführung des Tools "Create Fishnet" aus seinem Tool-Dialog schreibt. Eine funktionierende Syntax zum Vergleich zu haben, kann Wunder bewirken.

In Bezug auf den optionalen Parameter {template}, der beim Create Fishnet-Tool so gut funktioniert, liegt dies daran, dass dieses Systemtool einen Tool-Validierungscode ausführt, um die relevanten Werte zu berechnen. Es ist dieser Code, von dem ich vermute, dass Sie versuchen oder müssen, ihn in Ihrem Skript zu reproduzieren.


ModelBuilder.Configurations.Add und modelBuilder.Entity auf OnModelCreating

Ich habe gerade mit der Arbeit an dem ersten Ansatz für den Entity-Framework-Code begonnen, ich habe unten zwei Ansätze geschrieben und beide funktionieren gut.

Bitte lassen Sie mich wissen, was die Kernkonzepte dieser beiden Ansätze sind und was folgen soll.

Ansatz 1: Verwenden von EntityTypeConfiguration

Ansatz 2:

Bitte stellen Sie mir Konzept/Blogs zur Entität zur Verfügung, da ich gerade erst angefangen habe.


Umgebungseinstellungen

Umgebungseinstellungen können als zusätzliche Parameter betrachtet werden, die die Ergebnisse eines Werkzeugs beeinflussen. Sie unterscheiden sich von normalen Werkzeugparametern dadurch, dass sie (mit bestimmten Ausnahmen) nicht im Dialogfeld eines Werkzeugs erscheinen. Es handelt sich vielmehr um Werte, die Sie einmal über ein separates Dialogfeld festlegen und die bei der Ausführung von Tools abgefragt und verwendet werden.

Das Ändern der Umgebungseinstellungen ist häufig eine Voraussetzung für die Durchführung von Geoverarbeitungsaufgaben, z. B. die Umgebungseinstellungen für den aktuellen Arbeitsbereich und den Scratch-Workspace, mit denen Sie Arbeitsbereiche für Eingaben und Ausgaben festlegen können. Ein weiteres Beispiel ist die Umgebungseinstellung Ausdehnung, mit der Ihre Analyse auf einen kleinen geografischen Bereich beschränkt werden kann, oder die Umgebungseinstellung Ausgabe-Koordinatensystem, die das Koordinatensystem (Kartenprojektion) für neue Daten definiert.

Es gibt vier Ebenen der Umgebungseinstellungen.

  1. Anwendungsebene Einstellungen sind die Standardeinstellungen, die auf jedes Werkzeug angewendet werden, wenn es ausgeführt wird.
  2. Werkzeugebene Einstellungen werden auf einen einzelnen Lauf eines Tools angewendet und überschreiben die Einstellungen auf Anwendungsebene.
  3. Modellebene Einstellungen werden mit einem Modell angegeben und gespeichert und überschreiben Einstellungen auf Werkzeugebene und Anwendungsebene.
  4. Modellprozessebene Einstellungen werden auf Modellprozessebene angegeben, mit dem Modell gespeichert und überschreiben die Einstellungen auf Modellebene.

Benannte Abhängigkeiten und Fabriken sind nicht der richtige Weg, um damit umzugehen.

Ja, Sie missbrauchen Ihren IOC-Container. Das Prinzip von DI besteht darin, nach dem zu fragen, was Sie brauchen. Sie benötigen einen IEnumerable<IValidationType> (eine IList ist hier ungeeignet, da Sie sie nicht ändern sollten und keinen Direktzugriff benötigen). Aber anstatt nur nach einem IEnumerable<IValidationType> zu fragen, fragen Sie nach zwei verschiedenen Implementierungen. Wie Sie festgestellt haben, verstößt dies gegen Open/Closed, da sich Ihre Fabrik jedes Mal ändert, wenn Sie eine neue Implementierung entwickeln.

Ich verstehe auch den Sinn deiner Fabrik nicht. Es scheint 0 Verantwortlichkeiten zu haben. Schreiben Sie anstelle der Fabrik das Composite.

Dann lassen Sie Ihren IOC-Container diesen Verbund mit den richtigen Komponentenimplementierungen als kanonischen IValidationType registrieren. Reflexion kann hier dein Freund sein.

Ich bin vehement dagegen, jemals benannte Abhängigkeiten zu verwenden, da dies gegen die vernünftige Regel verstößt, dass das Umbenennen eines Methodenparameters immer ein sicherer Refactor sein sollte.


Optimierte Hotspot-Analyse

Entfernen Sie alle Layer aus der Karte mit Ausnahme der beiden ursprünglichen Layer mit den Einbruchsdaten und den Nachbarschaften. Von dem Werkzeugkasten navigiere zu Räumliche Statistiktools > Mapping-Cluster und öffne die Optimierte Hotspot-Analyse Werkzeug. Dieses Tool ermöglicht eine schnelle Hotspot-Analyse mit minimalen Eingabeparametern und setzt/berechnet Standardparameter für diejenigen, über die Sie keine Kontrolle haben. Für mehr Kontrolle über die statistischen Elemente können Sie die Hotspot-Analyse (Getis-Ord GI*) Werkzeug. Vorerst verwenden wir den optimierten Ansatz.

Legen Sie die Einbruchspunkte als Eingabefunktionen, nenne deinen Ausgabefunktionen (hier habe ich sie ohsa_burg_plygns genannt), wähle COUNT_INCIDENTS_WITHIN_AGGREGATION_POLYGONS für die Methode zur Aggregation von Vorfalldaten und wählen Sie die Nachbarschaftsfunktionen für die Polygone zum Aggregieren von Vorfällen in Anzahlen.


Was passiert, wenn ich eine Kelvin-Klasse hinzufüge, ohne die anderen Klassen zu ändern? Wenn ich Celsius in Kelvin umrechne, sagt Ihr Code, dass 20 ° C = 20 K ist, was einfach falsch ist.

Ihr ganzer Ansatz ist zum Scheitern verurteilt. Stattdessen sollten Sie eine Referenztemperaturskala definieren. Dafür würde ich Kelvin nehmen. Dann haben Sie für jede andere Temperaturskala Methoden von Kelvin und bis Kelvin. Das ist alles. Dieser Ansatz ist von der Konstruktion von Compilern bekannt, die das gleiche Problem mit mehreren ähnlichen Quellsprachen und mehreren verschiedenen Zielmaschinen haben.

Um zwischen beliebigen Temperaturskalen umzurechnen, können Sie eine Hilfsmethode in der Temperaturklasse wie diese haben:

Sie sehen, dass es sich um zwei völlig unterschiedliche Klassen handelt:

  1. Eine Temperaturskala wie Kelvin oder Fahrenheit
  2. Eine bestimmte Temperatur, bestehend aus einer Temperaturskala und einem Wert wie 293 Kelvin

Zur Ausnahmeklasse: Es gibt keinen guten Grund, ihr einen String-Parameter zu geben. Der Name der Klasse ist schon aussagekräftig genug. Daher sollten Sie diesen Parameter entfernen und einfach new AbsoluteZeroException() werfen. Sie sollten es wahrscheinlich in BelowAbsoluteZeroException umbenennen. Oder Sie sollten einfach die vordefinierte IllegalArgumentException nehmen und gut sein. In vielen Fällen müssen Sie keine eigenen Ausnahmeklassen erfinden.

Die Verwendung von 2 Klassen hier macht keinen Sinn.

Jedes Mal, wenn Sie eine weitere Klasse hinzufügen, müssen Sie jede Klassenkonvertierungsmethode ändern.

Es gibt eine enge Kopplung zwischen Celsius und Fahrenheit. Sie verwenden eine Instanz von Fahrenheit, um den Typ zu bestimmen, in den Sie konvertieren möchten. Dies ist nicht notwendig.

Hinweis: Bei der Programmierung möchten Sie geringe Kopplung, hohe Kohäsion. Viele Informationen sind online verfügbar

Temperaturen würden als ENUM besser funktionieren. Dann kannst du sowas machen:

Sie können dem Beispiel von java.util.Date folgen. Die interne Darstellung eines Datums erfolgt immer in UTC und wird bei Bedarf in andere Zeitzonen und Datumsformate konvertiert. Ebenso könnten Sie eine Temperaturklasse definieren, die immer in Kelvin angegeben ist, und eine TemperatureScale-Schnittstelle mit beliebig vielen Implementierungen, um Konvertierungen und Formatierungen durchzuführen.

Diese Frage ist schwer zu beantworten, weil dieses Problem so einfach ist, dass es es einfach nicht tut brauchen eine objektorientierte Lösung. Es wäre viel besser, einfach zwei Methoden namens convertCToF und convertFToC zu schreiben, die eine Ausnahme bei absoluter Null auslösen (wenn Sie möchten).

  • Sie sollten Ihre Constructor(. )-Methoden gemäß der Konvention öffentlich machen
  • Es sind keine leeren Konstruktoren erforderlich.
  • Wenn Sie in Java den objektorientierten Weg gehen, empfiehlt es sich, die Kapselung zu verwenden und Memberfelder als privat zu deklarieren und get- und set-Methoden für diese Felder zu schreiben.
  • Sie könnten stattdessen eine Schnittstelle mit einer Methode namens convert deklarieren und sie an Ihre Klassen anhängen. Auf diese Weise ist es obligatorisch, eine convert-Methode zu implementieren, anstatt @Override verwenden zu müssen

Aber insgesamt musst du es wirklich überdenken, ob du es tatsächlich brauchen OOP dafür zu verwenden. Sehen Sie sich dieses Video an, das die übermäßige Verwendung von Klassen in Python behandelt. https://www.youtube.com/watch?v=o9pEzgHorH0

All diese Kritik am Objektmodell ist begründet, aber vergessen Sie nicht, dass dies eine College-Übung ist. College-Übungen verlangen manchmal, dass Sie etwas Problematisches tun, damit Sie verstehen, warum es problematisch ist. Ein klassisches Beispiel hierfür ist die Bubble-Sortierung. Ich würde mich also nicht zu sehr darauf konzentrieren, es sei denn, Sie befinden sich in einem relativ fortgeschrittenen Programmierkurs.

Das erste, was mir auffällt, ist, dass Sie die Klassen Fahrenheit und Celsius haben, aber Ihre convert-Methode gibt keine Instanzen dieser Klassen zurück, sondern ein Double. Das Muster, eine wertlose Instanz von Fahrenheit oder Celsius an die Konvertierungsmethode zu übergeben, um die gewünschten Einheiten der Doppelausgabefunktion der Funktion anzugeben, ist für OOP zutiefst unidiomatisch. Ich vermute, dass Ihr Professor nach einer Konvertierungsmethode sucht, die eine Instanz von Fahrenheit in eine Instanz von Celsius umwandelt, die dieselbe Temperatur darstellt.

Dies ist kein großartiges objektorientiertes Design, aber es könnte genau das sein, wonach Ihr Professor sucht. Wenn Ihre Klasse fortgeschrittener ist, ist es möglich, dass die Übung eine fortgeschrittenere Technik vermittelt, um Methoden zu unterstützen, die von einer Klasse in eine andere übergehen.

Wie an anderer Stelle vorgeschlagen, könnte ein anderer Ansatz darin bestehen, eine einzige Temperaturklasse zu verwenden, die ihre Größe in Kelvin speichert und über Fabrikmethoden wie Temperature fromCelsius (double celsius) zum Konstruieren von Instanzen aus einem bestimmten Einheitensystem und Instanzmethoden wie double toCelsius() verfügt, die einen Wert in einem gegebenen Einheitensystem zurückgeben.


9 Antworten 9

Auf freedesktop.org gibt es eine Spezifikation (Entwurf) für Trash. Es ist anscheinend das, was normalerweise von Desktop-Umgebungen implementiert wird.

Eine Befehlszeilenimplementierung wäre trash-cli. Ohne genauer hingeschaut zu haben, scheint es die gewünschte Funktionalität zu bieten. Wenn nicht, sagen Sie uns, inwieweit dies nur eine Teillösung ist.

Was die Verwendung eines Programms als Ersatz/Alias ​​für rm betrifft, gibt es gute Gründe, dies nicht zu tun. Am wichtigsten für mich sind:

  • Das Programm müsste alle Optionen von rm verstehen/verarbeiten und entsprechend handeln
  • Es besteht die Gefahr, dass Sie sich an die Semantik Ihres "neuen rm" gewöhnen und Befehle mit fatalen Folgen ausführen, wenn Sie an fremden Systemen arbeiten

Die vorherigen Antworten erwähnen die Befehle trash-cli und rmtrash . Keines davon wird standardmäßig unter Ubuntu 18.04 gefunden, aber der Befehl gio ist. Kommandierende gio help Papierkorbausgaben:

Ich habe getestet mit gio trash DATEINAME in der Befehlszeile, und es funktioniert genauso, als hätte ich die Datei im Dateibrowser ausgewählt und auf die Schaltfläche ENTF geklickt: Die Datei wird in den Papierkorbordner des Desktops verschoben. (Der Befehl fordert nicht zur Bestätigung auf, obwohl ich die Option -f nicht verwendet habe.)

Das Löschen von Dateien auf diese Weise ist reversibel, während es bequemer ist, als rm aus Sicherheitsgründen in rm -i umzudefinieren und jedes Löschen bestätigen zu müssen, was Sie immer noch Pech hat, wenn Sie versehentlich eine Löschung bestätigen, die Sie nicht haben sollten.

Ich habe alias tt='gio trash' zu meiner Alias-Definitionsdatei hinzugefügt. tt ist eine Gedächtnisstütze für To Trash.

Hinzugefügt am 2018-06-27: Auf Servermaschinen gibt es kein Äquivalent zu einem Papierkorbverzeichnis. Ich habe das folgende Bash-Skript geschrieben, das die Arbeit auf Desktop-Computern erledigt, es verwendet gio trash , und auf anderen Computern verschiebt es die als Parameter angegebene(n) Datei(en) in ein von ihm erstelltes Papierkorb-Verzeichnis. Das Skript ist getestet, um zu funktionieren, ich benutze es die ganze Zeit selbst. Skript aktualisiert am 27.04.2021.


Syntax

Die Eingabe-Point-Feature-Class, die in Raum-Zeit-Klassen aggregiert werden soll.

Der Ausgabe-NetCDF-Datencube, der erstellt wird, um Zählungen und Zusammenfassungen der Eingabe-Feature-Punktdaten zu enthalten.

Das Feld mit Datum und Uhrzeit (Zeitstempel) für jeden Punkt. Dieses Feld muss vom Typ Datum sein.

Ein Referenz-Raum-Zeit-Würfel, der verwendet wird, um den output_cube-Ausdehnungsbereich der Analyse, die Bin-Dimensionen und die Bin-Ausrichtung zu definieren. Die Werte time_step_interval , distance_interval und reference_time werden ebenfalls aus dem Vorlagenwürfel abgerufen. Dieser Vorlagenwürfel muss eine netCDF-Datei (.nc) sein, die mit diesem Tool erstellt wurde.

Die Anzahl der Sekunden, Minuten, Stunden, Tage, Wochen oder Jahre, die einen einzelnen Zeitschritt darstellen. Alle Punkte innerhalb desselben Zeitschrittintervalls und Distanzintervalls werden aggregiert. (Wenn ein Vorlagenwürfel bereitgestellt wird, wird dieser Parameter ignoriert und der Wert für das Zeitschrittintervall wird aus dem Vorlagenwürfel abgerufen). Beispiele für gültige Einträge für diesen Parameter sind 1 Woche, 13 Tage oder 1 Jahr.

Definiert, wie die Aggregation basierend auf einem bestimmten time_step_interval erfolgt. Wenn ein template_cube bereitgestellt wird, überschreibt das dem template_cube zugeordnete time_step_alignment diese Parametereinstellung und das time_step_alignment des template_cube wird verwendet.

  • END_TIME —Zeitschritte richten sich nach dem letzten Zeitereignis und werden in der Zeit zusammengefasst.
  • START_TIME —Zeitschritte richten sich nach dem ersten Zeitereignis und werden zeitlich vorwärts aggregiert.
  • REFERENCE_TIME —Zeitschritte werden an einem bestimmten Datum/einer bestimmten Uhrzeit ausgerichtet, die Sie angeben. Wenn alle Punkte in den Eingabe-Features einen Zeitstempel haben, der größer als die von Ihnen angegebene Referenzzeit ist (oder genau auf die Startzeit der Eingabe-Features fällt), beginnt das Zeitschrittintervall mit dieser Referenzzeit und wird zeitlich vorwärts aggregiert (wie erfolgt mit einer START_TIME-Ausrichtung). Wenn alle Punkte in den Eingabe-Features einen Zeitstempel haben, der kleiner als die von Ihnen angegebene Referenzzeit ist (oder genau auf die Endzeit der Eingabe-Features fällt), endet das Zeitschrittintervall mit dieser Referenzzeit und aggregiert zeitlich rückwärts (wie erfolgt mit einer END_TIME-Ausrichtung). Wenn die von Ihnen angegebene Referenzzeit in der Mitte des Zeitumfangs Ihrer Daten liegt, wird ein Zeitschrittintervall erstellt, das mit der angegebenen Referenzzeit endet (wie dies bei einem END_TIME-Abgleich der Fall ist). Referenzzeit, bis der volle zeitliche Umfang Ihrer Daten abgedeckt ist.

Das Datum/die Uhrzeit, die zum Ausrichten der Zeitschrittintervalle verwendet werden sollen. Wenn Sie Ihre Daten beispielsweise wöchentlich von Montag bis Sonntag in Klassen einteilen möchten, können Sie als Referenzzeit Sonntag um Mitternacht festlegen, um sicherzustellen, dass die Klassen zwischen Sonntag und Montag um Mitternacht unterbrochen werden. (Wenn ein template_cube bereitgestellt wird, wird dieser Parameter ignoriert und die reference_time basiert auf dem template_cube .)

Die Größe der Bins, die zum Aggregieren der in_features verwendet werden. Alle Punkte, die in das gleiche distance_interval und time_step_interval fallen, werden aggregiert. Bei der Aggregation zu einem Sechseckgitter wird dieser Abstand als Höhe verwendet, um die Sechseckpolygone zu konstruieren. (Wenn ein template_cube bereitgestellt wird, wird dieser Parameter ignoriert und der Abstandsintervallwert basiert auf dem template_cube .)

Das numerische Feld, das Attributwerte enthält, die zum Berechnen der angegebenen Statistik beim Aggregieren zu einem Raum-Zeit-Würfel verwendet werden. Es können mehrere Statistik- und Feldkombinationen angegeben werden. Nullwerte werden von allen statistischen Berechnungen ausgeschlossen.

  • SUM – Addiert den Gesamtwert für das angegebene Feld in jedem Bin.
  • MEAN – Berechnet den Durchschnitt für das angegebene Feld in jedem Bin.
  • MIN – Ermittelt den kleinsten Wert für alle Datensätze des angegebenen Felds in jedem Bin.
  • MAX – Ermittelt den größten Wert für alle Datensätze des angegebenen Felds in jedem Bin.
  • STD – Ermittelt die Standardabweichung der Werte im angegebenen Feld innerhalb jeder Klasse.
  • MEDIAN-Findet den sortierten Mittelwert aller Datensätze des angegebenen Felds in jedem Bin.
  • ZEROS – Füllt leere Behälter mit Nullen.
  • SPATIAL_NEIGHBORS – Füllt leere Bins mit dem Durchschnittswert der räumlichen Nachbarn
  • SPACE_TIME_NEIGHBORS – Füllt leere Bins mit dem Durchschnittswert der Raum-Zeit-Nachbarn.
  • TEMPORAL_TREND – Füllt leere Bins mit einem interpolierten univariaten Spline-Algorithmus.

Hinweis: Nullwerte in einem der Zusammenfassungsfelder führen dazu, dass diese Features von der Analyse ausgeschlossen werden. Wenn die Anzahl der Punkte in jeder Klasse Teil Ihrer Analysestrategie ist, sollten Sie erwägen, separate Cubes zu erstellen, einen für die Zählung (ohne Zusammenfassungsfelder) und einen für Zusammenfassungsfelder. Wenn der Satz von Nullwerten für jedes Zusammenfassungsfeld unterschiedlich ist, können Sie auch erwägen, für jedes Zusammenfassungsfeld einen separaten Cube zu erstellen.

Die Form des Polygonnetzes, in das die Eingabe-Feature-Punktdaten aggregiert werden.

  • FISHNET_GRID —Die Eingabe-Features werden zu einem Gitter aus quadratischen (Netz-)Zellen zusammengefasst.
  • HEXAGON_GRID —Die Eingabe-Features werden zu einem Raster aus sechseckigen Zellen aggregiert.

ArcGIS-Hilfe - Erstellen von 100-m-Linientransekten innerhalb eines Polygons

Für meine Abschlussarbeit muss ich in jedem Feld, in dem ich arbeite, drei zufällig generierte 100-Meter-Linien-Transekte erstellen. Ich mache Vogelvermessungsarbeiten in TN und habe viele Felder zur Auswahl. Idealerweise möchte ich in der Lage sein, diese Linientransekte in meinen verfügbaren Feldern zu platzieren, um zu sehen, welche für meine Arbeit am besten geeignet sind. Jeder Linientransekt muss genau 100 Meter lang sein und jeder Transekt sollte mindestens 100-200 Meter voneinander entfernt sein, um mögliche Überschneidungen zu vermeiden.

Ich habe versucht, das Werkzeug "Zufällige Punkte erstellen" zu verwenden, aber es platziert nicht unbedingt jeden Punkt in einem Abstand von 100 m (einige sind länger, z. B. 120 oder sogar 200 m). Ich habe ArcGIS Pro nicht, daher kann ich das Werkzeug Transect generieren leider nicht verwenden, und obwohl ich nur jeden Punkt anpassen könnte, habe ich eine ziemlich große Anzahl von Feldern, in denen ich arbeiten kann, also wäre es einfacher, wenn ich einfach anschließen könnte in einigen Infos und lass es für mich tun.

Gibt es eine einfache Möglichkeit, dies zu tun? Ich bin mit den ArcGIS-Grundlagen ziemlich einverstanden, weiß aber nicht, wie man codiert. Jede Hilfe wird sehr geschätzt!

Wahrscheinlich nicht die elegante Lösung, nach der Sie suchen, aber ich mache dasselbe für unsere Biologen. Ich erstelle zufällige Punkte, verbinde dann 1 mit 2, 3 mit 4 und so weiter. Dann gehe ich in meiner Transekt-Feature-Class zurück und erstelle gefangene Linien auf die genaue erforderliche Transekt-Länge (alternativ können Sie die anfänglichen gefangenen Linien trimmen). Für 100-m-Transekte, die keine Überlappungen erfordern, lege ich den Mindestabstand zwischen zufälligen Punkten auf mindestens 100 m fest. Schnelle und schmutzige Lösung, die gut funktioniert, da ich dies selten mache.

Sie können ein Netz mit genau diesen Abmessungen erstellen und diese Polygone in Polylinien umwandeln

Hallo, nehmen Sie das, was ich sagen will, mit Vorsicht, aber zu viele Leute denken an "Computer", wenn das Wort "zufällig" auftaucht.

Das tue ich und habe eine Menge Feldarbeit geleistet, indem ich verschiedene Gemüse-/Tier-/Wachstumsplots und Transekte untersucht habe. Die Bedeutung von "random" besteht darin, einfach "field bias" zu entfernen

Hier sind drei schnelle und gängige Methoden, um zufällige Transekte zu erstellen.

Am schnellsten und wohl am zufälligsten im Büro, sehen Sie sich Ihre Karte an, wählen Sie drei Bereiche aus, von denen Sie glauben, dass sie Ihnen eine gute Abtastabdeckung bieten und Ihre erforderlichen Transektparameter erfüllen. Dann einfach per Hand drei 100m-Linien zeichnen oder digitalisieren. Schnappen Sie sich Ihre drei Standortpunkte und den Azimut, um zu folgen und auf das Feld zu gehen.

Überlagerungsraster. Wählen Sie ein Raster von 100mx100m oder 50mx50m und legen Sie dieses Raster über Ihren Probenahmebereich. Wählen Sie Transekte von 100 m Länge aus Ihrem Raster, die Ihren Parametern entsprechen, digitalisieren Sie sie und begeben Sie sich auf das Feld.

Machen Sie es wie zuvor und lassen Sie den Computer zufällige Punkte für Sie auswählen. Stellen Sie sich die Punkte als Ausgangspunkte vor, richten Sie sie mit einem anderen Punkt als Ihrem Azimut aus und folgen Sie einfach 100 m. Nur weil die Punkte weiter oder näher als 100 m sind, spielt es keine Rolle, nehmen Sie einfach Ihren anfänglichen Startpunkt und schnappen Sie 100 m entlang eines Azimuts aus.

Sie werden möglicherweise feststellen, dass eine Ihrer Transaktionen aufgrund einer physischen Barriere wie einem nicht kartierten Teich, einer Klippe oder einer Senke oder einer anderen unvorhergesehenen Barriere im Feld verschoben werden muss. Kein Problem, wählen Sie einfach schnell einen anderen Azimut oder stoßen Sie den Startpunkt an, um ihn zu vermeiden. (Stellen Sie sicher, dass Sie klare Notizen darüber machen, warum Sie dies getan haben, um im Büro nachzufragen)

Der wichtigste Aspekt ist die Stichprobenziehung, das Sammeln guter, genauer Daten mit der Genauigkeit und statistischen Sicherheit, die Sie für Ihre Abschlussarbeit festlegen.


2 Antworten 2

Beginnen wir mit der grundlegendsten, der Card-Klasse.

Außer während der Entwicklung ist es üblich, nur die benötigten Klassen explizit zu importieren, anstatt Platzhalter zu verwenden.

Es ist sicherlich eine gültige Wahl, Rang und Farbe als kurze s zu speichern, da dies höchstwahrscheinlich der schnellste und effizienteste Weg ist, aber wenn Sie die Besonderheiten von Java kennenlernen möchten, sollten Sie sich Enumerationen ansehen.

IMHO-Karten sind ein Paradebeispiel für unveränderliche Objekte. Es gibt keinen Grund, den Rang oder die Farbe einer Karte zu ändern, also würde ich die Setter fallen lassen.

Es ist sehr ungewöhnlich, in Java Unterstreichungen in Variablennamen zu verwenden, insbesondere zwei als Präfix. Ich würde die Parameter einfach mit Rang und Anzug benennen, zumal es sich um (statische) Klassenmethoden und nicht um Instanzmethoden handelt, sodass es keine Verwechslungen mit den Feldern gibt.

Es kann sich lohnen, darüber nachzudenken, ob dies tatsächlich Klassenmethoden sein müssen und keine Instanzmethoden sein sollen. Wenn Sie andere Klassen haben, die unabhängig von der Card-Klasse Kurz in die entsprechenden Namen umwandeln müssen, ist dies in Ordnung. Aber in Ihrem Fall würde ich sagen, dass dies nicht der Fall ist, und man sollte versuchen, die Tatsache zu verbergen, dass Farben und Ränge so kurz wie möglich ausgeführt werden.

Die Java-Community ist gespalten über die Frage, ob die Methode toString() nur aus Debugging-Gründen überschrieben oder in der "Geschäftslogik" verwendet werden soll. In dieser "einfachen" Anwendung müssen Sie meiner Meinung nach nicht zwischen den beiden Verwendungen unterscheiden, daher würde ich printCard() fallen lassen und nur toString() verwenden.

Übrigens, es ist üblich, Annotationen vor den Methodenmodifizierern zu haben.

Anstatt Ihre eigene Methode zu implementieren, ist es wahrscheinlich eine gute Idee, equals() zu überschreiben (oder dies zumindest zu einer Instanzmethode zu machen). Wenn Sie Card unveränderlich machen, wie ich zuvor vorgeschlagen habe, vereinfacht dies die Implementierung durch den Vergleich der Referenzen, um zu sehen, ob sie gleich sind, da Sie nur eine Instanz jeder möglichen Karte haben sollten.

(Obwohl es sicherer sein kann, Rang und Farbe als Rückfall zu vergleichen.)

Zuerst ein kurzer Exkurs über Aufzählungen. Die Enums haben eine Ordnungszahl und eine CompareTo-Methode, mit der Sie sie sortieren können. Sie können ihnen auch Eigenschaften zuweisen und darauf basierend Ihre eigene Bestellung erstellen.

Der offizielle Sprachführer enthält Beispiele für Farb- und Rangaufzählungen und zum Erweitern von Aufzählungen mit Ihren eigenen Eigenschaften am Beispiel von Planeten: http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html

Wenn/wenn ich zum Handranking komme (habe es mir noch nicht angeschaut) kann ich vielleicht ein paar Vorschläge machen, um es mit Aufzählungen umzusetzen.

Als nächstes sind die Komparator s. Ich habe nicht viel Erfahrung damit, daher kann ich nur einige allgemeine Vorschläge machen:

  • Klassen sollten in Java immer mit einem Großbuchstaben beginnen.
  • Sie sollten sie von Comparator<Card> anstelle von Comparator<Object> erweitern, da Sie nur Karten miteinander und nicht mit anderen Objekten vergleichen müssen.
  • Obwohl es eine gute zusätzliche Übung ist, möchten Sie vielleicht den Farbvergleicher überspringen, da er beim Poker im Allgemeinen (und insbesondere bei Texas Hold'em) nicht wirklich benötigt wird. Anzüge haben nie eine Rangfolge in der Hand, die normalerweise nur in einigen "Meta"-Kontexten benötigt wird (z. B. bei der zufälligen Bestimmung der Position des Knopfes), die derzeit nicht auf Ihr Programm zutreffen. Wenn Sie es jedoch behalten, sollten Sie die Reihenfolge der Farben korrigieren, da die offizielle Rangfolge (von der niedrigsten bis zur höchsten) "Clubs", "Diamonds", "Hearts" und "Pik" lautet.

Als nächstes ist der Vorstand dran. Zunächst möchte ich sagen, dass ich mir nicht sicher bin, ob ich eine solche Board-Klasse in einer echten Poker-Anwendung verwenden würde. Allerdings fällt mir spontan keine andere Möglichkeit ein, und zum Üben ist dies völlig in Ordnung.

Das einzige, was ich ändern würde, ist, anstatt jede Karte explizit nach Index mit setBoardCard(Card card, int cardNum) zu setzen, würde ich die Board-Klasse den Index intern selbst verfolgen lassen und einfach addBoardCard(Card card) verwenden, weil Sie das nicht tun sollten in der Lage sein, "zurück" und die Board-Karten zu ändern (dito für die Burn-Karten).

Zum Sortieren von Anzügen: Ok, das macht Sinn. Handauswertung habe ich mir noch nicht angeschaut. Dies ist jedoch eher ein Fall der Gruppierung dieser Sortierung, also gibt es vielleicht einen anderen (besseren?) Weg, dies zu tun. Ich muss darüber nachdenken.

Tracking-Indizes: Sie könnten sicherlich eine Collection (oder genauer eine List ) verwenden, um dies zu tun (und es wäre eher "Java-ähnlich", aber in Ihrem Fall, in dem Sie eine feste maximale Anzahl von Karten auf dem Board haben, sind die Arrays gut, ich hätte so etwas wie:

Zuerst würde ich vorschlagen, nur ein Random-Objekt statisch zu erstellen, anstatt eines für jeden Aufruf von shuffle und cutDeck zu erstellen.

Wirklich problematisch ist die Erstellung eines neuen temporären Deck-Objekts zum Schneiden des Decks. Dies kann sehr schnell schief gehen, da es einen unnötigen zweiten Kartensatz enthält und Sie bei einem Fehler leicht doppelte Karten erhalten. Verwenden Sie stattdessen einfach ein neues Array. Sie können auch System.arraycopy verwenden, um das Kopieren von einem Array in ein anderes zu vereinfachen.

Beim Erstellen eines neuen Decks wird nicht nur ein neues Array erstellt, sondern auch ein a gefüllt Array mit neuen Karten, die Sie nicht benötigen. Es reicht ein Array:

Über Player gibt es nicht viel zu sagen, außer, ich würde setCard entfernen und einfach den Konstruktor verwenden, um die Karten dem Spieler zuzuweisen, um das Objekt unveränderlich zu machen. Oder implementieren Sie zumindest eine addCard-Methode wie in Board.

In getNumberOfPlayers ist Ihr Fehler bei der Behandlung etwas inkonsistent. Einerseits schreibt man in System.out (System.err wäre wohl besser) und andererseits löst man eine Ausnahme aus.

Für die IOException würde ich sie hier nicht abfangen, sondern außerhalb von getNumberOfPlayers . In größeren Projekten kann es sinnvoll sein, es dafür in eine eigene Exception-Klasse zu "einpacken":

Sowohl die abgefangene NumberFormatException als auch der ungültige Bereich sollten die gleichen (oder verwandten) benutzerdefinierten Ausnahmen auslösen. Werfen Sie nicht einfach eine einfache Exception , weil sie für andere bedeutungslos ist, die sie abfangen müssen. Beispiel:

Beachten Sie, dass in der verursachenden IOException und NumberFormatException als Argument an die neue Ausnahme übergeben werden, falls sie weiter unten in der Zeile benötigt werden.

Sowohl HoldemIOException als auch HoldemUserException könnten von einer grundlegenden HoldemException erweitert werden, die wiederum Exception erweitert. Eine einfache "leere" Erweiterung wie z

für alle drei Fälle würde ausreichen.

Auch sollte man niemals eine Ausnahme (insbesondere eine selbst geworfene) am Ende völlig unbearbeitet ausfallen lassen. Erfassen Sie alle Ihnen bekannten Ausnahmen an einer vernünftigen Stelle, in Ihrem Fall bei getNumberOfPlayers :

Ich habe nur die do while-Schleife hinzugefügt, um zu zeigen, wie die beiden Ausnahmetypen unterschiedlich behandelt werden. Es wäre ratsam, einen geeigneten Weg für den Benutzer hinzuzufügen, um aus der Schleife herauszukommen.

Hier haben wir einen weiteren Zähler ( cardCounter ) um die "Position" des Decks zu verfolgen. Auch hier wäre es besser, wenn die Deck-Klasse die ausgeteilten Karten verfolgt. Sie sollten erwägen, das Deck als tatsächlichen "Stack" oder als "Warteschlange" zu implementieren - egal welches, da Sie keine Gegenstände hinzufügen. Java bietet eine Queue-Schnittstelle, die Sie verwenden können.

Wenn Sie darüber nachdenken, könnten Sie auch die gleiche Schnittstelle für Player und Board verwenden (obwohl Sie in diesem Fall die Brennkarten in ein eigenes Objekt aufteilen müssten). Das würde den Umgang mit player.add(deck.remove()) , board.add(deck.remove()) und burnCards.add(deck.remove()) vereinfachen.

Ok, wahrscheinlich die letzte Bearbeitung.

Ich habe angefangen, mir die Handbewertung anzuschauen und ich glaube, ich kann nicht viel dazu schreiben. Sie haben es basierend auf Ihren aktuellen Card-Objekten sehr prozedural implementiert und wenn Ihr Ziel darin besteht, dies auf Java-Weise zu tun, müssen Sie wahrscheinlich das Card-Objekt neu schreiben und zuerst ein richtiges "Hand" -Objekt erstellen (höchstwahrscheinlich basierend auf einem Set) und dann die Bewertung basierend darauf neu schreiben.

Die Bewertung der Pokerhand ist ein sehr komplexes Thema, insbesondere wenn man 5 von 7 Karten berücksichtigt. Wie dies umgesetzt werden sollte, hängt davon ab, ob Sie sich auf "gute Java-Praxis" oder "Geschwindigkeit" konzentrieren möchten. Wenn Sie wirklich daran interessiert sind, dies zu erweitern, sollten Sie sich wahrscheinlich zuerst in das Thema einlesen - dazu gibt es mehrere Fragen auf Stack Overflow und wahrscheinlich unzählige Artikel im Web - und dann eine neue Frage mit Schwerpunkt Handbewertung erneut posten. Das schaue ich mir gerne eines Tages an - wenn ich Zeit habe.

Nur eine konkrete Sache: Wofür stehen die Konstanten EINS, ZWEI, DREI und VIER? Diese scheinen selbst für einen prozessualen Ansatz völlig fehl am Platz zu sein und sollten am ehesten dort, wo sie verwendet werden, durch eine entsprechende Schleife ersetzt werden.


Wassereinzugsgebietsmanagement für die Trinkwasserversorgung: Bewertung der New York City-Strategie (2000)

In vielen Bundesstaaten und Ortschaften gelten seit den frühen 1960er Jahren Regelungen zur Nutzung von Privatgrundstücken innerhalb einer bestimmten Entfernung von einem Wasserlauf, See, Feuchtgebiet oder Gezeitenküste. Solche "Rückschläge" oder "Pufferstreifen" dienen verschiedenen Zwecken, beispielsweise dem Schutz von Oberflächengewässern vor Verschmutzung, dem Schutz von Bauwerken vor Überschwemmungen oder Erosion und der Erhaltung von Uferlebensräumen und Küsteneinrichtungen. Eines der am weitesten verbreiteten Merkmale des Memorandums of Agreement (MOA) Watershed Rules and Regulations ist die Verwendung von Rückschlagdistanzen, um Gewässer von potenziell umweltschädlichen Aktivitäten zu trennen. Je nach Aktivität müssen 25 und 1.000 Fuß Land die Aktivität von nahe gelegenen Gewässern trennen. Für Rückschläge um Stauseen sind größere Distanzen erforderlich. required , Reservoirstämme und kontrollierte Seen als in der Nähe von Feuchtgebieten und Wasserläufen, die alle mehrjährigen Bäche und in einigen Fällen intermittierende Bäche umfassen.

Obwohl die Verwendung von Rückschlägen in den Vorschriften für Wassereinzugsgebiete im ganzen Land weit verbreitet ist, wurde wenig über die Wirksamkeit von Rückschlägen an sich bei der Verhinderung der Kontamination von Gewässern durch Verschmutzung durch nicht punktuelle Quellen untersucht. Vielmehr konzentrierte sich die Forschung auf den Einsatz von Pufferzonen zur Entfernung von Schadstoffen aus einer nicht punktförmigen Quelle. Pufferzonen sind natürliche oder bewirtschaftete Gebiete, die dazu dienen, ein Ökosystem oder einen kritischen Bereich vor angrenzenden Landnutzungen oder Verschmutzungsquellen zu schützen. Sie sind eine zunehmend genutzte Best Management Practice (BMP) für viele Aktivitäten. Effektive Puffer entlang von Flüssen, Stauseen und Seen (Auenpuffer) halten oder wandeln Schadstoffe aus nicht punktuellen Quellen um oder schaffen ein günstigeres Umfeld für aquatische Ökosystemprozesse.

Rückschläge sind im Gegensatz zu Pufferzonen einfach vorgeschriebene Entfernungen zwischen Schadstoffquellen und einer zu schützenden Ressource oder einem aquatischen Ökosystem. Nur

if a setback is subject to management or natural preservation can it be considered a "buffer" that reliably insulates ecosystems and resources from nonpoint source pollution. Because of the lack of information regarding unmanaged setbacks, this review focuses on management of buffer zones for achieving pollutant removal. In the absence of management, it is virtually impossible to predict what effect the setback distances in the MOA will have on the water quality of the New York City watershed. However, if the management practices reviewed and recommended in the following sections are used, then the setbacks may approach the pollutant-removal capabilities predicted for buffer zones.

The next section enumerates and explains key functions and characteristics of riparian buffer zones. It should be noted that waterbodies have a substantial effect on the characteristics of the surrounding buffer zones. That is, depending on whether they border wetlands, reservoirs, or streams, buffer zones will function differently. These differences are discussed when appropriate. Another important consideration is that buffer zones may not be permanent pollutant sinks, but rather may act as temporary storage areas that can be both sources and sinks of pollution. This is especially true for sediment and phosphorus, for which no degradation processes exist in the buffer (nitrogen can be removed via denitrification). Factors that enhance the long-term storage potential of riparian buffer zones, such as harvesting of vegetation, are important in evaluating their long-term effectiveness.

STRUCTURE AND FUNCTION OF RIPARIAN BUFFER ZONES

Riparian buffer zones refer to lands directly adjacent to waterbodies such as lakes, reservoirs, rivers, streams, and wetlands. These land areas have a significant impact on controlling nonpoint source pollution and on the associated water quality in nearby waterbodies. As a result, they are widely used in water resource protection programs and are the topic of intense investigation, especially in agriculture and forestry. Unfortunately, as noted in a recent symposium on buffer zones, policy-driven initiatives that have accelerated the debate on buffer zones have, at the same time, stretched scientifically based management to the limits of knowledge on this issue (Haycock et al., 1997). This is the case in the New York City watersheds and most other regions of the country.

Hydrology

Evaluating the effectiveness of riparian buffers to remove diffuse pollution from runoff requires a basic understanding of their hydrologic structure and function. Because of their proximity to waterbodies, riparian buffers are sometimes flooded by stream overflow. Riparian buffer zones are also strongly influenced by water from upslope areas, which is generally divided into three

categories: (1) overland or surface flow, (2) shallow subsurface flow, and (3) groundwater flow (Figure 10-1).

Overland flow across buffer zones can occur via two pathways. Infiltration-excess overland flow is generated when rainfall intensity or snowmelt rate exceeds the rate at which water moves through the soil surface (the infiltration process). Infiltration-excess overland flow typically occurs when the soil surface is frozen, is compacted, or is otherwise unable to transmit water to the root zone. Extreme rainfall events may deliver water rapidly enough to generate infiltration-excess across a wide range of soil types and watershed locations. As in most predominantly forested areas, this mechanism of overland flow is rare in the Catskill/Delaware region.

Saturation-excess overland flow occurs when soil water storage capacity is exceeded by precipitation volume combined with lateral inflow from upslope areas. When total inflow exceeds total outflow, saturation from below is the obligate result. Once the zone of saturation reaches the soil surface, any new input (rain or snowmelt) is immediately converted to overland flow. As shown in Figure 10-1, saturation-excess overland flow typically occurs at the transitions from the uplands to the riparian zone. Saturation-excess overland flow is usually less damaging to water quality than is infiltration-excess overland flow and, though still uncommon, it is more likely in the Catskill/Delaware region.

Both infiltration-excess and saturation-excess overland flow occur during rain or snowmelt events and constitute the bulk of stormflow. Because this water

FIGURE 10-1 Hydrologic pathways surrounding riparian buffer zones. Source: Burt (1997).

travels overland, it can accumulate high levels of particulate matter such as sediment, bacteria, and particulate-phase phosphorus. Depending on its velocity and on the soil water status of the riparian zone, overland flow can either infiltrate into buffer zones (generally desirable) or flow across buffer zones and discharge directly into neighboring waterbodies.

Shallow subsurface flow travels laterally through the root zone below the land surface (see Figure 10-1). It may be caused by an abrupt decrease in soil permeability or simply because a shallow soil is underlain by slowly permeable or impermeable bedrock. The latter is the most common case in the Catskill/Delaware region. The response of subsurface flow to storm events is more attenuated than that of overland flow, although increases in subsurface flow do generally occur during and for a period of time following precipitation or snowmelt. Filtering and biogeochemical transformations in the soil limit shallow subsurface transport of suspended particulate matter. By contrast, the concentration of dissolved solids may increase in proportion to residence (travel) time (Burt, 1997).

Groundwater flow occurs when vertical flow extends beyond the root zone into lower strata. This may occur in deeper unconsolidated material (e.g., glacial or lacustrine sands and gravels) and/or through bedrock fractures. Travel time increases in proportion to the length of the flow path and in relation to hydraulic limitations imposed by the media. Hence, groundwater can have high dissolved solids but transports little, if any, suspended solids. Shallow subsurface flow and groundwater flow combine to generate baseflow, the water entering streams, wetlands, lakes, and reservoirs during dry periods. Shallow subsurface flow is much more likely to interact with riparian buffer zones than groundwater flow because it passes laterally through the root zone. In some instances, shallow subsurface flow in upstream areas can become saturation-excess overland flow by the time a buffer zone is reached (exfiltration or seepage).

Pollutant Removal and Other Functions

The structure and function of riparian buffer zones are determined by (1) the soil, vegetation, and hydrologic characteristics of the buffer and (2) the interactions with upslope and downslope water. For management purposes and for conceptualization of the various functions, the U.S. Department of Agriculture (USDA) guidelines suggest riparian buffers can be divided into three zones, each of which has certain physical characteristics and pollutant-removing abilities (Figure 10-2) (NRCS, 1995 Welsch, 1991). Zone 1 is the area immediately adjacent to the waterbody Zone 2 is an intermediate zone upslope from Zone 1 where most active woody BMPs are used and Zone 3 is the vegetated areas upslope from Zone 2. Although this conceptualization has not been universally adopted, it is particularly useful in this report for describing how riparian buffer zone functioning varies with distance from nearby waters.

FIGURE 10-2 USDA's three-zone schematic of a riparian buffer zone. Source: EPA (1995).

Zone 3

The pollutant-removal abilities of riparian buffers are maximized when overland flow infiltrates into buffer zones rather than discharging directly into adjacent waterbodies. For this reason, the most important function of Zone 3 is to alter the hydraulic properties of rainfall runoff such that the overland flow interacting with Zones 2 and 1 is sheet flow rather than channelized flow. Depending on the characteristics of nearby land, overland flow reaching Zone 3 may be predominantly channelized flow. By design, when channelized flow reaches Zone 3, it is usually converted to sheet flow and subsurface flow by the hydraulically rough surface and the enhanced infiltration of the buffer zone.

Coarse sediment removal from stormwater is also predominantly accomplished in Zone 3, although it can also occur in Zones 2 and 1. When the hydraulic of stormwater change from channelized flow to sheet flow, infiltration of the water is enhanced. Sediment and other materials entrained in overland flow (such as particulate phosphorus) are deposited on the surface as water infiltrates into the soil. If Zone 3 land is properly managed, sediment removal can reach 80 percent (Sheridan et al., 1999).

Zone 2

Zone 2 is designed to remove, sequester, and transform nonpoint sources of pollution in stormwater (Lowrance et al., 1997 Welsch, 1991). Nutrients such as nitrogen and phosphorus, microbes, and sediment can all be altered during passage through a Zone 2 riparian buffer. Zone 2 can also reduce pesticide transport (Lowrance et al., 1997) and may trap other pollutants, including metals and hydrocarbons. In general, the ability of a Zone 2 riparian buffer to remove pollutants depends on (1) whether sheet flow has been established in Zone 3, (2) the type of vegetation present, and (3) the length of the buffer zone. The first criterion is determined by the condition of the Zone 3 riparian buffer upslope from Zone 2. The other two criteria are characteristics of Zone 2, some of which can be altered or managed to maximize pollutant removal. A literature review found later in this chapter discusses the extent of pollutant removal that can be achieved when rainfall runoff travels through riparian buffers. This review focuses on the pollutants of greatest concern in the New York City watersheds, including phosphorus, microbial pathogens, and sediment.

Zone 1

Zone 1 is the area of the riparian buffer closest to the waterbody. In forest ecosystems, it is characterized by a canopy of trees and shrubs that provide shade to near-shore areas of lakes, larger streams, and rivers during a portion of each day. The cumulative effects of the canopy on the energy balance can have a substantial (10&ndash15°C) effect on water temperature. Because dissolved oxygen concentration is inversely proportional to water temperature, increases in temperature caused by the removal of riparian vegetation can impose chronic or acute stress on invertebrate and fish populations. Riparian vegetation has the greatest influence along headwater streams where vegetation can cover the entire width of the stream. The microclimate effect decreases downstream as the width of the stream, river, or lake increases relative to the height of the riparian vegetation.

Leaves, needles, and wood supply energy&mdashas carbon&mdashto headwater streams. Like microclimate effects, the relative importance of carbon inputs from riparian vegetation decreases as the receiving water becomes larger. However, the inflow of dissolved and particulate carbon from headwater areas remains an important supplement to in situ primary production by algae and other aquatic plants in rivers and lakes. The contribution of vegetated riparian zones to the total dissolved carbon load at the point of water withdrawal is an important issue in watershed management. Because of the concern over the role of dissolved organic carbon in producing disinfection byproducts, there are possible drawbacks to increasing the dissolved organic carbon levels in streams.

In addition to being a persistent source of carbon, woody debris ranging from

small twigs to branches, boles, and entire trees is a critical structural feature for stream ecosystems. As woody debris lodges and jams along streambanks, it forms a matrix that captures leaves and other small organic matter as they drift downstream. The interlocking roots of riparian vegetation anchor streambank, floodplain, and lakeshore soils and substantially increase their resistance to erosion and slumping.

Finally, the zone nearest the waterbody can be responsible for unique aquatic habitats. Woody debris and leaf packs at the land/water interface increase the variation of flow velocity in headwater streams. Quiet water and eddies behind leaf packs and larger debris jams lead to the formation of alternating pool and riffle sections in headwater streams. Diverse hydraulic conditions provide a continuum of spawning, rearing, feeding, hiding, and overwinter habitat for fish, amphibians, and invertebrates.

All Zones

In all zones of a riparian buffer, vegetation helps to reduce soil erosion. All zones are also capable of increasing the thickness of the unsaturated zone through evapotranspiration of water from the soil profile. As a consequence, available storage for rain, snowmelt, and upland inflow is maximized.

Riparian buffer zones exhibit soil physical and hydraulic properties that further enhance the ability of the land to attenuate stormwater. Decomposition of vegetation in the riparian zone leads to reduced bulk density, thereby increasing porosity (storage capacity), infiltration capacity (rate of water movement into the soil), and permeability (rate of water movement through the soil). Water retention characteristics also are enhanced by the addition of organic matter. The growth, senescence, and death of roots, along with the actions of invertebrates and small mammals, produce a complex system of macropores that augment the permeability of the soil matrix. Collectively, these soil properties maximize the likelihood that rain, snowmelt, or overland flow from adjacent uplands will pass beneath the soil surface and travel as subsurface flow through the riparian zone. In addition, small-scale variations in slope, woody debris, herbaceous plants, and leaf litter on the forest floor present additional barriers to overland flow.

ACTIVE MANAGEMENT OF BUFFER ZONES

The most important management practice for influencing functioning of buffer zones is to stabilize the hydraulic properties of stormwater so that channelized flow does not reach nearby streams. Channelized flow can form very quickly during rainfall. In urban areas, stormwater concentrates into channelized flow within as few as 75 ft of its source (Schueler, 1996 Whipple, 1993). Given the typical land uses found on the East Coast, only about 10 percent to 15 percent of a watershed area produces sheet flow during precipitation

(Schueler, 1995). The remaining runoff is usually delivered to streams in open channels or storm drains, the flow from which can be extremely difficult, if not impossible, to dechannelize.

Hence, converting channelized flow to sheet flow or to multiple smaller channels is a critical aspect of buffer zone management. Most regulations involving setbacks and buffer zones have been written and enacted with no consideration of this important issue. Converting channelized flow to sheet flow may require the installation of a structural BMP in Zone 3. For example, at sites with significant overland flow parallel to the buffer, water bars should be constructed perpendicular to the buffer at 45-to 90-ft intervals to intercept runoff and force it to flow through the buffer before it can concentrate further. Low berms or vertical barriers, known as level-lip spreaders, have been used successfully to spread concentrated flow before entering a forest buffer (Franklin et al., 1992). Buffers should not be used for field roadways because vehicles and farm equipment will damage the buffers and may cause concentrated flows (Dillaha and Inamdar, 1997). Specific suggestions for dechannelizing urban stormwater are given later.

Buffers may accumulate significant amounts of sediment and nutrients over time. To promote vegetative growth and sediment trapping, herbaceous vegetated buffers should be mowed and the residue should be harvested two or three times a year (Dillaha et al., 1989a,b). Mowing and harvesting will increase vegetation density at ground level, reduce sediment transport, and remove nutrients from the system. Herbaceous vegetated buffers that have accumulated excessive sediment should be plowed out, disked and graded if necessary, and reseeded in order to reestablish shallow sheet flow conditions. Although natural herbaceous buffer zones are rare in the Catskills, those created during active management of setbacks should be harvested. The primary management for Zone 1 is to reestablish and maintain native woody vegetation.

Although it is known that vegetation type can greatly influence buffer zone functioning, field data are not available for most types of buffers. There are numerous aspects of vegetation management for which more information is needed. For instance, the rooting depth will influence nutrient uptake from shallow or deeper groundwater, and more must be known about the differences among root systems of various types of vegetation. Different types of vegetation also have different management requirements, with woody vegetation providing a natural longer-term sink for nutrients than does herbaceous vegetation. Some general conclusions can be drawn. First, riparian forest buffers require native woody vegetation near the waterbody. States make determinations as to the appropriateness of different species, with native hardwoods required in most states of the eastern United States. Second, in areas experiencing runoff high in sediment, herbaceous vegetation is recommended between a forest buffer and the runoff source because a well-managed grass buffer can be more effective at trapping sediment and associated contaminants. Combinations of vegetation may

prove most effective at removing a range of pollutants. For example, an outer grassed strip followed by an inner forested strip has been suggested for complete sediment, phosphorus, and nitrogen removal (Correll, 1991 Osborne and Kovavic, 1993). In all cases, the hardiness of riparian vegetation will determine how well it accomplishes pollutant removal and other functions. The New York City Department of Environmental Protection (NYC DEP) has recently noted that high densities of white-tailed deer may be preventing regrowth of forests around Kensico Reservoir (NYC DEP, 1997), which should be considered when determining vegetation requirements for buffer zones.

The preceding discussion applies only to those nonpoint source pollutants found in stormwater. Active management of buffer zones will have no effect on atmospheric deposition of pollutants directly over the surface of waterbodies, nor can it control in-stream increases in dissolved organic carbon derived from terrestrial vegetation. Additional suggestions for the active management of buffer zones are given below in relation to specific activities that produce nonpoint source pollution.

Agriculture

In general, agricultural land uses tend to increase surface runoff and decrease infiltration and groundwater recharge in comparison to perennial vegetation such as forest or grassland. Grazing animals can cause compaction of soils, especially under wet soil conditions. Tillage may increase subsurface compaction and lead to crust formation at the soil surface. The severity of these effects depends on soil properties and climate. In some watersheds, increased surface runoff, often combined with ditches and drainage enhancements, can change a groundwater-flow-dominated system to a surface-runoff-dominated system (Schultz et al., 1994). Increases in surface runoff cause increases in the stormflow/baseflow ratio and in the amount of sediment and chemical transport.

Many of the effects of agriculture on hydrologic and transport processes can be mitigated through the use of properly managed buffer zones. The USDA launched a National Conservation Buffer Initiative in 1997 to increase the adoption of conservation buffers and the integration of conservation buffers into farm plans. Conservation buffers include many practices designed to impede and retain surface flows and pollutants such as vegetated filter strips, contour filter strips, and riparian forest buffers. The general guidance given above on establishing and maintaining buffer zones is largely derived from studies in agricultural areas and is of primary importance. Hydrologic enhancement (conversion of channelized flow to sheet flow) can be accomplished through grading of soils, removal of berms or channels, and creation of shallow overland flow paths. Vegetation establishment may involve fertilizer and lime application, seeding, or other planting. Active management may also involve harvesting of vegetation to remove nutrients.

Other important aspects of buffer zone management on agricultural lands include restrictions on grazing and pesticide application. Grazing of riparian buffer systems including riparian forest buffers and filter strips, is generally not allowed under programs such as the USDA Conservation Reserve Program. Riparian buffers should be combined with practices such as fencing and alternative water supplies to exclude domestic animals from the entire buffer zone. Certain pesticides have setback restrictions from watercourses for storage, mixing, and application that are part of the label restrictions issued for the chemical by the Environmental Protection Agency (EPA). For example, metolachlor, a common herbicide used in corn production, cannot be mixed or stored within 50 ft of lakes, streams, and intermittent streams. The herbicide atrazine may not be mixed or loaded within 50 ft of an intermittent or perennial stream, it may not be applied within 66 ft of where field runoff exits a field and enters a stream, and it may not be applied within 200 ft of natural or impounded lakes or reservoirs. Caution should be used when applying herbicides to adjacent fields to avoid damage to buffer zone vegetation.

Finally, it should be noted that artificial subsurface drainage (tile drains) may short-circuit the functioning of riparian buffers in agricultural settings. Although drain lines are not supposed to enter streams directly, they sometimes do, providing a direct conduit for pollutant movement to streams. Allowing tile drain water to flow through a spreading device before entering a riparian buffer is desirable.

Forestry

As noted in earlier chapters, the majority of nonpoint source pollution (primarily sediment) from timber-harvesting operations emanates from the road and skid trail network needed to remove sawtimber, pulpwood, or fuelwood from the forest. Overland flow is generated when the litter layer is scrapped away und the soil is compacted. This disturbance is usually limited to about ten percent of the harvest unit. The remainder of the site retains high infiltration capacity, with shallow subsurface flow as the predominant mechanism of streamflow generation. Therefore, it is usually unnecessary (and impractical) to construct stormwater control devices (e.g., level-lip spreaders) at the transition between the harvest unit and the riparian forest buffer. By contrast, a large proportion of agricultural fields or urban areas can generate overland flow and associated nonpoint source pollution because of changes in soil surface conditions.

Riparian forest buffers are subject to special operating restrictions, often specified by state forest practice acts, to minimize undesirable changes in site conditions. The most important restriction is the prohibition of direct access by heavy equipment. Selective harvesting of trees within Zones 2 and 3 can and should occur. However, logs can only be winched on a steel cable to a machine (skidder, specially equipped farm tractor, or small 4WD tractor) located outside of the buffer or removed by a mechanical harvester with a hydraulic boom. Das


Schau das Video: ArcGis creating polygon grid Create Fishnet