Java GUI App - 在地图上叠加图像(背景图像)

时间:2012-09-05 08:57:47

标签: 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-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_closed.png";

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

  • 为每个资产注册一个点击事件处理程序
  • 更改资产的可见性
    hotel1.visible = false;

我是一位经验丰富的.Net程序员。这个任务在.Net中是一个简单的任务,但是我不清楚在Java中完成上述任务的最佳方法。请有人建议实现上述目标的最佳方法。如果建议使用概念,我很高兴Google(我不需要完整的编码解决方案!!)

非常感谢,伊恩

3 个答案:

答案 0 :(得分:3)

我假设您希望您的应用程序是桌面而不是基于Web。在使用第三方映射解决方案之前,我在这种情况下做了类似的事情(虽然相当复杂)。不幸的是,该解决方案需要许可证,无论如何都不再可用。

如果您只想在桌面应用程序中使用简单的不可滚动地图,我建议您从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();
    }
}

你需要编辑它来加载你文件中的图像 - 我想让它自包含并且易于运行,所以我刚刚创建了内嵌图像。

答案 1 :(得分:3)

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

我首先阅读(无特定顺序)

我也要熟悉The Java Tutorials

虽然以上大部分都是特定于GUI的,但我会阅读

之类的内容

仅仅因为在Java中编码的位置并不重要,这些将永远有用。

快乐阅读:)

<强>更新

哦,当然还有所有重要的API docs(AKA JavaDocs)

<强>更新

当你对这一切感到满意时,你可能想看看SwingX WS,它有一个很好的例子来拉动Google&amp; OpenStreet地图

答案 2 :(得分:1)

答案尚未被接受。因此,使用伪代码作为示例,我使用JavaFX 2编写了一个快速覆盖示例。使用您提到的JPG文件,可以使用ImageView轻松替换WebView。

以下是代码:

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

}