精华内容
下载资源
问答
  • 使用Python调用百度地图的API在地图上添加标记

    万次阅读 多人点赞 2020-12-14 15:54:26
    博主的目的是在地图上做一些标记,然后保存为html网页文件,这样方便我的软件调用,前期我使用的folium包,这个包很强大,支持添加各种标记。但有几个缺点: 地图的底图不支持百度地图,博主想用这个包的话,就不得...

    写在前面

    近期博主工作太忙,快一个月没更新博客。今天跑了大半天的腿,被一堆破事儿弄的无比憋屈,写篇博客调节一下心情。
    博主的目的是在地图上做一些标记,然后保存为html网页文件,这样方便我的软件调用,前期我使用的folium包,这个包很强大,支持添加各种标记。但有几个缺点:

    • 地图的底图不支持百度地图,博主想用这个包的话,就不得不将数据点转到高德坐标系下,然后进行下一步工作,然而高德莫名其妙的封了我的账号,说我违规调取数据,简直莫须有;
    • 间歇性的出现一些未知的问题,比如添加的标记不显示等等,可以理解,毕竟外国人写的,也还不是很成熟;
    • 最要命的是地图加载太慢了,加载出来要接近一分钟。

    想一想,既然数据点是百度坐标系下的,百度地图又提供了API,何不直接在百度地图上画呢。
    好了,上编译环境。

    • Python3.7
    • Spyder

    功能实现

    API地址

    先上百度地图js API地址
    看看API示例:
    在这里插入图片描述
    语言是JavaScript,展示的界面是添加标记点,我把完整的示例代码贴出来,并解释一下:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <title>添加点标记</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge">
        <style>
        body,
        html,
        #container {
            overflow: hidden;
            width: 100%;
            height: 100%;
            margin: 0;
            font-family: "微软雅黑";
        }
        </style>
        <script src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥"></script>
    </head>
    <body>
        <div id="container"></div>
    </body>
    </html>
    <script>
    var map = new BMapGL.Map('container');
    map.centerAndZoom(new BMapGL.Point(116.404, 39.928), 15);
    map.enableScrollWheelZoom(true);
    // 创建点标记
    var marker1 = new BMapGL.Marker(new BMapGL.Point(116.404, 39.925));
    var marker2 = new BMapGL.Marker(new BMapGL.Point(116.404, 39.915));
    var marker3 = new BMapGL.Marker(new BMapGL.Point(116.395, 39.935));
    var marker4 = new BMapGL.Marker(new BMapGL.Point(116.415, 39.931));
    // 在地图上添加点标记
    map.addOverlay(marker1);
    map.addOverlay(marker2);
    map.addOverlay(marker3);
    map.addOverlay(marker4);
    </script>
    

    虽然博主没搞过JavaScript,不过语言大体相通,能看明白写的是什么,前面是网页的基础设置,主体在script标签中,定义了四个点,然后将这四个点添加到地图上。
    官方给的示例其实是有问题的,我填上了自己申请的AK,另存为html文件后却怎么也打不开,于是初略看了下代码,发现下面这行就是个坑:

    <script src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥">
    

    我稍微改了下,改成了:

    <script src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥">
    

    就能显示了,不过显示还是不完整,猜测是可能缺少加载 BMapGL.Map方法的js包,所以不再纠结,于是在网上找了另外一段可以执行的代码,链接在这里
    这个代码也要加上https才行。有用的代码如下:

    <!DOCTYPE html>
    <html xmlns:asp="">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <style type="text/css">
            body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
        </style>
        <script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=d5Y5C26Xbhr3rBHo3GzzaA7xcXev6NL0"></script>
        <title>添加信息窗口</title>
    </head>
    <body>
    <div id="allmap"></div>
    </body>
    <script>
        // An highlighted block
        //百度地图API功能
    
        function loadJScript() {
            var script = document.createElement("script");
            script.type = "text/javascript";
            script.src = "//api.map.baidu.com/api?v=2.0&ak=d5Y5C26Xbhr3rBHo3GzzaA7xcXev6NL0&callback=init";
            document.body.appendChild(script);
        }
        window.init = function() {
            var map = new BMap.Map("allmap");            // 创建Map实例
            //var point = new BMap.Point(109.18592,34.36912); // 创建点坐标
            map.centerAndZoom(new BMap.Point(109.19708,34.36820), 15);  // 设置中心点,地图初始化
            //map.centerAndZoom(points,20);
            map.setCurrentCity("西安");          //设置当前城市
            map.clearOverlays();
            map.addControl(new BMap.MapTypeControl());
            map.enableScrollWheelZoom(true);                 //启用滚轮放大缩小
           
            //向地图中添加缩放控件
            var ctrlNav = new window.BMap.NavigationControl({
                anchor: BMAP_ANCHOR_TOP_LEFT,
                type: BMAP_NAVIGATION_CONTROL_LARGE
            });
            map.addControl(ctrlNav);
    
    
    		//向地图中添加标记点
            var myIcon =new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), {    //小车图片
                offset: new BMap.Size(0, -5),    //相当于CSS精灵
                imageOffset: new BMap.Size(0, 0)    //图片的偏移量。为了是图片底部中心对准坐标点。
            });
    
            var points = [new BMap.Point(109.19474,34.36847),new BMap.Point(109.19435,34.37712),new BMap.Point(109.19261,34.37617),new BMap.Point(109.19701,34.37728),new BMap.Point(109.19702,34.37776),new BMap.Point(109.19784,34.37738),new BMap.Point(109.19784,34.376911),new BMap.Point(109.1987,34.37333),new BMap.Point(109.19705,34.36824),new BMap.Point(109.1836,34.37393)];   //10个坐标点
    
            var marker1 =new BMap.Marker(points[1],{icon:myIcon});  // 创建10个标注
            var marker2 =new BMap.Marker(points[2],{icon:myIcon});
            var marker3 =new BMap.Marker(points[3],{icon:myIcon});
            var marker4 =new BMap.Marker(points[4],{icon:myIcon});
            var marker5 =new BMap.Marker(points[5],{icon:myIcon});
            var marker6 =new BMap.Marker(points[6],{icon:myIcon});
            var marker7 =new BMap.Marker(points[7],{icon:myIcon});
            var marker8 =new BMap.Marker(points[8],{icon:myIcon});
            var marker9 =new BMap.Marker(points[9],{icon:myIcon});
            var marker0 =new BMap.Marker(points[0],{icon:myIcon});
    
            map.addOverlay(marker1);              // 将标注添加到地图中
            map.addOverlay(marker2);
            map.addOverlay(marker3);
            map.addOverlay(marker4);
            map.addOverlay(marker5);
            map.addOverlay(marker6);
            map.addOverlay(marker7);
            map.addOverlay(marker8);
            map.addOverlay(marker9);
            map.addOverlay(marker0);
    
            map.setViewport(points);         //调整地图的最佳视野为显示标注数组point        
        loadJScript()
    </script>
    
    <script>
        layui.use('theme/settings/earth', layui.factory('theme/settings/earth'));
    </script>
    
    <!--<script type="text/javascript" src="js\jquery-2.1.1.min.js"></script>-->
    
    </html>
    
    

    Python实现

    好了,网页代码有了,可是博主并不会写html,只会简单的写写Python,如何把上面的代码合理的利用起来,并且将里面的变量改变成自己的点呢?
    博主的思路很简单,将上面这些代码分成几个部分的字符串,然后字符串拼接起来,最后形成一个完整的html网页代码。
    如果大家有仔细看上面的代码,会发现网页框架可以分成五部分:
    第一部分代码:

        <!DOCTYPE html>
        <html xmlns:asp="">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
            <style type="text/css">
                body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
            </style>
            <script type="text/javascript" src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=9Rz4tOb6PgQtqBt6K3YbSMBESLk8iYpE"></script>
            <title>添加信息窗口</title>
        </head>
        <body>
        <div id="allmap"></div>
        </body>
        <script>
            // An highlighted block
            //百度地图API功能
    
            function loadJScript() {
                var script = document.createElement("script");
                script.type = "text/javascript";
                script.src = "https://api.map.baidu.com/api?v=2.0&ak=9Rz4tOb6PgQtqBt6K3YbSMBESLk8iYpE&callback=init";
                document.body.appendChild(script);
            }
            window.init = function() {
                var map = new BMap.Map("allmap");            // 创建Map实例
                //var point = new BMap.Point(109.18592,34.36912); // 创建点坐标
                map.centerAndZoom(new BMap.Point(120.2338341,31.58109976), 15);  // 设置中心点,地图初始化
                //map.centerAndZoom(points,20);
                map.setCurrentCity("无锡");          //设置当前城市
                map.clearOverlays();
                map.addControl(new BMap.MapTypeControl());
                map.enableScrollWheelZoom(true);                 //启用滚轮放大缩小
                map.addEventListener('click', function(e) {
                    alert('点击的经纬度:' + e.latlng.lng + ', ' + e.latlng.lat);
                    var mercator = map.lnglatToMercator(e.latlng.lng, e.latlng.lat);
                    alert('点的墨卡托坐标:' + mercator[0] + ', ' + mercator[1]);
                });
                //向地图中添加缩放控件
                var ctrlNav = new window.BMap.NavigationControl({
                    anchor: BMAP_ANCHOR_TOP_LEFT,
                    type: BMAP_NAVIGATION_CONTROL_LARGE
                });
                map.addControl(ctrlNav);
    
    
        		//向地图中添加标记点
                var myIcon =new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), {    //小车图片
                    offset: new BMap.Size(0, -5),    //相当于CSS精灵
                    imageOffset: new BMap.Size(0, 0)    //图片的偏移量。为了是图片底部中心对准坐标点。
                });
    

    这部分代码是基本不会变化的,改动无非就是那两个经纬度坐标和城市名。
    再看第二部分:

    var points = [new BMap.Point(109.19474,34.36847),new BMap.Point(109.19435,34.37712),new BMap.Point(109.19261,34.37617),new BMap.Point(109.19701,34.37728),new BMap.Point(109.19702,34.37776),new BMap.Point(109.19784,34.37738),new BMap.Point(109.19784,34.376911),new BMap.Point(109.1987,34.37333),new BMap.Point(109.19705,34.36824),new BMap.Point(109.1836,34.37393)];   //10个坐标点
    

    这部分是定义的数据点,就是说如果要更换数据点,应该在这里改。
    第三部分:

    		var marker1 =new BMap.Marker(points[1],{icon:myIcon});  // 创建10个标注
            var marker2 =new BMap.Marker(points[2],{icon:myIcon});
            var marker3 =new BMap.Marker(points[3],{icon:myIcon});
            var marker4 =new BMap.Marker(points[4],{icon:myIcon});
            var marker5 =new BMap.Marker(points[5],{icon:myIcon});
            var marker6 =new BMap.Marker(points[6],{icon:myIcon});
            var marker7 =new BMap.Marker(points[7],{icon:myIcon});
            var marker8 =new BMap.Marker(points[8],{icon:myIcon});
            var marker9 =new BMap.Marker(points[9],{icon:myIcon});
            var marker0 =new BMap.Marker(points[0],{icon:myIcon});
    

    第三部分是在为点添加标记,也是根据点来的,有多少点就写多少行。
    第四部分:

            map.addOverlay(marker1);              // 将标注添加到地图中
            map.addOverlay(marker2);
            map.addOverlay(marker3);
            map.addOverlay(marker4);
            map.addOverlay(marker5);
            map.addOverlay(marker6);
            map.addOverlay(marker7);
            map.addOverlay(marker8);
            map.addOverlay(marker9);
            map.addOverlay(marker0);
    
    

    第四部分是把标记点添加到map图层上去,也是根据自己的数据来的。
    第五部分:

        loadJScript()
    </script>
    
    <script>
        layui.use('theme/settings/earth', layui.factory('theme/settings/earth'));
    </script>
    
    <!--<script type="text/javascript" src="js\jquery-2.1.1.min.js"></script>-->
    
    </html>
    

    这部分也不需要动。
    既然代码已经分解清楚了,用Python来把这些代码串起来就很简单了,看看怎么实现的吧:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # author:HP
    # datetime:2020/12/11 16:47
    import pandas as pd
    
    data = pd.read_csv('数据.txt', sep='\t')
    
    def get_html(YearData):
        var_point = []
        var_marker = []
        addOverlay = []
    
        for i in range(len(YearData)):
            point = 'new BMap.Point(' + str(YearData.loc[i, 'lon_baidumap']) + ',' + str(YearData.loc[i, 'lat_baidumap']) + ')'
            marker = 'var marker' + str(i) + '=new BMap.Marker(points[' + str(i) + '],{icon:myIcon});'
            overlay = 'map.addOverlay(marker' + str(i) + ');'
            var_point.append(point)
            var_marker.append(marker)
            addOverlay.append(overlay)
    
        points = ','.join(var_point)
        markers = '\n        '.join(var_marker)
        overlays = '\n        '.join(addOverlay)
    
        message1 = '''
        <!DOCTYPE html>
        <html xmlns:asp="">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
            <style type="text/css">
                body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
            </style>
            <script type="text/javascript" src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=9Rz4tOb6PgQtqBt6K3YbSMBESLk8iYpE"></script>
            <title>添加信息窗口</title>
        </head>
        <body>
        <div id="allmap"></div>
        </body>
        <script>
            // An highlighted block
            //百度地图API功能
    
            function loadJScript() {
                var script = document.createElement("script");
                script.type = "text/javascript";
                script.src = "https://api.map.baidu.com/api?v=2.0&ak=9Rz4tOb6PgQtqBt6K3YbSMBESLk8iYpE&callback=init";
                document.body.appendChild(script);
            }
            window.init = function() {
                var map = new BMap.Map("allmap");            // 创建Map实例
                //var point = new BMap.Point(109.18592,34.36912); // 创建点坐标
                map.centerAndZoom(new BMap.Point(120.2338341,31.58109976), 15);  // 设置中心点,地图初始化
                //map.centerAndZoom(points,20);
                map.setCurrentCity("无锡");          //设置当前城市
                map.clearOverlays();
                map.addControl(new BMap.MapTypeControl());
                map.enableScrollWheelZoom(true);                 //启用滚轮放大缩小
                map.addEventListener('click', function(e) {
                    alert('点击的经纬度:' + e.latlng.lng + ', ' + e.latlng.lat);
                    var mercator = map.lnglatToMercator(e.latlng.lng, e.latlng.lat);
                    alert('点的墨卡托坐标:' + mercator[0] + ', ' + mercator[1]);
                });
                //向地图中添加缩放控件
                var ctrlNav = new window.BMap.NavigationControl({
                    anchor: BMAP_ANCHOR_TOP_LEFT,
                    type: BMAP_NAVIGATION_CONTROL_LARGE
                });
                map.addControl(ctrlNav);
    
    
        		//向地图中添加标记点
                var myIcon =new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), {    //小车图片
                    offset: new BMap.Size(0, -5),    //相当于CSS精灵
                    imageOffset: new BMap.Size(0, 0)    //图片的偏移量。为了是图片底部中心对准坐标点。
                });
        '''
        message2 = points
        message3 = markers
        message4 = overlays
        message5 = '''
                //map.setViewport(points);         //调整地图的最佳视野为显示标注数组point
    
    
            }
            loadJScript()
        </script>
    
        <script>
            layui.use('theme/settings/earth', layui.factory('theme/settings/earth'));
        </script>
    
        <!--<script type="text/javascript" src="js\jquery-2.1.1.min.js"></script>-->
    
        </html>
        '''
    
        message = message1 + '\n' + '        var points = [' + message2 + '];' + '\n        ' + message3 + '\n        ' + message4 + '\n' + message5
        return message
    
    
    for i in range(2011, 2020):
        yeardata = data[data.nian == i].reset_index(drop=True)
        message = get_html(yeardata)
        filename = 'qroad' + str(i) + '.html'
        with open(filename, 'w', encoding="utf-8")as f:
            f.write(message)
            f.close()
    

    还是简单解释一下代码吧:
    前面是数据导入,数据就是我的百度地图坐标系下的经纬度坐标点。
    然后是写方法,主要就是循环把点生成字符串,然后五部分加起来。
    最后调用方法,生成html文件。
    这样下来,文件可以秒开,给大家看下。
    在这里插入图片描述
    这样就算完成了,当然除了添加标记点,也还可以添加其他内容。
    最后鼓励一下自己:
    保持进步,保持好心情~~

    展开全文
  • 需求:根据经纬度绘制标记点,点击标记点弹出弹框和底部按钮,点击顶部弹框进入二级界面,点击底部按钮弹出第三方地图软件选择页,实现跨进程跳转。 项目是公司项目,只放出重要部分代码。 绘制标记点: final ...

    需求:根据经纬度绘制标记点,点击标记点弹出弹框和底部按钮,点击顶部弹框进入二级界面,点击底部按钮弹出第三方地图软件选择页,实现跨进程跳转。

    效果图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    项目是公司项目,只放出重要部分代码。

    
    					final Marker marker1 = aMap.addMarker(new MarkerOptions()
                        .position(latLng2)
                        .title("地址标题111111")
                        .snippet("地址内容1111"));
                final Marker marker2 = aMap.addMarker(new MarkerOptions()
                        .position(latLng3)
                        .title("地址标题22222")
                        .snippet("地址内容2222"));
    

    绘制标记点

     //标记点击事件
                AMap.OnMarkerClickListener markerClickListener = new AMap.OnMarkerClickListener() {
                    @Override
                    public boolean onMarkerClick(Marker marker) {
                        position = marker.getPosition();
                        title = marker.getTitle();
                        marker.showInfoWindow();
                        nav.setVisibility(View.VISIBLE);
                        //导航按钮点击
                        nav.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                showAnimation();
                            }
                        });
                        return true;
                    }
                };
    

    点击标记后获取到当前标记的经纬度和名称,显示底部按钮,点击按钮弹出第三方地图选择页。

    //标记上部弹框点击
                AMap.OnInfoWindowClickListener listener = new AMap.OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick(Marker arg0) {
                            Toast.makeText(FangchanMapActivity.this, "点击了弹框1", Toast.LENGTH_SHORT).show();
                    }
                };
    

    点击标记顶部弹框进入二级界面,需要什么值就取什么值,后台还在出接口,我这边没有做操作

    //地图点击
                AMap.OnMapClickListener mapClickListener = new AMap.OnMapClickListener() {
                    @Override
                    public void onMapClick(LatLng latLng) {
                        marker1.hideInfoWindow();
                        marker2.hideInfoWindow();
                        nav.setVisibility(View.GONE);
                    }
                };
    

    这里只做了显示隐藏的操作

    			//设置图标
    			marker1.setIcon(BitmapDescriptorFactory.fromResource(R.mipmap.marker_icon));
    			//绑定点击事件
                aMap.setOnInfoWindowClickListener(listener);
                aMap.setOnMapClickListener(mapClickListener);
                aMap.setOnMarkerClickListener(markerClickListener);
    

    千万千万千万记得绑定点击事件在这里插入图片描述

    private void showAnimation() {
            LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View vPopupWindow = inflater.inflate(R.layout.layout_popupwindow, null, false);//引入弹窗布局
            popupWindow = new PopupWindow(vPopupWindow, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, true);
            TextView gaode = vPopupWindow.findViewById(R.id.gaode);
            TextView baidu = vPopupWindow.findViewById(R.id.baidu);
            TextView tengxun = vPopupWindow.findViewById(R.id.tengxun);
            TextView clean_text = vPopupWindow.findViewById(R.id.clean_text);
            gaode.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (MapUtil.isGdMapInstalled()) {
                        MapUtil.openGaoDeNavi(FangchanMapActivity.this, 0, 0, null, position.latitude, position.longitude, title);
                    } else {
                        //这里必须要写逻辑,不然如果手机没安装该应用,程序会闪退,这里可以实现下载安装该地图应用
                        Toast.makeText(FangchanMapActivity.this, "尚未安装高德地图", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            baidu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (MapUtil.isBaiduMapInstalled()){
                        MapUtil.openBaiDuNavi(FangchanMapActivity.this, 0, 0, null, position.latitude, position.longitude, title);
                    } else {
                        Toast.makeText(FangchanMapActivity.this, "尚未安装百度地图", Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
            tengxun.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (MapUtil.isTencentMapInstalled()){
                        MapUtil.openTencentMap(FangchanMapActivity.this, 0, 0, null, position.latitude, position.longitude, title);
                    } else {
                        Toast.makeText(FangchanMapActivity.this, "尚未安装腾讯地图", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            clean_text.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    popupWindow.dismiss();
                }
            });
            //设置背景透明
            addBackground();
            //设置进出动画
            popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);
            //引入依附的布局
            View parentView = LayoutInflater.from(FangchanMapActivity.this).inflate(R.layout.layout_popupwindow, null);
            //相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
            popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
        }
        private void addBackground() {
            // 设置背景颜色变暗
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.alpha = 0.7f;//调节透明度
            getWindow().setAttributes(lp);
            //dismiss时恢复原样
            popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
    
                @Override
                public void onDismiss() {
                    WindowManager.LayoutParams lp = getWindow().getAttributes();
                    lp.alpha = 1f;
                    getWindow().setAttributes(lp);
                }
            });
        }
    

    底部弹框,popupwindow实现

    
    public class MapUtil {
    
        public static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地图包名
        public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地图包名
        public static final String PN_TENCENT_MAP = "com.tencent.map"; // 腾讯地图包名
    
        /**
         * 检查地图应用是否安装
         * @return
         */
        public static boolean isGdMapInstalled(){
            return isInstallPackage(PN_GAODE_MAP);
        }
    
        public static boolean isBaiduMapInstalled(){
            return isInstallPackage(PN_BAIDU_MAP);
        }
    
        public static boolean isTencentMapInstalled(){
            return isInstallPackage(PN_TENCENT_MAP);
        }
    
        private static boolean isInstallPackage(String packageName) {
            return new File("/data/data/" + packageName).exists();
        }
    
        /**
         * 百度转高德
         * @param bd_lat
         * @param bd_lon
         * @return
         */
        public static double[] bdToGaoDe(double bd_lat, double bd_lon) {
            double[] gd_lat_lon = new double[2];
            double PI = 3.14159265358979324 * 3000.0 / 180.0;
            double x = bd_lon - 0.0065, y = bd_lat - 0.006;
            double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI);
            double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI);
            gd_lat_lon[0] = z * Math.cos(theta);
            gd_lat_lon[1] = z * Math.sin(theta);
            return gd_lat_lon;
        }
    
        /**
         * 高德、腾讯转百度
         * @param gd_lon
         * @param gd_lat
         * @return
         */
        private static double[] gaoDeToBaidu(double gd_lon, double gd_lat) {
            double[] bd_lat_lon = new double[2];
            double PI = 3.14159265358979324 * 3000.0 / 180.0;
            double x = gd_lon, y = gd_lat;
            double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI);
            double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI);
            bd_lat_lon[0] = z * Math.cos(theta) + 0.0065;
            bd_lat_lon[1] = z * Math.sin(theta) + 0.006;
            return bd_lat_lon;
        }
    
    
    
        /**
         * 打开高德地图导航功能
         * @param context
         * @param slat 起点纬度
         * @param slon 起点经度
         * @param sname 起点名称 可不填(0,0,null)
         * @param dlat 终点纬度
         * @param dlon 终点经度
         * @param dname 终点名称 必填
         */
        public static void openGaoDeNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
            String uriString = null;
            StringBuilder builder = new StringBuilder("amapuri://route/plan?sourceApplication=maxuslife");
            if (slat != 0) {
                builder.append("&sname=").append(sname)
                        .append("&slat=").append(slat)
                        .append("&slon=").append(slon);
            }
            builder.append("&dlat=").append(dlat)
                    .append("&dlon=").append(dlon)
                    .append("&dname=").append(dname)
                    .append("&dev=0")
                    .append("&t=0");
            uriString = builder.toString();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setPackage(PN_GAODE_MAP);
            intent.setData(Uri.parse(uriString));
            context.startActivity(intent);
        }
    
        /**
         * 打开腾讯地图
         * params 参考http://lbs.qq.com/uri_v1/guide-route.html
         *
         * @param context
         * @param slat 起点纬度
         * @param slon 起点经度
         * @param sname 起点名称 可不填(0,0,null)
         * @param dlat 终点纬度
         * @param dlon 终点经度
         * @param dname 终点名称 必填
         * 驾车:type=drive,policy有以下取值
        0:较快捷
        1:无高速
        2:距离
        policy的取值缺省为0
         * &from=" + dqAddress + "&fromcoord=" + dqLatitude + "," + dqLongitude + "
         */
        public static void openTencentMap(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {
            String uriString = null;
            StringBuilder builder = new StringBuilder("qqmap://map/routeplan?type=drive&policy=0&referer=zhongshuo");
            if (slat != 0) {
                builder.append("&from=").append(sname)
                        .append("&fromcoord=").append(slat)
                        .append(",")
                        .append(slon);
            }
            builder.append("&to=").append(dname)
                    .append("&tocoord=").append(dlat)
                    .append(",")
                    .append(dlon);
            uriString = builder.toString();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setPackage(PN_TENCENT_MAP);
            intent.setData(Uri.parse(uriString));
            context.startActivity(intent);
        }
    
        /**
         * 打开百度地图导航功能(默认坐标点是高德地图,需要转换)
         * @param context
         * @param slat 起点纬度
         * @param slon 起点经度
         * @param sname 起点名称 可不填(0,0,null)
         * @param dlat 终点纬度
         * @param dlon 终点经度
         * @param dname 终点名称 必填
         */
        public static void openBaiDuNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
            String uriString = null;
            //终点坐标转换
    //        此方法需要百度地图的BaiduLBS_Android.jar包
    //        LatLng destination = new LatLng(dlat,dlon);
    //        LatLng destinationLatLng = GCJ02ToBD09(destination);
    //        dlat = destinationLatLng.latitude;
    //        dlon = destinationLatLng.longitude;
    
            double destination[] = gaoDeToBaidu(dlat, dlon);
            dlat = destination[0];
            dlon = destination[1];
    
            StringBuilder builder = new StringBuilder("baidumap://map/direction?mode=driving&");
            if (slat != 0){
                //起点坐标转换
    
    //            LatLng origin = new LatLng(slat,slon);
    //            LatLng originLatLng = GCJ02ToBD09(origin);
    //            slat = originLatLng.latitude;
    //            slon = originLatLng.longitude;
    
                double[] origin = gaoDeToBaidu(slat, slon);
                slat = origin[0];
                slon = origin[1];
    
                builder.append("origin=latlng:")
                        .append(slat)
                        .append(",")
                        .append(slon)
                        .append("|name:")
                        .append(sname);
            }
            builder.append("&destination=latlng:")
                    .append(dlat)
                    .append(",")
                    .append(dlon)
                    .append("|name:")
                    .append(dname);
            uriString = builder.toString();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setPackage(PN_BAIDU_MAP);
            intent.setData(Uri.parse(uriString));
            context.startActivity(intent);
        }
    }
    

    跳转第三方地图软件的工具类,参考这位老哥写的MapUtil

    结束!芜湖~

    展开全文
  • 百度地图颜色标记

    2013-11-25 14:13:52
    可以实现在不同省市用不同颜色标注出来,类似快递网点标注
  • 通过Google地球软件获取的坐标数据在Google地图标记,也与真实位置相差甚远;因为Google地球反馈的坐标信息也是通过卫星GPS获取的。 3. 通过Google地图(网页版,右键“这是什么”即可查看)获取的坐标数据在Google...

    先看以下几个现象:
    1. 通过GPS模块获取的坐标数据在Google地图标记,发现与真实位置相差甚远
    2. 通过Google地球软件获取的坐标数据在Google地图标记,也与真实位置相差甚远;因为Google地球反馈的坐标信息也是通过卫星GPS获取的。
    3. 通过Google地图(网页版,右键“这是什么”即可查看)获取的坐标数据在Google地图标记,可以精确的标记到Google地图上。

    然后了解几个术语:
    1. 火星坐标系:天朝有关部门规定,为了保证国家安全,所有的地图公司提供的地图必须对实际的GPS坐标进行一定的偏移,偏移后的GPS坐标系俗称火星坐标系,而这个偏移是不固定的,具体的算法是国家机密。
    2. WGS84:国际通行的坐标体系标准,而GPS模块获取到的坐标正是WGS84坐标系
    3. 北京54坐标系/西安80坐标系:天朝通用的经过偏移后的坐标系标准(而民航使用的是国际标准WGS84,否则国际航班没法正常飞行)

    网上牛人给的解决方法:
    1. 网页在线版:http://map.yanue.net/gps.html,其中第一个GPS原始数据转换结果还比较准确
    2. C语言实现版:http://xcodev.com/131.html (需要加载一个78M的数据文件,普通手持设备可能比较吃力)
    3. C#版:基于C语言而来,http://freshflower.iteye.com/blog/1606960
    4. 通过百度API转换:http://blog.csdn.net/gengye304/article/details/7942219

    后来又找到一个比较简单的换算方法:比如給出一個DMS座標例如W87°43'41 ",它是瑣細的轉換它成一定數量的小數程度運用以下方法:

    • 計算秒鐘, 43 ' 41的總數" = (43*60 + 41) = 2621秒。
    • 分數部分是3600除的秒鐘的總數。 2621/3600 = 0.728056
    • 增加分數程度到整體程度導致決賽成績: 87 + 0.728056 = 87.728056
    • 因為它是西部經度座標,結果应该以负数表示:-87.728056

    轉換從小數程度嚮DMS

    給出一個小數縱向座標例如-87.728055它瑣細的轉換它成DMS形式。 知道將是必要的它是否是一個緯度或縱向座標為了充分地轉換它。 方法是如下:

    • 減去座標的整數部分,離開分數part。 整數是程度的數量。 87.728055 = 87度。
    • 乘剩餘的分數部分以60。 這在整數部分將導致一定數量的分鐘。 0.728055 x 60 = 43.6833 = 43分鐘。
    • 乘分鐘的數量的分數部分以60,導致一定數量的秒鐘。 0.6833 x 60 = 40.998 = 41秒。 算作是此40秒,削小數,圓它到41是可能的,或者保留整個數字。

    <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
    展开全文
  • 百度地图多点标记

    2019-10-18 14:56:53
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>百度地图中绘制多个点</title> <style type="text/css"> *{pad...
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>百度地图中绘制多个点</title>
            <style type="text/css">
                *{padding: 0;margin: 0;font-family: "微软雅黑"}
                h3{width: 100%;height: 45px;line-height: 45px;background: #eee;color: #000;font-weight: 500;text-align: center;}
                .content{width: 98%;margin: 5px auto;min-height: 400px;border:2px solid #000;}
                .Map{min-height: 400px;width: 100%}
            </style>
        </head>
        <body>
            <h3>百度地图中绘制多个点</h3>
            <div class="content">
                <div class="Map" id="baiduMap" >
                    
                </div>
                <script type="text/javascript">
                    var markerArr = [//地址数据116.306487,
                        { title: "苏州有限公司",point: {'lng':113.264531,'lat':23.157003},address: "工业园区",tel:"10086",contact: "陈先生"},
                        { title: "南京有限公司",point: {'lng':113.330934,'lat':23.113401},address: "相城区",tel:"12306",contact: "陈先生"},
                        { title: "上海有限公司",point:{'lng':113.310854,'lat':23.113605} ,address: "外滩",tel:"0521846555",contact: "陈先生"}
                    ]
                    var Map = {//定义对象
                        init: function(){
                            var map = new BMap.Map('baiduMap');//创建实例
                            var point = new BMap.Point(113.312213,23.147267);//设立一个中心点坐标
                            map.centerAndZoom(point,13);//初始化并且设立级别,百度只提供17个级别3-18,此处50km
                            map.enableScrollWheelZoom(true);//激活滚轮操作
     
                            //添加控件
                            var ctrlNav = new window.BMap.NavigationControl({
                                anchor: BMAP_ANCHOR_TOP_LEFT,
                                type: BMAP_NAVIGATION_CONTROL_LARGE
                            });
                            map.addControl(ctrlNav);//缩放
     
                            var ctrlOva = new window.BMap.OverviewMapControl({
                                anchor: BMAP_ANCHOR_BOTTOM_RIGHT,
                                isOpen: 1
                            });
                            map.addControl(ctrlOva);//缩略图
     
                            var ctrlSca = new window.BMap.ScaleControl({
                                anchor: BMAP_ANCHOR_BOTTOM_LEFT
                            });
                            map.addControl(ctrlSca);//比例尺
     
                            var point = new Array();//定义数组标注经纬信息
     
                            var marker = new Array();//定义数组点对象信息
     
                            var info = new Array();//定义悬浮提示信息
     
                            for(var i = 0; i < markerArr.length; i++){//遍历
    
     
                                point[i] = new window.BMap.Point(markerArr[i].point.lng,markerArr[i].point.lat);
     
                                marker[i] = new window.BMap.Marker(point[i]);
     
                                map.addOverlay(marker[i]);
                                marker[i].setAnimation(BMAP_ANIMATION_BOUNCE);
     
                                var label = new window.BMap.Label(markerArr[i].title,{offset: new window.BMap.Size(20,-10)});
                                marker[i].setLabel(label);
     
                                info[i] = new window.BMap.InfoWindow("<p style='font-size:12px;line-height:20px;'" + markerArr[i].title + "</br>地址:" + markerArr[i].address + "</br> 电话:" + markerArr[i].tel + "</br> 联系人:" + markerArr[i].contact+"</p>");//悬浮提示信息
                            }
                            marker[0].addEventListener("mouseover",function(){
                                this.openInfoWindow(info[0]);//悬浮监听提示方法
                            });
                            marker[1].addEventListener("mouseover",function(){
                                this.openInfoWindow(info[1]);//悬浮监听提示方法
                            });
                            marker[2].addEventListener("mouseover",function(){
                                this.openInfoWindow(info[2]);//悬浮监听提示方法
                            });                        
                        },
                        load_map: function(){//异步回调
                            var load = document.createElement("script");
                            load.src = "http://api.map.baidu.com/api?v=1.4&callback=Map.init";
                            document.body.appendChild(load);
                        }
     
                    };
                    Map.load_map();//实例化调用函数
                </script>
            </div>
        </body>
    </html>
    
    
    展开全文
  • 由于现在的项目有个部分需要给出经纬度然后在地图显示对应的坐标,并打上标记,现在项目比较赶,没有太多时间去研究这个,所以先记录下 //这里的key需要换成自己的  function init(){  var map...
  • 这个DEMO是用来将多个地点标记地图上,然后点击节点弹出PopupWindow 下面是一些截图: main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  • 多点轨迹连线后,点击左侧中间某个坐标,比如说点击软件路,右侧地图上软件路坐标凸显,求大神指导怎么写,感谢 ![图片说明](https://img-ask.csdn.net/upload/201812/11/1544493093_738765.png)
  • 支持添加地图标记,距离测量和面积测量,地点名称显示。 8.支持鹰眼显示缩略地图,截屏功能。 9.支持添加自定义标识图标,用户可以更换图标。 10.分类图层管理,可以隐藏/显示图层。 11.支持批量导入导出标注数据。 ...
  • 用C#写了一个工程,已经实现了点击地图上的结点按钮后,计算出结点间最短路径。现在要加一个功能,希望能在地图上,这里的地图就是一张图片,能显示计算出的最短路径,类似那些地图软件标记的路径。怎样实现??
  • 地理信息地图标记KML与KMZ的区别

    万次阅读 2017-09-14 13:49:43
    地理信息地图标记KML与KMZ的区别KML (keyhole markup language)是以XML语言为基础开发的一种文件格式,用来描述和存储地理信息数据(点、线、面、图片等),是纯粹的xml文本格式,可用记事本打开编辑,所以kml文件很...
  • 电子地图标注软件

    2013-03-12 17:28:47
    在添加地图标记,距离测量显示,地点名称显示。  6.地图所选择的管道,部件等能点击查看详细信息。  7.谷歌在线(离线)混合地图,在软件界面可以选择切换;  8.名称查询定位,可以输入地点名称后定位到所...
  • 前言 在地图相关应用的开发中,我们常常遇到一个问题,当地图标注点过多的时候,会造成用户体验差、应用卡顿的情况。所以,我们需要一套高效的算法来解决标注的...1、地图上标注显示逻辑 为了保证规律性和平均
  •  标记" />  ; height: 682px; background-image: url(/Images/aa.jpg);">  ; height: 100px; border: 1px solid red; display: none" id="formDiv">      名称:...
  • jvectormap的自定义地图和区域上色、图片标记 因为网上例子太少,上手实属不易,所以在这里跟大家分享一下我的使用! (第一次写,因为粘贴代码卡死几次,重写了几次,心累 ╥﹏╥…) 这里就简单的介绍了啊 jquery...
  • 15.[开源][安卓][地图标记]android-mapviewballoons-master

    千次下载 热门讨论 2015-03-01 10:42:54
    15.[开源][安卓][地图标记]android-mapviewballoons-master
  • 8.支持添加地图标记,距离测量显示,地点名称显示。 9.支持保存您当前操作的文件,供日后打开再用,保证操作不会丢失。 10.支持全球地图操作预览。 11.支持添加自定义标识图标,用户可以更换图标。  电子地图...
  • iPhone最好的导航地图软件盖亚Gaia GPS 支持iPhone和iPad!盖亚全球定位系统把您的iPhone手机变成全功能的全球定位系统手持设备。盖亚全球定位系统支持远足,骑自行车,滑雪板,滑雪,驾驶,跑步,航海等户外活动...
  • 最近闲的没事干,发现滴滴出行的app,地图上的小汽车可以跑,很炫是不是,我们公司也是车辆监控的app的,我就一直揣摩着怎么也让我们的小汽车在地图上跑来跑去啊,这样给人感觉好点,废话不说了,先看下滴滴出行的...
  • [这个是我的运行界面,我想在这个地图上添加我存在oracle数据库中的经纬度点,请问应该怎么实现,我可以把oracle中的数据导出成txt文档,只包含经纬度lat,lon的两列。]...
  • 5.支持添加地图标记,距离测量显示,地点名称显示。 6.支持在地图所选择的标注能点击查看详细信息。 7.支持添加自定义标识图标,用户可以更换图标。 8.支持保存您当前操作的文件,供日后打开再用,保证操作不会...
  • 电脑离线地图软件用户可以标注位置,可以...支持添加地图标记,距离测量显示,地点名称显示。  9.支持保存您当前操作的文件,供日后打开再用,保证操作不会丢失。  10.支持添加自定义标识图标,用户可以更换图标。
  • 自己的谷歌地图桌面版 里面的文本文件记述了安装和卸载方法。 新增了Mark功能和经纬度标记功能。 --------------------注: 本程序将不再更新,需要源码者右键界面,选择浏览代码即可。 终结版大回馈,0分资源...
  • //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理 mMapView.onSaveInstanceState(outState); } @Override public void onClick(View v) { } @Override ...
  • 老板突发奇想要让用android加载h5做地图,还有根据请求的不同经纬度在地图上显示出不同的marker标记(。。。。这个破需求感觉没啥大用处,可能也就不懂软件的人看着高大上吧)本人小白,不会h5,也不会js。根据自己...
  • 目前室内停车场地图使用的是简单的图片显示方法,即人工将室内地图绘制成图片后,使用app客户端加载图片显示地图。而现有技术的问题与不足导致难以动态的更新和显示地图中各类元素。上海懒图信息科技有限公司经过...
  • 电子地图标注软件可以标注位置,可以搜索地图上本来有的位置和标注的位置,可以把某个标注的位置显示在地图中心。软件有很多功能,请用户们来体验吧! 软件介绍: 电子地图标注软件用户可以标注位置,搜索地图上本来...
  • 目前市场,能够实现地图可视化的工具有很多,可以分为编程类、平台类和软件类三种: 编程图表类:Matlab、Python、Echarts 地理平台类:Google Fusion、高德Maplab 操作软件类:Excel、Smartbi等BI工具 什么是地图...
  • 使用NetMap制作离线地图标注软件

    千次阅读 2014-05-23 09:55:12
    NetMap开发地图标注软件的尝试

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,674
精华内容 5,869
关键字:

地图上做标记的软件