在JMapViewer中绘制地质断层/穹窿线遇依赖问题,求解决方案
JMapViewer绘制地质断层/穹窿线完整解决方案
1. 获取完整JMapViewer源码
不要使用第三方jar下载站的精简包,直接获取官方完整源码,确保包含MapPolygonImpl等核心实现类。
2. NetBeans导入多文件夹源码步骤
- 打开NetBeans,创建新的Java Application项目
- 右键项目 → 新建 → 文件夹,按照源码的包结构(如
org.openstreetmap.gui.jmapviewer)创建对应层级的包文件夹 - 将下载的源码文件(
.java)逐一复制到对应包路径下 - 右键项目 → 属性 → 库,移除之前添加的精简版JMapViewer jar,避免类冲突
3. 绘制地质线的两种实现方式
方式一:使用官方MapPolygonImpl类
完整源码包含该类,可直接复用旧问题的逻辑,适用于折线或闭合穹窿线:
// 构造地质线的经纬度点集合 List<GeoPoint> faultPoints = new ArrayList<>(); // 添加实际地质点的经纬度 faultPoints.add(new GeoPoint(39.9042, 116.4074)); faultPoints.add(new GeoPoint(39.9152, 116.4274)); faultPoints.add(new GeoPoint(39.9082, 116.4354)); // 创建地质线对象并设置样式 MapPolygonImpl faultLine = new MapPolygonImpl(faultPoints); faultLine.setColor(Color.RED); faultLine.setStroke(new BasicStroke(2f)); // 设置线宽 // 添加到地图控件 JMapViewer map = new JMapViewer(); map.addMapPolygon(faultLine);
方式二:自定义Overlay绘制(不依赖MapPolygonImpl)
如果需要更灵活的样式控制,可自定义MapOverlay实现绘制:
public class GeoLineOverlay extends MapOverlay { private List<GeoPoint> geoPoints; private Color lineColor; private float lineWidth; private boolean isClosed; // 是否为闭合穹窿线 public GeoLineOverlay(List<GeoPoint> points, Color color, float width, boolean closed) { this.geoPoints = points; this.lineColor = color; this.lineWidth = width; this.isClosed = closed; } @Override public void paint(Graphics g, JMapViewer map, int width, int height) { super.paint(g, map, width, height); Graphics2D g2d = (Graphics2D) g.create(); // 将经纬度点转换为屏幕坐标 Point[] screenPoints = new Point[geoPoints.size()]; for (int i = 0; i < geoPoints.size(); i++) { screenPoints[i] = map.getMapPosition(geoPoints.get(i)); } // 设置绘制样式 g2d.setColor(lineColor); g2d.setStroke(new BasicStroke(lineWidth)); // 绘制:闭合线用drawPolygon,非闭合用drawPolyline if (isClosed) { g2d.drawPolygon(screenPoints); } else { g2d.drawPolyline(screenPoints, 0, screenPoints.length); } g2d.dispose(); } } // 使用示例:绘制闭合穹窿线 List<GeoPoint> domePoints = new ArrayList<>(); domePoints.add(new GeoPoint(30.2672, 120.1551)); domePoints.add(new GeoPoint(30.2772, 120.1651)); domePoints.add(new GeoPoint(30.2692, 120.1751)); domePoints.add(new GeoPoint(30.2672, 120.1551)); // 闭合点 GeoLineOverlay domeOverlay = new GeoLineOverlay(domePoints, Color.BLUE, 3f, true); JMapViewer map = new JMapViewer(); map.addMapOverlay(domeOverlay);
内容的提问来源于stack exchange,提问作者Ennui
相关产品推荐
相关产品推荐

