[JAVA] Essayez de créer une tuile de dessin en trois dimensions CS à partir de la tuile Institut géographique

Aperçu

L'existence d'une carte «CS tridimensionnelle carte» qui met l'accent sur la microtopographie, qui a été récemment conçue par Centre de recherche forestière de la préfecture de Nagano en lien avec les travaux J'ai découvert. La carte tridimensionnelle CS est un diagramme créé en synthétisant une carte de pente et une carte de courbure (Courbure), et est une méthode de dessin en trois dimensions qui facilite l'interprétation du terrain comme les irrégularités. Divers outils tels que le plug-in QGIs sont déjà fournis, mais dans le but d'étudier, j'ai essayé de créer une tuile de dessin CS 3D à partir de la tuile Geographical Institute. C'était.

aso02.jpg aso01.jpg

Comment faire

Puisque la carte d'inclinaison requise pour créer une carte solide CS est fournie par la tuile Institut géographique, j'ai pensé que si je crée une carte de courbure à partir de la tuile DEM, je peux créer une carte solide CS. Par conséquent, la procédure de création est la suivante.

  1. Récupérez la tuile de la carte d'inclinaison de la tuile Institut géographique.
  2. Obtenir la tuile DEM de la tuile Institut géographique
  3. Calculez la courbure à partir du DEM et créez une tuile de diagramme de courbure
  4. Multipliez la tuile du diagramme d'inclinaison et le pixel de la tuile du diagramme de courbure pour générer une tuile de diagramme stéréoscopique CS.

Code source

Le code source est téléchargé sur Github. -> Https://github.com/termat/CSMapTile S'il vous plaît voir ici pour plus de détails. De plus, les tuiles de dessin CS 3D sont générées par la classe TileDB et le contenu principal du traitement est le suivant.

1. Génération de tuiles CS 3D

TileDB.java (extrait)


	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};

	/*
	 *Acquisition d'image de tuile CS
	 */
	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;
	}

	/*
	 *Convertir la carte d'inclinaison en 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;
	}

	/*
	 *Générer une tuile Dem de taille 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;
	}

	/*
	 *Obtenir la tuile Dem de l'Institut de géographie
	 */
	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;
	}

	/*
	 *Multiplication d'image
	 */
	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;
	}

	/*
	 *Multiplication RVB
	 */
	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();
	}

	/*
	 *Acquisition d'image de courbure
	 */
	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);
	}

	/*
	 *Acquisition d'altitude
	 */
	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);
		}
	}

	/*
	 *Niveau de zoom 1 longueur de pixel(m)
	 */
	private static double getL(int zoom){
		return 2*GEO_R*Math.PI/256/Math.pow(2, zoom);
	}

	/*
	 *Calcul de courbure
	 */
	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;
	}

■ Tuile de montant incliné du National Land Research Institute slope.png ■ Tuile DEM de l'Institut national de recherche foncière dem.png ■ Mosaïque de diagramme de courbure calculée à partir de la mosaïque DEM curve.png ■ Carreau de dessin CS 3D généré csmap.png

2. Génération de tuiles de terrain antidérapant

Comme il s'agit d'une grande quantité, les informations sur la topographie des glissements de terrain du service WMS de carte de distribution de topographie de glissement de terrain publiées par l'Institut de recherche scientifique et technologique sur la prévention des catastrophes de la National Research and Development Corporation J'ai décidé de l'acquérir et de le carreler et de le superposer avec le carreau de dessin CM 3D. L'acquisition et le pavage des informations de topographie des glissements de terrain sont gérés par la classe JShisWMS.

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
 *
 *Structure de contour (falaise coulissante et falaise latérale) L-V3-S100
 *Structure de contour (contour / limite du corps en mouvement) (arc du corps en mouvement) L-V3-S200
 *Structure de contour (contour / limite du corps en mouvement) (polygone du corps en mouvement) L-V3-S300
 *Structure interne L-V3-S400
 *Sens du mouvement, etc. Sens principal du mouvement du mobile L-V3-S500
 *Centre de gravité du mobile L-V3-CENTER
 *Tout le terrain de glissement de terrain ci-dessus 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));
	}
}

■ Mosaïque de dessin CS 3D cs2.png ■ Tuile de terrain de glissement de terrain JSHIS jsi.png ■ Tuile de terrain antidérapante CS compo.png

3. Autre

Puisque cette fois, il est destiné à un usage local, le code sur Github stocke les tuiles générées dans Sqlite. Il comprend également le code du navigateur de tuiles qui utilise jxmapviewer pour vérifier les tuiles générées.

Matériel de référence

Lors de la création de la tuile de dessin CS 3D, j'ai fait référence aux matériaux suivants.

finalement

Tout en étudiant comment créer une carte CS 3D, @wayama_ryousuke entrée "pix2pix refill! J'ai essayé de créer une carte de distribution de topographie de glissement de terrain à partir d'une carte CS 3D //qiita.com/wayama_ryousuke/items/8e6c2b091603a30d294f) " Cela semble très intéressant, donc c'est peut-être impossible en termes de résolution, mais j'aimerais essayer pix2pix avec la tuile de carte CS 3D et la tuile de terrain de glissement de terrain générées cette fois.

Recommended Posts

Essayez de créer une tuile de dessin en trois dimensions CS à partir de la tuile Institut géographique
Essayez de créer un itérateur qui puisse être vu
Faire une marge à gauche du TextField
3. Créez une base de données à laquelle accéder à partir du module Web
Comment faire un MOD pour Slay the Spire
[JavaFX] Essayez de créer un clavier MIDI logiciel Partie 2 Faites glisser votre doigt pour changer l'échelle
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Comment créer un formulaire pour sélectionner une date dans le calendrier
Essayez Spring Boot de 0 à 100.
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Faisons une application multiplateforme avec JRuby (génération de fichier jar)
Comment exécuter l'exemple Kotlin Coroutine à partir de la ligne de commande
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
Comment identifier le chemin sur lequel il est facile de se tromper
Comment créer un conteneur Java
Comment créer un pilote JDBC
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Essayez de créer une application client serveur
La route de JavaScript à Java
CompletableFuture Getting Started 2 (Essayez de faire CompletableFuture)
Comment créer un tableau Java
Comment renvoyer une valeur du modèle au contrôleur en utilisant le protocole [Swift5]
Comment exécuter un fichier GIF à partir de la ligne de commande Linux (Ubuntu)
Essayez d'émettre ou d'obtenir une carte de Jave à Trello à l'aide de l'API
[Rubiy] Je veux créer un tableau à partir d'une chaîne de caractères avec la méthode split. Et vice versa.
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java