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.
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.
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.
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 ■ Tuile DEM de l'Institut national de recherche foncière ■ Mosaïque de diagramme de courbure calculée à partir de la mosaïque DEM ■ Carreau de dessin CS 3D généré
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 ■ Tuile de terrain de glissement de terrain JSHIS ■ Tuile de terrain antidérapante CS
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.
Lors de la création de la tuile de dessin CS 3D, j'ai fait référence aux matériaux suivants.
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