Hier betrachten wir eine Methode zur Aufteilung der sphĂ€rischen OberflĂ€che eines prozedural erzeugten Planeten durch unregelmĂ€Ăige Kacheln und infolgedessen die Aufteilung des Ozeans und der Kontinente in separate Abschnitte (Sektoren). Wir gehen davon aus, dass die Struktur von Landgebieten bereits mithilfe von GIS auf der OberflĂ€che des Planeten festgelegt wurde und es möglich ist, Vektordaten in ESRI-Shapefiles oder direkt in eine PostgreSQL-Datenbank mit der
PostGIS- Erweiterung zu exportieren. Das Erstellen von Sektoren erfolgt mit PostGIS.
Siehe den Link zum Skript mit SQL-Code am Ende des Beitrags. Hier wird die ErklĂ€rung nĂ€her erlĂ€utert. Die ErklĂ€rung enthĂ€lt die Grundfunktionen des Skripts und setzt auch die VerfĂŒgbarkeit von Daten fĂŒr Kontinente und FlĂŒsse prozedural erzeugter Planeten
voraus, die von
forgedmaps.com stammen .
Die Wahl unregelmĂ€Ăiger Kacheln ermöglicht es uns, die OberflĂ€che des Planeten genau zu unterteilen
in Sektoren, in der Regel nicht die Gebiete des Ozeans und Land irgendwo mischen. Seen und Binnenmeere
Wir betrachten es als Teil des Landes. Wir werden auch sehen, wie FlĂŒsse als natĂŒrliche Grenzen von Sektoren genutzt werden können. Die Sektoren selbst werden auf der Grundlage einer grundlegenden Unterteilung der Kugel durch Polygone aufgebaut.
Wenn es darum geht, einen flachen Bereich zu teilen, greifen sie normalerweise auf
das Voronoi-Diagramm zurĂŒck , um unregelmĂ€Ăige Kacheln zu erhalten. Wenn wir auch
den Lloyd-Algorithmus anwenden, können wir zu einer visuell attraktiven Form konvexer Polygone kommen, deren GröĂe nicht sehr unterschiedlich ist (Centroidal Voronoi-Tessellation). Das Wesentliche des Lloyd's-Algorithmus besteht darin, die Konstruktion des Voronoi-Diagramms bei jeder nachfolgenden Iteration zu wiederholen und die Zentren der bei der vorherigen Iteration erhaltenen Polygone als Erzeugungspunkte zu verwenden.
Wir werden bestimmte Anforderungen an die Grundteilung einer Kugel durch Polygone stellen:
die KonvexitĂ€t von sphĂ€rischen Polygonen und ihre nicht sehr groĂen Abweichungen von einer gegebenen DurchschnittsgröĂe.
Der
Namenssektor wird anstelle eines
PlĂ€ttchens verwendet , da das PlĂ€ttchen normalerweise eine elementare Bedeutung hat, beispielsweise als Einheitsteil der PlĂ€ttchenkarten strategischer Spiele oder als Einheitsteil einer bestimmten OberflĂ€che. Innerhalb des Sektors gibt es eine interne Struktur: das Relief und verschiedene geografische Objekte darin. Sektoren können wiederum auch als Elementarkacheln dienen: Die Erstellung eines Diagramms möglicher ĂbergĂ€nge zwischen Sektoren dient diesem Zweck.
Die grundlegende Aufteilung der Kugel und der Segmente der Ozeane.
PostGIS hat eine Funktion
ST_VoronoiPolygons
, die ein Voronoi-Diagramm in einem quadratischen Bereich erstellt. Mal sehen, wie wir es fĂŒr unsere Zwecke nutzen können.
Was passiert, wenn Sie versuchen, einen einfachen Ansatz zu verwenden? Eine rechteckige Projektion des Planeten kann durch Koordinaten in ein Quadrat umgewandelt werden, dort Polygone bilden und die inverse Transformation von Koordinaten durchfĂŒhren. Die auf diese Weise konstruierten Rechtecke werden jedoch in eine Richtung gedehnt, was unerwĂŒnscht wĂ€re. Wenn Sie versuchen, den Lloyd's-Algorithmus anzuwenden, sind die Rechtecke in der NĂ€he der Pole der Kugel in der FlĂ€che (auf der Kugel) erheblich kleiner als in der NĂ€he des Ăquators.
Versuchen wir, diese Methode so anzupassen, dass Nachteile beseitigt werden. Die zufĂ€lligen Startpunkte des Voronoi-Diagramms werden so gewĂ€hlt, dass sie gleichmĂ€Ăig auf der Kugel verteilt sind. In der Mercator-Projektion bedeutet dies, dass sie an den Polen seltener mit einer Wahrscheinlichkeit erscheinen sollten, die proportional zum Kosinus des Breitengrads ist. Wir bauen das Voronoi-Diagramm im Polygon âWeltâ - dies ist entweder die gesamte rechteckige Projektion des Planeten oder nur ein Teil davon. Die
ST_VoronoiPolygons
Funktion selbst vervollstĂ€ndigt das Rechteck zu einem Quadrat. Wir mĂŒssen das resultierende Diagramm nur gemÀà dem "Welt"
ST_VoronoiPolygons
.
Wir betrachten das Bild von Voronoi-Polygonen, die auf angepasste Weise erhalten wurden. Hier ist ein Teil der Testplanetenkarte vom Ăquator am oberen Rand bis zu 73 Grad sĂŒdlicher Breite am unteren Rand. (Hier wurde die LandflĂ€che bereits aus Deponien herausgeschnitten.)

Wie auf der Mercator-Projektion zu sehen ist, sind Polygone normalerweise gröĂer, wenn sie sich den Polen nĂ€hern, aber sie sind in Bezug auf die FlĂ€chengröĂe ungefĂ€hr gleichmĂ€Ăig ĂŒber die Kugel verteilt. Das brauchen wir. Es ist jedoch auch zu sehen, dass die Polygone eine sehr groĂe FlĂ€chenverteilung aufweisen und das Gesamtbild eher unansehnlich ist.
Versuchen wir, mehrere Iterationen des Lloyd-Algorithmus anzuwenden. Als neue Punkte
FĂŒr nachfolgende Iterationen des Voronoi-Diagramms wĂ€hlen wir die Zentren des bereits getrimmten
"Welt" -Polygon Voronoi-Polygone. Und um zu verhindern, dass die FlĂ€che der Polygone in der NĂ€he der Pole zu stark verkleinert wird, fĂŒhren wir nur eine geringe Anzahl von Iterationen durch (etwa 3).
Um Ozeansegmente zu erhalten, wird die besetzte FlĂ€che von den erhaltenen Deponien ausgeschlossen. Infolgedessen können kleine Polygone gebildet werden, die an benachbarte gebunden werden sollen. AuĂerdem können sich kleine Polygone nahe der Grenze des "Welt" -Polygons befinden. Wir verbinden die Polygone so, dass der ânĂ€chsteâ Nachbar ausgewĂ€hlt wird und das Gesamtbild nicht beeintrĂ€chtigt wird.
Nach Anwendung eines solchen modifizierten Algorithmus erhalten wir das folgende Bild, das möglicherweise bereits akzeptabel ist. Rote Segmente in der Abbildung zeigen die gewĂŒnschte ZusammenfĂŒhrung der Polygone an.

Die Auswahl der Polygone zum ZusammenfĂŒhren kann auf verschiedene Arten erfolgen. In dem erwĂ€hnten Skript werden 2 Methoden implementiert: am lĂ€ngsten Rand und in der nĂ€chsten Mitte. Die folgende Abbildung zeigt das Ergebnis der Fusion auf die zweite Weise.

Im Allgemeinen haben wir erreicht, was von den Ozeansektoren gewĂŒnscht werden kann. Ihre FlĂ€che ist ungefĂ€hr gleich (auf der Kugel) und sie sind entweder konvex oder weisen kleine Abweichungen von der KonvexitĂ€t auf.
Die Hauptfunktion zur Erzeugung von Ozeansektoren:
map.makeOceanSectors( world Geometry, avg_vp_areaKM Double Precision, merging_ratio Double Precision, merging_method Int ) RETURNS Void
world
- ein âWeltâ -Trainingsplatz, der als Grenzen der Welt dient.
avg_vp_areaKM
- die durchschnittliche FlÀche (km
2 ) von Polygonen, aus denen die
avg_vp_areaKM
bestehen.
merging_ratio
- Anteil von
avg_vp_areaKM
, sodass der Sektorbereich, wenn er kleiner als er ist, an den benachbarten angehÀngt wird.
merging_method
- ZusammenfĂŒhrungsmethode ('1' oder '2').
Ein Beispiel. Wir bauen Sektoren auf einer bestimmten Weltdeponie mit einer durchschnittlichen GrundflÀchendeponie von 1.000.000 km
2 . Sektoren, deren FlĂ€che kleiner als die HĂ€lfte dieser GröĂe ist, werden mit anderen verbunden. Die zweite Methode zum ZusammenfĂŒhren wird verwendet - in der nĂ€chsten Mitte.
SELECT * FROM map.makeOceanSectors( ST_GeomFromText( 'POLYGON((-75 -85, 75 -85, 75 85, -75 85, -75 -85))', 4326 ), 1000000, 0.5, 2 );
Segmente der Kontinente.
Auf dem Festland können Sie eine interessantere Unterteilung vornehmen, die einerseits auf der Gesamtheit der kleinen Basisbereiche und andererseits auf natĂŒrlichen Objekten wie FlĂŒssen und Wassereinzugsgebieten basiert. Die so erhaltene Struktur ist der Karte der Staaten und Provinzen in ihnen sehr Ă€hnlich. Das heiĂt, dies ist der Prozess der
prozeduralen Erstellung der politischen Weltkarte .
Im Gegensatz zu Ozeansegmenten ist die Ausbuchtung völlig optional.
Bei forgedmaps.com gibt es noch keine Wassereinzugsgebiete, aber es gibt bereits FlĂŒsse. Die Verwendung von FlĂŒssen in einem Skript erfordert deren Darstellung in einem
MultiLineString . Sie haben diese Idee im Shapefile des
Flusses . Beim Import in die Datenbank können Sie die ĂŒberschĂŒssige Z-Koordinate in diesem Prozess sofort entfernen. Andere erforderliche Daten, nĂ€mlich die Grenzen von Landgebieten, befinden sich im Shapefile des
Landes . Jedes Landgebiet hat eine
aid
(Gebiets-ID) und kann aus dem Kontinent und den nÀchstgelegenen Inseln oder nur kleinen Inseln in der NÀhe bestehen.
In unserem Beispiel wĂ€hlen wir die durchschnittliche SektorgröĂe von 40.000 km
2 und die durchschnittliche GröĂe des Basispolygons von 5.000 km
2 . Dies ist eine ziemlich groĂe GröĂe, die nur zur Veranschaulichung ausgewĂ€hlt wurde. Kleinere GröĂen sind ebenfalls akzeptabel (bis zu einigen m
2 ), behalten Sie jedoch die Berechnungszeit im Auge und verwenden Sie die entsprechende Datenbankkonfiguration.
In diesem Bild ein Beispiel dafĂŒr, wie die Basispolygone innerhalb der LandflĂ€che aussehen.

Der nĂ€chste Schritt besteht darin, die Basispolygone zu Sektoren zu kombinieren. WĂ€hlen Sie dazu zufĂ€llig aus den Basispolygonen so viele Sektoren aus, wie wir erstellen möchten, und fĂŒgen Sie nach und nach benachbarte Polygone den akkumulierenden Sektoren hinzu.

Jetzt ist die Zeit gekommen, den Fluss zu berĂŒcksichtigen. Wir verwenden sie, um Sektoren in zu unterteilen
Teile durch die
ST_Split
Funktion
ST_Split
. Eine solche Aufteilung kann in AbhĂ€ngigkeit von bestimmten Bedingungen durchgefĂŒhrt werden: dem endgĂŒltigen Flussfluss oder der FlĂ€che des abgetrennten Teils.
Jetzt können wir sehen, wie einige Grenzen entlang der FlĂŒsse verlaufen.

Wir verbinden kleine Teile von Sektoren mit groĂen Sektoren. Aber wir mĂŒssen es versuchen
Befestigen Sie keine Teile an denselben Sektoren, von denen sie abgeschnitten wurden.

Mit groĂen LandflĂ€chen haben wir es geschafft, aber immer noch kleine Inseln. Wir machen diejenigen von ihnen, die eine FlĂ€che nahe der durchschnittlichen FlĂ€che des Sektors haben, gleichzeitig zu getrennten Sektoren. Aber mit denen, deren FlĂ€che viel kleiner als der durchschnittliche Sektor ist, machen wir zwei Dinge.
1. Wenn solche Inseln relativ weit von bestehenden Sektoren entfernt sind, machen wir sie zu getrennten Sektoren. âFarnessâ hĂ€ngt hier von der gegebenen durchschnittlichen FlĂ€che des Sektors ab: Je kleiner diese FlĂ€che ist, desto wahrscheinlicher ist es, dass die Insel zu einem separaten Sektor wird.
2. Befindet sich die Insel in der NĂ€he anderer bereits erstellter Sektoren, wird sie mit einem dieser Sektoren kombiniert. Mit demjenigen, der die gröĂte FlĂ€che in einem bestimmten Polygon hat, das mit
ST_Buffer
von dieser Insel erhalten wurde.

Hier fielen vier Inseln in zwei verschiedene Sektoren. Wenn Sie die festgelegte durchschnittliche SektorflĂ€che erhöhen, fallen frĂŒher oder spĂ€ter alle Inseln in einen einzigen Sektor.
Die Hauptfunktion zur Erzeugung von Sektoren an Land:
map.makeLandSectors( aid BigInt, avg_vp_areaKM Double Precision, avg_sector_areaKM Double Precision, max_sector_cut_area_ratio Float, pref_min_island_area_ratio Float, min_streamflow Int ) RETURNS Void
aid
- Kennung des GrundstĂŒcks.
avg_vp_areaKM
- die durchschnittliche FlÀche (km
2 ) der Basispolygone.
avg_sector_areaKM
- durchschnittliche FlÀche (km
2 ) der Sektoren.
max_sector_cut_area_ratio
- Der Anteil von
avg_sector_areaKM
, der die maximale FlÀche bestimmt, die vom Fluss abgeschnitten werden kann.
pref_min_island_area_ratio
- der Anteil von
avg_sector_areaKM
, der die MindestflÀche bestimmt, mit der die Insel sofort zu einem separaten Sektor wird.
streamflow
- Wenn der Fluss einen
streamflow
von mindestens diesem Wert hat, nimmt er an Schnittsektoren teil.
Im folgenden Beispiel werden mit der Funktion Sektoren auf einem GrundstĂŒck mit Hilfe = 5 erstellt. In diesem Fall werden Basispolygone mit einer durchschnittlichen FlĂ€che von 5.000 km
2 verwendet, um Sektoren mit einer durchschnittlichen FlÀche von 40.000 km
2 zu erstellen. Gleichzeitig betrĂ€gt das maximale Gebiet, das von FlĂŒssen abgeschnitten wird, 0,125 * 40.000 km
2 , und 0,25 * 40.000 km
2 ist das Mindestgebiet, auf dem die Inseln sofort zu Sektoren werden. Um Sektoren nach FlĂŒssen zu schneiden, werden FlĂŒsse mit einem Mindestabfluss von 2 verwendet.
SELECT * FROM map.makeLandSectors(5, 5000, 40000, 0.125, 0.25, 2);
Referenzen
Es ist SQL-Skriptcode verfĂŒgbar, der die gesamte Arbeit erledigt, einschlieĂlich der Erstellung von Sektoren und der Erstellung von Ăbergangsgraphen zwischen benachbarten Sektoren. GIS-Daten von prozedural generierten Planeten können von
forgedmaps.com abgerufen werden . Sie können
GIS-Erddaten verwenden , die zu einer Ă€hnlichen Struktur fĂŒhren. Sie können mit jedem
modernen GIS auch Daten manuell von Grund auf neu erstellen oder neue Daten erhalten, indem Sie Daten konvertieren, die von einer anderen Quelle empfangen wurden. AusfĂŒhrlichere Anweisungen fĂŒr das Skript finden Sie im
Handbuch .