利用gis中的shapefile在JavaFX中绘制地图

利用gis中的shapefile在JavaFX中绘制地图,javafx,Javafx,这是我的代码: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.sc

这是我的代码:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Polygon; 
import javafx.stage.Stage; 
import org.nocrala.tools.gis.data.esri.shapefile.ShapeFileReader; 
import org.nocrala.tools.gis.data.esri.shapefile.ValidationPreferences; 
import org.nocrala.tools.gis.data.esri.shapefile.exception.InvalidShapeFileException; 
import org.nocrala.tools.gis.data.esri.shapefile.header.ShapeFileHeader; 
import org.nocrala.tools.gis.data.esri.shapefile.shape.AbstractShape; 
import org.nocrala.tools.gis.data.esri.shapefile.shape.PointData; 
import org.nocrala.tools.gis.data.esri.shapefile.shape.shapes.PolygonShape; 

public class MakeMap extends Application 
{ 
static FileInputStream is; 
static ShapeFileReader read; 
static ShapeFileHeader head; 
static AbstractShape shape; 
static ValidationPreferences prefs; 
static double minLat; 
static double minLon; 
static double maxLat; 
static double maxLon; 
static double ratio;     
static double bMinLat;  
static double bMinLon; 
static double bMaxLat; 
static double bMaxLon; 
int gapx = 0, gapy = 0; 
public void makeRatio(double lon_max, double lon_min, double lat_max, double lat_min) 
{ 
double x, y; x = lon_max - lon_min; 
y = lat_max - lat_min; 
x = 600 / x; 
y = 600 / y; if (x < y) 
{ 
ratio = x; 
gapy = (int) ((600 - (lat_max - lat_min) * x) / 2); 
} else { 
ratio = y; gapx = (int) ((600 - (lon_max - lon_min) * y) / 2); } } 

public void assignBoundary(double min_lon, double max_lon, double min_lat, double max_lat) 
{ 
minLon = coActLon(min_lon) * ratio; maxLon = coActLon(max_lon) * ratio; minLat = coActLat(min_lat) * ratio; 
maxLat = coActLat(max_lat) * ratio; 
} 

public double coActLat(double p) 
{ 

p = bMaxLat - p; return p; 
} 
public double coActLon(double p) 
{ 
p = p - bMinLon; return p; 
} 
public int assignBoundaryLon(double p) 
{ 
p = coActLon(p) * ratio - minLon; p += gapx; 
return (int) p; 
} 
public int assignBoundaryLat(double p) 
{ 
 p = coActLat(p) * ratio; 
 p = p - maxLat; p += gapy; 
 return (int) p; 
 } 
 @Override public void start(Stage stage) throws Exception 
 { File file = new File("/home/ranu/world.shp"); 
 Canvas canvas = new Canvas(600, 600); 
 GraphicsContext gc = canvas.getGraphicsContext2D(); 
  try 

  { 
  is = new FileInputStream(file); 
  } 
  catch (FileNotFoundException e) 
  { // TODO Auto-generated catch block 
   e.printStackTrace(); 
   } prefs = new ValidationPreferences(); 

   prefs.setMaxNumberOfPointsPerShape(33200); 
   try 
   { 
   read = new ShapeFileReader(is, prefs); 
    } 
   catch (InvalidShapeFileException | IOException e) 
    { // TODO Auto-generated catch block e.printStackTrace(); } 
    head = read.getHeader(); 
     bMaxLon = head.getBoxMaxX();
    bMinLon = head.getBoxMinX(); 
    bMaxLat = head.getBoxMaxY(); 
   bMinLat = head.getBoxMinY(); 
    makeRatio(head.getBoxMaxX(), head.getBoxMinX(), head.getBoxMaxY(), head.getBoxMinY()); 
     assignBoundary(head.getBoxMinX(), head.getBoxMaxX(), head.getBoxMinY(), head.getBoxMaxY()); 
   gc.setFill(Color.rgb(53, 153, 255)); 
    gc.fillRect(gapx, gapy, (maxLon - minLon), (minLat - maxLat)); 
   drawShape(gc); 
   StackPane root = new StackPane(); 
    root.getChildren().add(canvas); 
    Scene scene = new Scene(root); 
     stage.setScene(scene); 
   stage.show(); 
   } 
   public void drawShape(GraphicsContext gc) throws IOException, InvalidShapeFileException 
  { 
   int i = 0; gc.setFill(Color.WHITE); 
  gc.setStroke(Color.LIGHTGREY); gc.setLineWidth(1); 
   gc.strokeLine(10, 20, 30, 40); 
  Polygon polygon = new Polygon(); 
   polygon.getPoints().add(new Double(20.0)); 
  int count = 0; 
   double[] lat; 
   double[] lon; 
   Double[] data; gc.setStroke(Color.LIGHTGRAY); 
   while ((shape = read.next()) != null && count < 360) 
    { // System.out.println(shape); 
    switch (shape.getShapeType()) 
    { 
     case POINT: // PointShape aPoint = (PointShape) shape; 
    // Do something with the point shape... break; 
   case MULTIPOINT_Z: // MultiPointZShape aMultiPointZ = (MultiPointZShape) shape; 
   // Do something with the MultiPointZ shape... break; 
     case POLYGON: PolygonShape aPolygon = (PolygonShape) shape; 
    lat = new double[aPolygon.getNumberOfPoints()]; 
    lon = new double[aPolygon.getNumberOfPoints()]; 
    data = new Double[aPolygon.getNumberOfPoints() * 2]; 
    int j = 0; 
    double x, y; 
    PointData[] point = aPolygon.getPoints(); 
    for (i = 0; i < aPolygon.getNumberOfPoints(); i++) 
    { 
     x = point[i].getX(); 
     y = point[i].getY(); 
     j = 0; lat[j] = this.assignBoundaryLat(point[i].getY()); 
     lon[j] = this.assignBoundaryLon(point[i].getX()); 
     // data[j++] = new // Double(this.assignBoundaryLon(point[i].getX())); 
    // data[j] = new // Double(this.assignBoundaryLon(point[i].getY())); 
    for (j = j + 1, i = i + 1; (x != point[i].getX() || y != point[i] .getY()) && i < aPolygon.getNumberOfPoints(); i++, j++) 
     { 
     // lat[j] = this.assignBoundaryLat(point[i].getY()); 
     // lon[j] = this.assignBoundaryLon(point[i].getX()); 
     // data[j++] = new // Double(this.assignBoundaryLat(point[i].getX())); 
    // data[j] = new // Double(this.assignBoundaryLat(point[i].getY())); } 
    System.out.println(lat.length + " " + lon.length + " " + j); 
     // Polygon pg = new Polygon(); 
     // pg.getPoints().addAll(data); 
     gc.strokePolygon(lon, lat, j); 
      System.out.println(count); 
     count ++; } 
     break; default: break; } } } 
     public static void main(String[] args) 
     { Application.launch(args); } 
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.layout.ancorpane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Polygon;
导入javafx.stage.stage;
导入org.nocrala.tools.gis.data.esri.shapefile.ShapeFileReader;
导入org.nocrala.tools.gis.data.esri.shapefile.ValidationPreferences;
导入org.nocrala.tools.gis.data.esri.shapefile.exception.InvalidShapeFileException;
导入org.nocrala.tools.gis.data.esri.shapefile.header.ShapeFileHeader;
导入org.nocrala.tools.gis.data.esri.shapefile.shape.AbstractShape;
导入org.nocrala.tools.gis.data.esri.shapefile.shape.PointData;
导入org.nocrala.tools.gis.data.esri.shapefile.shape.shapes.PolygonShape;
公共类MakeMap扩展了应用程序
{ 
静态文件输入流为;
静态ShapeFileReader读取;
静态成形头;
静态抽象形状;
静态验证首选项优先;
静态双minLat;
静态双minLon;
静态双maxLat;
静态双maxLon;
静态倍率;
静态双bMinLat;
静态双双线性化;
静态双bMaxLat;
静态双bMaxLon;
int-gapx=0,gapy=0;
公共空隙率(最大双倍长、最小双倍长、最大双倍宽、最小双倍宽)
{ 
双x,y;x=最大长度-最小长度;
y=横向最大值-横向最小值;
x=600/x;
y=600/y;如果(x
此代码中存在以下问题:

<