[JAVA] Versuchen Sie, aus der Kachel des Geographical Institute eine dreidimensionale CS-Zeichnungskachel zu erstellen

Überblick

Die Existenz einer Karte "CS dreidimensionale Karte", die die Mikrotopographie betont und kürzlich vom Forschungszentrum für Präfekturforstwirtschaft Nagano im Zusammenhang mit der Arbeit entwickelt wurde. Ich fand heraus. Die dreidimensionale CS-Karte ist ein Diagramm, das durch Synthetisieren einer Steigungskarte und einer Krümmungskarte (Krümmung) erstellt wurde. Sie ist eine dreidimensionale Zeichenmethode, die die Interpretation des Geländes wie Unebenheiten erleichtert. Verschiedene Tools wie das QGIs-Plug-In sind bereits verfügbar, aber zum Zweck des Studiums habe ich versucht, eine CS 3D-Zeichnungskachel aus der Kachel des Geographical Institute zu erstellen. Es war.

aso02.jpg aso01.jpg

Wie man ... macht

Da die zum Erstellen einer CS-Stereokarte erforderliche Neigungskarte von der Kachel des Geographical Institute bereitgestellt wird, dachte ich, dass ich beim Erstellen einer Krümmungskarte aus der DEM-Kachel eine CS-Stereokarte erstellen kann. Daher ist das Erstellungsverfahren wie folgt.

  1. Beziehen Sie die Kachel für die Neigungskarte von der Kachel des Geografischen Instituts.
  2. Beziehen Sie die DEM-Kachel von der Kachel des Geographical Institute
  3. Berechnen Sie die Krümmung aus DEM und erstellen Sie eine Krümmungsdiagrammkachel
  4. Multiplizieren Sie die Kachel des Neigungsbetragsdiagramms und das Kachelpixel des Krümmungsdiagramms, um eine stereoskopische CS-Diagrammkachel zu erstellen.

Quellcode

Der Quellcode wird auf Github hochgeladen. -> Https://github.com/termat/CSMapTile Bitte sehen Sie dort für Details. Darüber hinaus werden CS 3D-Zeichnungskacheln von der TileDB-Klasse generiert, und die Hauptverarbeitungsinhalte lauten wie folgt.

1. CS 3D-Kachelgenerierung

TileDB.Java (Auszug)


	private static String slope="https://cyberjapandata.gsi.go.jp/xyz/slopemap";
	private static String dem14="https://cyberjapandata.gsi.go.jp/xyz/dem_png";
	private static String dem15a="https://cyberjapandata.gsi.go.jp/xyz/dem5a_png";
	private static String dem15b="https://cyberjapandata.gsi.go.jp/xyz/dem5b_png";
	private static final int P8=(int)Math.pow(2,8);
	private static final int P16=(int)Math.pow(2,16);
	private static final int P23=(int)Math.pow(2,23);
	private static final int P24=(int)Math.pow(2,24);
	private static final double U=0.01;
	private static double GEO_R=6378137;
	private static int[] col=new int[]{255,232,197};

	/*
	 *CS-Kachelbildaufnahme
	 */
	public BufferedImage getCSImage(int zoom,int tileX,int tileY)throws IOException{
		String param="/"+zoom+"/"+tileX+"/"+tileY;
		BufferedImage s_img=ImageIO.read(new URL(slope+param+".png "));
		s_img=getColorTransSlope(s_img);
		BufferedImage d_img=createDemTile(zoom,tileX,tileY);
		BufferedImage c_img=getCurve(d_img,zoom);
		BufferedImage img=mul(c_img,s_img);
		return img;
	}

	/*
	 *Konvertieren Sie die Neigungskarte in Orange
	 */
	private static BufferedImage getColorTransSlope(BufferedImage img){
		int w=img.getWidth();
		int h=img.getHeight();
		BufferedImage ret=new BufferedImage(w,h,img.getType());
		for(int i=0;i<w;i++){
			for(int j=0;j<h;j++){
				float cv=(float)(img.getRGB(i, j)&0x0000ff)/255f;
				ret.setRGB(i, j, new Color((int)(col[0]*cv),(int)(col[1]*cv),(int)(col[2]*cv)).getRGB());
			}
		}
		return ret;
	}

	/*
	 *Generiere Dem Dem-Kacheln der Größe 258 x 258
	 */
	private static BufferedImage createDemTile(int zoom,int tileX,int tileY)throws IOException{
		BufferedImage bc=getDemImage(zoom,tileX,tileY);
		BufferedImage ret=new BufferedImage(bc.getWidth()+2,bc.getHeight()+2,bc.getType());
		Graphics2D g=ret.createGraphics();
		g.drawImage(bc, 1, 1, comp);
		try{
			BufferedImage bu=getDemImage(zoom,tileX,tileY-1);
			g.drawImage(bu, 1, -255, comp);
		}catch(IOException e){}
		try{
			BufferedImage bd=getDemImage(zoom,tileX,tileY+1);
			g.drawImage(bd, 1, 257, comp);
		}catch(IOException e){}
		try{
			BufferedImage bl=getDemImage(zoom,tileX-1,tileY);
			g.drawImage(bl, -255, 1, comp);
		}catch(IOException e){}

		try{
			BufferedImage br=getDemImage(zoom,tileX+1,tileY);
			g.drawImage(br, 257, 1, comp);
		}catch(IOException e){}
		g.dispose();
		return ret;
	}

	/*
	 *Holen Sie sich Dem Kachel vom Geography Institute
	 */
	private static BufferedImage getDemImage(int zoom,int tileX,int tileY)throws IOException{
		String param="/"+zoom+"/"+tileX+"/"+tileY;
		BufferedImage d_img=null;
		if(zoom<=14){
			d_img=ImageIO.read(new URL(dem14+param+".png "));
		}else{
			try{
				d_img=ImageIO.read(new URL(dem15a+param+".png "));
			}catch(IOException e){
				d_img=ImageIO.read(new URL(dem15b+param+".png "));
			}
		}
		return d_img;
	}

	/*
	 *Bildmultiplikation
	 */
	private static BufferedImage mul(BufferedImage im1,BufferedImage im2){
		int w=im1.getWidth();
		int h=im1.getHeight();
		BufferedImage ret=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		for(int i=0;i<w;i++){
			for(int j=0;j<h;j++){
				int rgb1=im1.getRGB(i, j);
				int rgb2=im2.getRGB(i, j);
				ret.setRGB(i, j, mulRGB(rgb1,rgb2));
			}
		}
		return ret;
	}

	/*
	 *RGB-Multiplikation
	 */
	private static int mulRGB(int rgb1,int rgb2){
		float r1=(float)(rgb1 >> 16 & 0xff)/255f;
		float g1=(float)(rgb1&0x00ff00 >> 8 & 0xff)/255f;
		float b1=(float)(rgb1&0x0000ff & 0xff)/255f;
		float r2=(float)(rgb2 >> 16 & 0xff)/255f;
		float g2=(float)(rgb2&0x00ff00 >> 8 & 0xff)/255f;
		float b2=(float)(rgb2&0x0000ff & 0xff)/255f;
		return new Color(r1*r2,g1*g2,b1*b2).getRGB();
	}

	/*
	 *Krümmungsbildaufnahme
	 */
	public static BufferedImage getCurve(BufferedImage dem,int zoom){
		BufferedImage ret=new BufferedImage(dem.getWidth(),dem.getHeight(),BufferedImage.TYPE_INT_RGB);
		double[][] dd=new double[dem.getWidth()][dem.getHeight()];
		for(int i=0;i<dd.length;i++){
			for(int j=0;j<dd[i].length;j++){
				dd[i][j]=getZ(dem.getRGB(i, j));
			}
		}
		double ll=getL(zoom);
		for(int i=1;i<dd.length-1;i++){
			for(int j=1;j<dd[i].length-1;j++){
				double[][] p=new double[][]{
						{dd[i-1][j-1],dd[i-1][j],dd[i-1][j+1]},
						{dd[i][j-1],dd[i][j],dd[i][j+1]},
						{dd[i+1][j-1],dd[i+1][j],dd[i+1][j+1]}};
				double cu=getCurveVal(p,ll);
				Color col=grad1.getColor(range.getNormalValue(cu));
				ret.setRGB(i, j, col.getRGB());
			}
		}
		return ret.getSubimage(1, 1, 256, 256);
	}

	/*
	 *Höhenerfassung
	 */
	private static double getZ(int intColor){
		Color c=new Color(intColor);
		int r=c.getRed();
		int g=c.getGreen();
		int b=c.getBlue();
		int x=r*P16+g*P8+b;
		if(x<P23){
			return U*(double)x;
		}else if(x>P23){
			return 0;
		}else{
			return U*(double)(x-P24);
		}
	}

	/*
	 *Zoomstufe 1 Pixel Länge(m)
	 */
	private static double getL(int zoom){
		return 2*GEO_R*Math.PI/256/Math.pow(2, zoom);
	}

	/*
	 *Krümmungsberechnung
	 */
	private static double getCurveVal(double[][] p,double ll){
		double ex1=p[1][0]+p[1][2]-2*p[1][1];
		double ex2=p[0][1]+p[2][1]-2*p[1][1];
		return (ex1+ex2)/(ll*ll)*100;
	}

■ Nationales Landforschungsinstitut Kachel mit geneigter Menge slope.png ■ DEM-Kachel des National Land Research Institute dem.png ■ Krümmungsdiagrammkachel berechnet aus DEM-Kachel curve.png ■ Generierte CS 3D-Zeichnungskachel csmap.png

2. Erzeugung von Bodenrutschfliesen

Da es sich um sehr viele Informationen zur Erdrutschtopographie handelt, die von der National Research and Development Corporation veröffentlicht wurden (http://www.j-shis.bosai.go.jp/wms-landslide) Ich beschloss, es zu erwerben, zu kacheln und mit der CM 3D-Zeichnungskachel zu überlagern. Das Erfassen und Kacheln von Informationen zur Erdrutschtopographie wird von der JShisWMS-Klasse verarbeitet.

JShisWMS.java



import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;

public class JShisWMS {
	private static final String baseURL="http://www.j-shis.bosai.go.jp/map/wms/landslide?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&";
	private static final double L=(180.0/Math.PI)*Math.asin(Math.tanh(Math.PI));

/*
 * http://www.j-shis.bosai.go.jp/wms-landslide
 *
 * 4301 Tokyo
 * 4326 WGS84
 * 4612 JGS2000
 *
 *Konturstruktur (Gleitklippe und Seitenklippe) L.-V3-S100
 *Konturstruktur (Kontur / Grenze des sich bewegenden Körpers) (Bogen des sich bewegenden Körpers) L.-V3-S200
 *Konturstruktur (Umriss / Grenze des sich bewegenden Körpers) (Polygon des sich bewegenden Körpers) L.-V3-S300
 *Interne Struktur L.-V3-S400
 *Bewegungsrichtung usw. Hauptbewegungsrichtung des sich bewegenden Körpers L.-V3-S500
 *Schwerpunkt des sich bewegenden Körpers L.-V3-CENTER
 *Alle oben genannten Erdrutschgebiete L.-V3-ALL
 *
 */

	public static BufferedImage getJShis(int zoom,int tileX,int tileY){
		try{
			String url=getURL(zoom,tileX,tileY);
			BufferedImage img=ImageIO.read(new URL(url));
			return img;
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}

	private static String getURL(int zoom,int tileX,int tileY){
		String ret=baseURL+getBBOX(zoom,tileX,tileY)+"&CRS=EPSG:4612"+"&WIDTH=256&HEIGHT=256&LAYERS=L-V3-ALL&FORMAT=image/png&TRANSPARENT=TRUE";
		return ret;
	}

	public static String getBBOX(int zoom,int tileX,int tileY){
		String ret="BBOX=";
		float[][] b=getTileBounds(zoom,tileX,tileY);
		ret=ret+Float.toString(b[1][2])+","+Float.toString(b[0][1])+","+Float.toString(b[0][2])+","+Float.toString(b[1][1]);
		return ret;
	}

	private static float[][] getTileBounds(int zoom,long tileX,long tileY){
		float[] ll1=pixelToLonLatCoord(zoom,tileX*256,tileY*256);
		float[] ll2=pixelToLonLatCoord(zoom,tileX*256+255,tileY*256+255);
		return new float[][]{ll1,ll2};
	}

	private static float[] pixelToLonLatCoord(int zoom,long x,long y){
		double lon=180.0*(x/Math.pow(2, zoom+7)-1);
		double tmp0=((-Math.PI/Math.pow(2, zoom+7))*y);
		double tmp1=atanh(Math.sin(L*Math.PI/180.0));
		double lat=(180.0/Math.PI)*Math.asin(Math.tanh(tmp0+tmp1));
		return new float[]{(float)zoom,(float)lon,(float)lat};
	}

	private static double atanh(double v){
		return 0.5*Math.log((1.0+v)/(1.0-v));
	}
}

■ CS 3D-Zeichnungskachel cs2.png ■ JSHIS-Erdrutsch-Geländekachel jsi.png ■ CS Ground Slip Terrain Fliese compo.png

3. Andere

Da es diesmal für die lokale Verwendung vorgesehen ist, speichert der Code auf Github die generierten Kacheln in Sqlite. Es enthält auch den Code für den Kachelbrowser, der mit jxmapviewer die generierten Kacheln überprüft.

Referenzmaterial

Bei der Erstellung der CS 3D-Zeichnungskachel habe ich auf die folgenden Materialien Bezug genommen.

Schließlich

Während der Untersuchung, wie eine CS-Stereokarte erstellt wird, @wayama_ryousukes Eintrag "pix2pix refill! Ich habe versucht, eine Erdrutsch-Topografie-Verteilungskarte aus einer CS-Stereokarte zu erstellen //qiita.com/wayama_ryousuke/items/8e6c2b091603a30d294f) " Es scheint sehr interessant zu sein, daher ist es in Bezug auf die Auflösung möglicherweise unmöglich, aber ich würde gerne pix2pix mit der diesmal erzeugten CS 3D-Kartenkachel und Erdrutsch-Geländekachel ausprobieren.

Recommended Posts

Versuchen Sie, aus der Kachel des Geographical Institute eine dreidimensionale CS-Zeichnungskachel zu erstellen
Versuchen Sie, einen Iterator zu erstellen, der einen Blick darauf werfen kann
Machen Sie einen Rand links vom TextField
3. Erstellen Sie eine Datenbank für den Zugriff über das Webmodul
Wie erstelle ich einen MOD für Slay the Spire?
[JavaFX] Versuchen Sie, ein Software-MIDI-Keyboard zu erstellen. Teil 2 Schieben Sie Ihren Finger, um die Skalierung zu ändern
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
Versuchen Sie Spring Boot von 0 bis 100.
Versuchen Sie, die Idee eines zweidimensionalen Arrays mit einem eindimensionalen Array nachzuahmen
Versuchen Sie, mit JRuby eine plattformübergreifende Anwendung zu erstellen (Generierung von JAR-Dateien).
So führen Sie das Kotlin Coroutine-Beispiel über die Befehlszeile aus
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können
So erstellen Sie einen Java-Container
So erstellen Sie einen JDBC-Treiber
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Versuchen Sie, eine Server-Client-App zu erstellen
Der Weg von JavaScript nach Java
CompletableFuture Erste Schritte 2 (Versuchen Sie, CompletableFuture zu erstellen)
So erstellen Sie ein Java-Array
Zurückgeben eines Werts vom Modell an den Controller mithilfe des [Swift5] -Protokolls
So führen Sie eine GIF-Datei über die Linux-Befehlszeile aus (Ubuntu)
Versuchen Sie, mithilfe der API eine Karte von Jave an Trello auszustellen oder zu erhalten
[Rubiy] Ich möchte mit der Split-Methode ein Array aus einer Zeichenfolge erstellen. Und umgekehrt.
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht