Java GUI应用程序-在地图上覆盖图像(背景图像)

Java GUI应用程序-在地图上覆盖图像(背景图像),java,image,user-interface,map,overlay,Java,Image,User Interface,Map,Overlay,我想创建一个简单的GUI应用程序来显示城市地图 然后,我希望通过编程将酒店、餐厅等项目(资产)作为图像添加到此地图 伪代码将如下所示 [set up background object with map image covering entire form] [create hotel1 object (image, label with icon or whatever] hotel1.image = "hotel.png"; hotel1.size-x = 30; hotel1.size-

我想创建一个简单的GUI应用程序来显示城市地图

然后,我希望通过编程将酒店、餐厅等项目(资产)作为图像添加到此地图

伪代码将如下所示

[set up background object with map image covering entire form]

[create hotel1 object (image, label with icon or whatever]
hotel1.image = "hotel.png";
hotel1.size-x = 30;
hotel1.size-y = 30;
hotel1.location-x = 450; (pixels)
hotel1.location-y = 300;
background-object.add(hotel1);

[create restaurant1 object (image, label with icon or whatever]
restaurant1 .image = "hotel.png";
restaurant1 .size-x = 30;
restaurant1 .size-y = 30;
restaurant1 .location-x = 600; (pixels)
restaurant1 .location-y = 400;
background-object.add(restaurant1);

[repeat for hotel2, hotel3, restaurant2 etc...]
这样我就可以在地图上添加任意数量的资产。我需要的其他功能是

  • 更改资产的图像(例如,显示资产的不同图像)
    hotel1.image=“hotel\u closed.png”

  • 重叠资产(如果它们靠近)

  • 为每个资源注册单击事件处理程序
  • 更改资产的可见性
    hotel1.visible=false
我是一名经验丰富的.Net程序员。这个任务在.Net中很简单,但是我不清楚用Java实现上述任务的最佳方法。请有人提出实现上述目标的最佳方法。如果有人提出一个概念,我很乐意用谷歌搜索(我不需要一个完整的编码解决方案!!)


非常感谢,伊恩,我假设你希望你的应用程序是桌面的,而不是基于网络的。在这种情况下,在使用第三方映射解决方案之前,我已经做了类似的事情(尽管相当复杂)。不幸的是,该解决方案需要许可证,并且无论如何都不再可用

如果您只想在桌面应用程序中使用一个简单的不可滚动地图,我建议您从Swing解决方案开始。查看扩展JComponent对象并重写该方法

public void paintComponent(Graphics g){
    // use g to draw things
}
使用图形对象绘制地图图像和图标。将此组件添加到Swing JFrame中,并设置正确的大小和布局

如果你想在网页上看到这一点,那么其他人会更好地帮助你

编辑:

从这里和另一篇文章中给出的反馈来看,我认为您可能会从一段代码中获益,因此:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SwingPaintDemo extends JPanel {

    private BufferedImage map = null;
    private BufferedImage pointer = null;

    public SwingPaintDemo() {
        this.setPreferredSize(new Dimension(200, 200));
        loadImagesFromFile(); 
    }

    private void loadImagesFromFile() {
        // load your images form file - these are fakes: 
        map = new BufferedImage(200, 200, BufferedImage.TYPE_3BYTE_BGR);
        pointer = new BufferedImage(10, 10, BufferedImage.TYPE_4BYTE_ABGR);

        Graphics g = map.getGraphics();
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 200, 200);

        g = pointer.getGraphics();
        g.setColor(Color.BLUE);
        g.fillOval(0, 0, 10, 10);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // paint map
        g.drawImage(map, 0, 0, this);

        // paint pointers
        g.drawImage(pointer, 50, 75, this);
    }

    // this main is for testing the class but can be used as a reference
    public static void main(String... args) {
        JFrame jf = new JFrame();
        SwingPaintDemo mapper = new SwingPaintDemo();
        jf.getContentPane().setLayout(new BorderLayout());
        jf.getContentPane().add(mapper, BorderLayout.CENTER);
        jf.setVisible(true);
        jf.pack();
    }
}

您将需要编辑此文件以从您的文件加载图像-我想使此文件自包含且易于运行,因此我刚刚内联创建了图像

你可以从很多地方开始,而不知道全部要求(即如果你需要下载地图、平铺地图等),我只能给你一些概述性建议

我会先通读一遍(没有特别的顺序)

我也会让自己熟悉

虽然上面的大部分内容都是特定于GUI的,但我会仔细阅读以下内容

简单地说,因为在哪里用Java编写代码并不重要,所以这些代码总是有用的

快乐读物:)

更新

哦,当然还有最重要的(又名JavaDocs)

更新


当你对所有这些都感到满意时,你可能会想看看,它有一个很好的例子,就是拉谷歌和OpenStreet地图。答案还没有被接受。因此,以您的伪代码为例,我使用JavaFX2编写了一个快速覆盖示例。使用您提到的JPG文件,可以很容易地将WebView替换为ImageView

代码如下:

package simple.map.overlay;

import java.io.InputStream;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class SimpleMapOverlay extends Application 
{

    @Override
    public void start(Stage primaryStage) 
    {               
        WebView mapView = new WebView();
        WebEngine webEngine = mapView.getEngine();
        String url = "http://maps.google.com/maps?q=Baramerica,+South+Alamo+Street,+San+Antonio,+TX&hl=en&ll=29.416647,-98.488655&spn=0.025196,0.035233&sll=29.416423,-98.489814&sspn=0.006299,0.008808&hq=Baramerica,&hnear=S+Alamo+St,+San+Antonio,+Texas&t=m&z=15";
        url += "&output=embed";
        webEngine.load(url);

        VBox vBox = new VBox(5);
        vBox.getChildren().add(mapView);

        InputStream instream = SimpleMapOverlay.class.getResourceAsStream("beer.png");
        Image beerImage = new Image(instream);        

        instream = SimpleMapOverlay.class.getResourceAsStream("food.jpg");
        Image foodImage = new Image(instream);

        Marker laTunaMarker = new Marker(beerImage, "La Tuna");
        laTunaMarker.setLayoutX(210);
        laTunaMarker.setLayoutY(480);

        Marker rosariosMarker = new Marker(foodImage, "Rosarios");
        rosariosMarker.setLayoutX(360);
        rosariosMarker.setLayoutY(300);

        Group root = new Group();
        root.getChildren().add(vBox);
        root.getChildren().add(laTunaMarker);
        root.getChildren().add(rosariosMarker);
        Scene scene = new Scene(root);        

        primaryStage.setTitle("Hello Map World with Markers!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) 
    {
        launch(args);
    }

    class Marker extends Group
    {
        public Marker(Image image, String text)
        {
            ImageView imageView = new ImageView(image);            
            Label label = new Label(text);            
            VBox vbox = new VBox(5);
            vbox.getChildren().add(imageView);
            vbox.getChildren().add(label);
            getChildren().add(vbox);
        }
    }

}

谢谢你的回复,肯。是的,这是一个桌面应用程序。也可以在下面的帖子中看到我的评论。干杯,伊安坦克斯。我把需求保持得很好,很简单。它将是一个JPG作为地图背景,在本地配置资源,并设置与表单相同的大小(800px^2)。摆在我面前的主要问题似乎是重叠图像,并将它们放置在给定坐标集的表格上。我已经阅读了您在上面链接的页面……看起来实现这一点的最佳方法是在JFrame中有一个JLayeredPane,然后为背景图像添加一个JPanel,然后为地图上的每个资产添加一个较小的JPanel(在JPanel实例上绘制一个BuffereImage),使用xPos和yPos定位在JLayeredPane上。你觉得这个解决方案怎么样?另外,如果你是第二次更新,地图将是一个专门的,所以不能从G.maps或类似的来源。背景.PNG就可以了!由于我传递给#getResourceAsStream()的路径,图像需要与SimpleMapOverlay类位于同一目录中。感谢大家的回答。我使用了每个答案中的一些信息(对不起,onebeartoe,我最终避免了使用JavaFX),但答案是关于这个主题的丰富信息。(我的解决方案是我对MadProgrammer帖子的评论)