javascript: bingmap

 

https://learn.microsoft.com/en-us/bingmaps/getting-started/
https://learn.microsoft.com/zh-cn/azure/azure-maps/migrate-from-bing-maps-web-app

 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bing Map营销人员示例</title>
	<meta name="Keywords" content="塗聚文,捷為工作室,万年历,万年历查询,黄历,黄历查询,涂聚文,Geovin Du,geovindu" />
    <meta name="Description" content="塗聚文,捷為工作室,信息流,物流,人力资源流,资本流的系统解决方案的开发与设计. " />
    <meta name="author" content="geovindu,塗聚文,Geovin Du" />
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
    <link rel="icon" href="favicon.ico" type="image/ico" />
    <link rel="bookmark" href="favicon.ico" />
    <script src="https://www.bing.com/api/maps/mapcontrol?callback=loadMapScenario&mkt=zh-cn" async defer></script>
     <link href="../lib/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
    <script src="../lib/chart.js/4.4.8/chart.umd.js"></script>
     <link href="../Bootstrap/5.3.6/css/bootstrap.min.css" rel="stylesheet">
        
</head>
<body>
    <div class="loading-overlay" id="loadingOverlay">
        <div class="spinner-border text-primary" role="status">
            <span class="visually-hidden">加载中...</span>
        </div>
    </div>

    <div class="container">
        <h1>Bing Map营销人员示例</h1>
        
        <div class="stats">
            <div class="stat-card">
                <h3><i class="fa fa-map-marker text-primary"></i> 总位置数</h3>
                <p class="stat-value" id="totalLocations">0</p>
            </div>
            <div class="stat-card">
                <h3><i class="fa fa-users text-success"></i> 覆盖人群</h3>
                <p class="stat-value">1,250,000+</p>
            </div>
            <div class="stat-card">
                <h3><i class="fa fa-line-chart text-warning"></i> 转化率</h3>
                <p class="stat-value">8.2%</p>
            </div>
            <div class="stat-card">
                <h3><i class="fa fa-calendar text-info"></i> 更新日期</h3>
                <p class="stat-value">2025-06-01</p>
            </div>
        </div>
        
        <div id="mapView"></div>
        
        <div class="chart-container">
            <h3>区域表现分析</h3>
            <canvas id="performanceChart" height="100"></canvas>
        </div>
        
        <div class="location-list" id="locationList">
            <h3>重点关注位置</h3>
            <div class="text-center text-muted py-5" id="emptyListPlaceholder">
                <i class="fa fa-spinner fa-spin fa-3x"></i>
                <p>加载位置数据中...</p>
            </div>
        </div>
    </div>

    <script src="js/bingmap.js" type="text/javascript"></script>
        <script src="../Bootstrap/5.3.6/js/bootstrap.bundle.min.js"></script>
</body>
</html>    

  

// JavaScript Document  geovindu,Geovin Du, bingmap.js
        // 存储位置数据的全局变量
        let locationsData = [];
        let map = null;
        
        // 将人流量文本转换为数值以便图表显示
        function convertTrafficToValue(traffic) {
            const trafficValues = {
                '极低': 1,
                '低': 2,
                '中': 3,
                '高': 4,
                '极高': 5
            };
            return trafficValues[traffic] || 3; // 默认返回"中"的值
        }
        
        // 从JSON文件加载位置数据
        async function loadLocationsData() {
            try {
                const response = await fetch('city.json');
                if (!response.ok) {
                    throw new Error(`加载数据失败: ${response.status}`);
                }
                locationsData = await response.json();
                
                // 验证数据格式
                if (!Array.isArray(locationsData) || locationsData.length === 0) {
                    throw new Error('位置数据格式不正确或为空');
                }
                
                document.getElementById('totalLocations').textContent = locationsData.length;
                return locationsData;
            } catch (error) {
                console.error('加载位置数据时出错:', error);
                alert('加载位置数据失败,将使用示例数据。');
                
                // 使用示例数据作为备选
                locationsData = [
                    { lat: 39.9042, lng: 116.4074, name: "北京总部", category: "office", traffic: "高", conversionRate: "9.5" },
                    { lat: 31.2304, lng: 121.4737, name: "上海分部", category: "office", traffic: "极高", conversionRate: "7.8" },
                    { lat: 22.5431, lng: 114.0579, name: "深圳门店", category: "store", traffic: "中", conversionRate: "10.2" },
                    { lat: 23.1291, lng: 113.2644, name: "广州门店", category: "store", traffic: "高", conversionRate: "8.7" },
                    { lat: 30.5728, lng: 104.0668, name: "成都门店", category: "store", traffic: "中", conversionRate: "9.3" }
                ];
                document.getElementById('totalLocations').textContent = locationsData.length;
                return locationsData;
            }
        }
        
        // 初始化地图
        async function loadMapScenario() {
            try {
                // 显示加载状态
                document.getElementById('loadingOverlay').style.display = 'flex';
                
                // 确保Bing Maps API已加载
                if (!window.Microsoft || !Microsoft.Maps) {
                    throw new Error('Bing Maps API未加载');
                }
                
                // 加载位置数据
                await loadLocationsData();
                
                // 创建地图实例
                map = new Microsoft.Maps.Map(document.getElementById('mapView'), {
                    credentials: 'Aix7pe29g3T4z7VMUlzKp1EotfMka-4wtrBM-Dq_eLrC2XWG7kPzufGtnsXSgXdN',
                    center: new Microsoft.Maps.Location(35.8617, 104.1954),
                    zoom: 4,
					culture: 'zh-CN', // 设置为中文
                    region: 'CN'      // 设置为中国区域
                });
                
                // 等待地图完全加载
                await new Promise((resolve, reject) => {
                    if (map.getRootElement()) {
                        resolve(map);
                    } else {
                        Microsoft.Maps.Events.addHandler(map, 'load', () => resolve(map));
                        setTimeout(() => reject(new Error('地图加载超时')), 10000);
                    }
                });
                
                // 添加位置点
                addSampleLocations();
                
                // 生成位置列表
                generateLocationList();
                
                // 初始化图表
                initializeChart();
                
                // 隐藏加载状态
                document.getElementById('loadingOverlay').style.display = 'none';
                
            } catch (error) {
                console.error('初始化地图时出错:', error);
                alert('初始化地图时出错: ' + error.message);
                document.getElementById('loadingOverlay').style.display = 'none';
            }
        }
        
        // 添加示例位置点
        function addSampleLocations() {
            if (!map) {
                console.error('地图未初始化');
                return;
            }
            
            locationsData.forEach(location => {
                try {
                    const pin = new Microsoft.Maps.Pushpin(
						/*
                        new Microsoft.Maps.Location(location.lat, location.lng),
                        {
                            title: location.name,
                            subTitle: location.category === "office" ? "办公地点" : "零售门店",
                            color: location.category === "office" ? "#0078d4" : "#28a745"
                        }*/
						new Microsoft.Maps.Location(location.lat, location.lng),
						{
							title: location.name,
                            subTitle: location.category === "office" ? "办公地点" : "零售门店",
							icon: location.category === "office" ? '3.png':'21.png',
							anchor: new Microsoft.Maps.Point(12, 39),
							text: location.category === "office" ? "公" : "店",
							textOffset: new Microsoft.Maps.Point(0, 5)
						}
                    );
                    
                    // 添加点击事件
                    Microsoft.Maps.Events.addHandler(pin, 'click', function() {
                        showInfoWindow(location.lat, location.lng, location);
                    });
                    
                    // 将图钉添加到地图
                    map.entities.push(pin);
                } catch (error) {
                    console.error(`添加位置 ${location.name} 时出错:`, error);
                }
            });
        }
        
        // 生成位置列表
        function generateLocationList() {
            const locationList = document.getElementById('locationList');
            // 清空占位符
            document.getElementById('emptyListPlaceholder').remove();
            
            locationsData.forEach(location => {
                const item = document.createElement('div');
                item.className = 'location-item';
                item.setAttribute('data-lat', location.lat);
                item.setAttribute('data-lng', location.lng);
                item.setAttribute('data-name', location.name);
                
                // 设置交通流量的徽章颜色
                let trafficBadgeClass = 'bg-primary';
                if (location.traffic === '极高') trafficBadgeClass = 'bg-danger';
                else if (location.traffic === '高') trafficBadgeClass = 'bg-warning';
                else if (location.traffic === '中') trafficBadgeClass = 'bg-primary';
                else if (location.traffic === '低') trafficBadgeClass = 'bg-success';
                
                // 设置转化率的徽章颜色
                let conversionBadgeClass = 'bg-success';
                const conversionRate = parseFloat(location.conversionRate);
                if (conversionRate < 8) conversionBadgeClass = 'bg-warning';
                if (conversionRate < 6) conversionBadgeClass = 'bg-danger';
                
                // 设置图标
                const iconClass = location.category === 'office' ? 'fa-building' : 'fa-shopping-bag';
                
                item.innerHTML = `
                    <h4><i class="fa ${iconClass}"></i> ${location.name}</h4>
                    <p>${location.address || '未提供地址'}</p>
                    <div class="location-stats">
                        <span class="badge ${trafficBadgeClass}">人流量: ${location.traffic}</span>
                        <span class="badge ${conversionBadgeClass}">转化率: ${location.conversionRate}%</span>
                    </div>
                `;
                
                // 添加点击事件
                item.addEventListener('click', function() {
                    const lat = parseFloat(this.getAttribute('data-lat'));
                    const lng = parseFloat(this.getAttribute('data-lng'));
                    const name = this.getAttribute('data-name');
                    
                    // 找到完整的位置对象
                    const location = locationsData.find(loc => loc.name === name);
                    
                    // 地图定位到该位置
                    if (map) {
                        map.setView({
                            center: new Microsoft.Maps.Location(lat, lng),
                            zoom: 12
                        });
                        
                        // 显示信息窗口
                        showInfoWindow(lat, lng, location);
                    }
                });
                
                locationList.appendChild(item);
            });
        }
        
        // 显示信息窗口
        function showInfoWindow(lat, lng, location) {
            try {
                if (!map) {
                    console.error('地图未初始化');
                    return;
                }
                
                // 先移除已存在的信息窗口
                for (let i = map.entities.getLength() - 1; i >= 0; i--) {
                    const entity = map.entities.get(i);
                    if (entity instanceof Microsoft.Maps.Infobox) {
                        map.entities.removeAt(i);
                    }
                }
                
                // 设置交通流量的徽章颜色
                let trafficBadgeClass = 'bg-primary';
                if (location.traffic === '极高') trafficBadgeClass = 'bg-danger';
                else if (location.traffic === '高') trafficBadgeClass = 'bg-warning';
                else if (location.traffic === '中') trafficBadgeClass = 'bg-primary';
                else if (location.traffic === '低') trafficBadgeClass = 'bg-success';
                
                // 创建信息窗口
                const infobox = new Microsoft.Maps.Infobox(
                    new Microsoft.Maps.Location(lat, lng),
                    {
                        title: location.name,
                        description: `
                            <div class="custom-infobox-content">
                                <div class="mb-3">
                                    <span class="badge ${trafficBadgeClass}">人流量: ${location.traffic}</span>
                                </div>
                                <p><strong>转化率:</strong> ${location.conversionRate}%</p>
                                <p><strong>周边人口:</strong> ${location.population || '未提供数据'}</p>
                                <p><strong>详细地址:</strong> ${location.address || '未提供地址'}</p>
                                <p><strong>营业时间:</strong> ${location.hours || '未提供营业时间'}</p>
                                <p><strong>联系电话:</strong> ${location.phone || '未提供电话'}</p>
                            </div>
                            <div class="custom-infobox-footer">
                                <button class="btn btn-primary btn-sm">查看详细报告</button>
                            </div>
                        `,
                        showCloseButton: true,
                        maxWidth: 400,
                        offset: new Microsoft.Maps.Point(0, 20)
                    }
                );
                
                // 将信息窗口添加到地图
                map.entities.push(infobox);
            } catch (error) {
                console.error('显示信息窗口时出错:', error);
            }
        }
        
        // 初始化图表
        function initializeChart() {
            try {
                const ctx = document.getElementById('performanceChart').getContext('2d');
                
                // 从数据中提取城市名称、人流量和转化率
                const cities = locationsData.map(loc => loc.name);
                const trafficValues = locationsData.map(loc => convertTrafficToValue(loc.traffic));
                const conversionRates = locationsData.map(loc => parseFloat(loc.conversionRate));
                
                // 创建图表
                new Chart(ctx, {
                    type: 'bar',
                    data: {
                        labels: cities,
                        datasets: [
                            {
                                label: '人流量 (相对值)',
                                data: trafficValues,
                                backgroundColor: 'rgba(54, 162, 235, 0.5)',
                                borderColor: 'rgba(54, 162, 235, 1)',
                                borderWidth: 1,
                                order: 2
                            },
                            {
                                label: '转化率 (%)',
                                data: conversionRates,
                                backgroundColor: 'rgba(75, 192, 192, 0.5)',
                                borderColor: 'rgba(75, 192, 192, 1)',
                                borderWidth: 1,
                                type: 'line',
                                yAxisID: 'y1',
                                order: 1
                            }
                        ]
                    },
                    options: {
                        responsive: true,
                        scales: {
                            y: {
                                beginAtZero: true,
                                max: 5,
                                ticks: {
                                    callback: function(value) {
                                        const trafficLabels = ['极低', '低', '中', '高', '极高'];
                                        return trafficLabels[value - 1] || value;
                                    }
                                },
                                title: {
                                    display: true,
                                    text: '人流量'
                                }
                            },
                            y1: {
                                beginAtZero: true,
                                position: 'right',
                                max: 15,
                                title: {
                                    display: true,
                                    text: '转化率 (%)'
                                },
                                grid: {
                                    drawOnChartArea: false
                                }
                            }
                        }
                    }
                });
            } catch (error) {
                console.error('初始化图表时出错:', error);
                document.getElementById('performanceChart').parentElement.innerHTML = `
                    <div class="text-center text-danger py-3">
                        <i class="fa fa-exclamation-triangle"></i> 图表加载失败: ${error.message}
                    </div>
                `;
            }
        }

  

@charset "utf-8";
/* CSS Document  geovindu, Geovin Du bingmap.css*/
 body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }
        #mapView {
            height: 400px;
            width: 100%;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
        }
        .stats {
            display: flex;
            flex-wrap: wrap;
            gap: 20px;
            margin-bottom: 20px;
        }
        .stat-card {
            background: #f9f9f9;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
            flex: 1 1 200px;
        }
        .chart-container {
            margin-top: 20px;
            background: #f9f9f9;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        .location-list {
            margin-top: 20px;
        }
        .location-item {
            background: #f9f9f9;
            padding: 15px;
            margin-bottom: 10px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
            cursor: pointer;
            transition: background 0.3s;
        }
        .location-item:hover {
            background: #e9e9e9;
        }
        .custom-infobox {
            max-width: 90%;
            width: 350px;
            background-color: white;
            border-radius: 8px;
            box-shadow: 0 4px 8px rgba(0,0,0,0.15);
            overflow: hidden;
        }
        .custom-infobox-header {
            background-color: #0078d4;
            color: white;
            padding: 10px 15px;
            font-weight: bold;
        }
        .custom-infobox-content {
            padding: 15px;
        }
        .custom-infobox-footer {
            padding: 10px 15px;
            border-top: 1px solid #eee;
            text-align: right;
        }
        .loading-overlay {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(255, 255, 255, 0.8);
            display: flex;
            justify-content: center;
            align-items: center;
            z-index: 1000;
        }
   

  

 

 

 

 

posted @ 2025-06-02 20:02  ®Geovin Du Dream Park™  阅读(15)  评论(0)    收藏  举报