Java如何实现地图选择地址

目标:

实现地图选择地址


内容:

Java可以使用第三方地图开放平台提供的API,或者使用Java Swing或JavaFX框架自带的组件实现地图选择地址功能。

  1. 使用第三方地图开放平台API 获取一个地图开放平台的开发者账号,并使用该账号获取API密钥。根据该地图开放平台提供的API文档编写Java代码,调用API接口获取地图数据,并将地图显示在Java应用程序界面的图形组件中。例如,使用高德地图API实现的Java地图应用:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

import com.alibaba.fastjson.JSONObject;
import com.amap.api.maps.MapView;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeResult;

public class MapDemo {

    private JFrame frame;
    private MapView mapView;
    private JButton button;
    private GeocodeSearch geocoderSearch;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MapDemo window = new MapDemo();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MapDemo() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

        mapView = new MapView(frame.getContentPane().getSize());

        button = new JButton("选择地址");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GeocodeSearch search = new GeocodeSearch(mapView.getMap());
                search.setOnGeocodeSearchListener(new OnGeocodeSearchListener() {
                    public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
                        if (rCode == 1000) {
                            JSONObject jsonObject = new JSONObject();
                            jsonObject.put("latitude", result.getRegeocodeQuery().getPoint().getLatitude());
                            jsonObject.put("longitude", result.getRegeocodeQuery().getPoint().getLongitude());
                            jsonObject.put("address", result.getRegeocodeAddress().getFormatAddress());
                            System.out.println(jsonObject.toJSONString());
                        }
                    }
                    public void onGeocodeSearched(LatLonPoint arg0, int arg1) {
                    }
                });
                search.getFromLocation(mapView.getMap().getCameraPosition().target, 300);
            }
        });

        frame.getContentPane().add(mapView, FlowLayout.LEFT);
        frame.getContentPane().add(button, FlowLayout.RIGHT);

        mapView.onCreate(null);
        geocoderSearch = new GeocodeSearch(frame);
    }

}
  1. 使用Java Swing或JavaFX框架自带的组件 Java Swing和JavaFX框架都提供了内置的图形组件用于显示地图数据,例如JMapViewer和MapView。您可以使用这些组件实现地图选择地址功能。例如,使用JMapViewer实现的Java地图应用:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.Layer;
import org.openstreetmap.gui.jmapviewer.LayerGroup;
import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
import org.openstreetmap.gui.jmapviewer.MapMouseEvent;
import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;
import org.openstreetmap.gui.jmapviewer.tilesources.BingAerialTileSource;
import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource;

public class MapDemo {
    
    private JFrame frame;
    private JMapViewer mapViewer;
    private JTextField addressField;
    private JButton searchButton;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MapDemo window = new MapDemo();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MapDemo() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        mapViewer = new JMapViewer();
        mapViewer.setZoomControlsVisible(true);
        mapViewer.setDisplayPositionByLatLon(39.9042, 116.4074, 10);

        LayerGroup mainLayerGroup = new LayerGroup("Main");
        Layer mainLayer = new Layer("Main");
        mainLayerGroup.addLayer(mainLayer);

        MapMarkerDot marker = new MapMarkerDot(mainLayer, 39.9042, 116.4074);
        marker.setName("北京");
        mapViewer.addMapMarker(marker);

        mapViewer.setMapMarkerVisible(true);
        mapViewer.setTileSource(new OsmTileSource.Mapnik());
        mapViewer.setTileSource(new BingAerialTileSource());

        mapViewer.addMouseListener(new JMapViewerMouseListener());

        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(mapViewer, BorderLayout.CENTER);

        JPanel searchPanel = new JPanel(new FlowLayout());
        searchPanel.setBackground(Color.WHITE);
        addressField = new JTextField(20);
        searchButton = new JButton("搜索");
        searchButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String address = addressField.getText();
                System.out.println("search address: " + address);
            }
        });
        searchPanel.add(addressField);
        searchPanel.add(searchButton);

        frame.getContentPane().add(searchPanel, BorderLayout.SOUTH);
    }

    private class JMapViewerMouseListener implements org.openstreetmap.gui.jmapviewer.interfaces.MapMouseListener {

        @Override
        public void mapClicked(MapMouseEvent arg0) {
            if (arg0.getButton() == MouseEvent.BUTTON1) {
                double latitude = arg0.getLat();
                double longitude = arg0.getLon();

                // Remove old marker
                for (MapMarker m : mapViewer.getMapMarkerList()) {
                    if (m instanceof MapMarkerDot) {
                        mapViewer.removeMapMarker(m);
                    }
                }

                // Add new marker
                MapMarkerDot marker = new MapMarkerDot(latitude, longitude);
                marker.setName("选择地址");
                mapViewer.addMapMarker(marker);

                // Reverse geocoding
                String address = "未知地址";
                System.out.println("select address: (" + latitude + "," + longitude + ")");
                addressField.setText(address);
            }
        }

        @Override
        public void mapMoved(MapMouseEvent arg0) {
        }
    }

}

以上内容便是我总结的地图选择地址的相关实现代码,如有错误,请指正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值