javascript - Azure map 产生巨额账单,详细信息显示由于 "Azure Maps - Location Insights"

标签 javascript azure azure-maps azure-billing

下面是我的 Azure map 示例。我正在其中使用:

  1. Azure map html 标记层 - 用于在 map 上显示标记
  2. Azure map 蜘蛛集群 - 用于在 map 上显示集群
  3. Atlas 绘制 css 和 js。
  4. Atlas CSS 和 JS。
<html lang="en">
<head>
    <!-- Add references to the Azure Maps Map control JavaScript and CSS files. -->
    <link href="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.css" rel="stylesheet" />
    <link rel="stylesheet" href="https://atlas.microsoft.com/sdk/javascript/drawing/1/atlas-drawing.min.css" type="text/css" />

    <script src="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.js"></script>
    <script src="https://atlas.microsoft.com/sdk/javascript/drawing/1/atlas-drawing.min.js"></script>
    <script src="https://raw.githubusercontent.com/Azure-Samples/azure-maps-html-marker-layer/main/dist/azure-maps-html-marker-layer.min.js"></script>
    <script src="https://raw.githubusercontent.com/Azure-Samples/azure-maps-spider-clusters/main/dist/azure-maps-spider-clusters.min.js"></script>
    <style>
        .customInfobox { max-width: 240px; padding: 10px; font-size: 12px; margin-right: 20px; white-space: normal }
        .customInfobox .name { font-size: 14px; font-weight: bold; margin-bottom: 5px }
        .popup-content-container .popup-close { top: 12px !important; right: 6px !important; color: #ffffff !important; font-size: 16px !important; line-height: 18px !important; height: 15px !important; background: #000000 !important; width: 15px !important; border-radius: 50px !important; display: flex !important; justify-content: center !important; align-items: center !important; }
        .atlas-map-canvas { width: 100% !important }
    </style>
</head>
<body onload="GetMap()">
    <div id="myMap" style="position:relative;width:100%;min-width:290px;height:600px;"></div>
    <script>
        var map, datasource, popup, spiderManager;
        function GetMap() {
            //Initialize a map instance.
            map = new atlas.Map('myMap', {
                center: [-110, 50],
                zoom: 2,
                view: 'Auto',
                //Add authentication details for connecting to Azure Maps.
                authOptions: {
                    //Use Azure Active Directory authentication.
                    authType: 'subscriptionKey',
                    subscriptionKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
                }
            });

            var cordinates = [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [-84.28295, 30.46454] }, "properties": { "Name": "aa", "Status": "online" } }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-84.28295, 30.46454] }, "properties": { "Name": "bb", "Status": "offline" } },
            { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-54.28295, 60.46454] }, "properties": { "Name": "cc", "Status": "offline" } },
            { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-58.28295, 66.46454] }, "properties": { "Name": "dd", "Status": "online" } }];

            var positions = { "type": "FeatureCollection", "features": cordinates };
            map.setCamera({
                //center map
                bounds: atlas.data.BoundingBox.fromData(positions),
                padding: 50
            });

            map.events.add('ready', function () {
                //Load customized icons for use with the symbol layer.
                var iconPromises = [
                    map.imageSprite.createFromTemplate('onlineIcon', 'marker', '#4cae4c', '#fff'),
                    map.imageSprite.createFromTemplate('offlineIcon', 'marker', '#808080', '#fff')
                ];

                //Wait for icons to load into the map sprite.
                Promise.all(iconPromises).then(() => {
                    //Create a data source to add your data to.
                    datasource = new atlas.source.DataSource(null, {
                        //Tell the data source to cluster point data.
                        cluster: true,

                        //The radius in pixels to cluster points together.
                        // clusterRadius: 45,
                        clusterProperties: { //Calculate counts for each entity type in a cluster
                            'online': ['+', ['case', ['==', ['get', 'Status'], 'online'], 1, 0]],
                            'offline': ['+', ['case', ['==', ['get', 'Status'], 'offline'], 1, 0]]
                        },

                        //The maximium zoom level in which clustering occurs.
                        //If you zoom in more than this, all points are rendered as symbols.
                        clusterMaxZoom: 24,
                        maxZoom: 24
                    });

                    //set data to datasource
                    datasource.setShapes(positions)
                    map.sources.add(datasource);

                    //Create a layer for rendering clustered data in the data source.
                    var clusterBubbleLayer = new atlas.layer.BubbleLayer(datasource, null, {
                        //Scale the size of the clustered bubble based on the number of points inthe cluster.
                        radius: [
                            'step',
                            ['get', 'point_count'],
                            20,         //Default of 20 pixel radius.
                            100, 30,    //If point_count >= 100, radius is 30 pixels.
                            750, 40     //If point_count >= 750, radius is 40 pixels.
                        ],

                        //Change the color of the cluster based on the value on the point_cluster property of the cluster.
                        color: [
                            'case', //Use a conditional case expression.
                            // all offline
                            ['>', ['get', 'offline'], 0] && ['==', ['get', 'online'], 0],
                            '#a5a5a5',

                            // all online
                            ['>', ['get', 'online'], 0] && ['==', ['get', 'offline'], 0],
                            '#6aa84f',

                            // online and offline both
                            '#ff9900'
                        ],
                        strokeWidth: 0,
                        filter: ['has', 'point_count'] //Only rendered data points which have a point_count property, which clusters do.
                    });

                    //Create a layer to render the individual locations.
                    var shapeLayer = new atlas.layer.SymbolLayer(datasource, null, {
                        //Define style for individual points.
                        iconOptions: {
                            //Use a case expression to select the image icon based on the Status property of the data point.
                            image: [
                                'case',

                                //Check if status is online
                                ['==', ['get', 'Status'], 'online'],
                                'onlineIcon',

                                //Offline/default icon.
                                'offlineIcon'
                            ]
                        },

                        filter: ['!', ['has', 'point_count']] //Filter out clustered points from this layer.
                    });

                    //Add the clusterBubbleLayer and two additional layers to the map.
                    map.layers.add([
                        clusterBubbleLayer,

                        //Create a symbol layer to render the count of locations in a cluster.
                        new atlas.layer.SymbolLayer(datasource, null, {
                            iconOptions: {
                                image: 'none', //Hide the icon image.
                            },
                            textOptions: {
                                textField: '{point_count_abbreviated}',
                                offset: [0, 0.4]
                            },
                            filter: ['!', ['has', 'point_count']]
                        }),

                        shapeLayer
                    ]);

                    markerLayer = new atlas.layer.HtmlMarkerLayer(datasource, null, {
                        markerCallback: function (id, position, properties) {
                            //Check to see if marker represents a cluster.
                            if (properties.cluster) {
                                return new atlas.PieChartMarker({
                                    position: position,
                                    colors: '#ffffff',
                                    fillColor: 'white',
                                    strokeColor: 'white',
                                    text: properties.point_count_abbreviated
                                });
                            } else {
                                //for single marker
                                return new atlas.HtmlMarker({
                                    visible: false
                                });
                            }
                        }
                    });

                    // map.events.add('click', markerLayer, markerClicked);

                    map.layers.add(markerLayer);

                    //Create an instance of the spider manager.
                    spiderManager = new atlas.SpiderClusterManager(map, clusterBubbleLayer, shapeLayer);

                    //Add event handler for when a feature is selected.
                    map.events.add('featureSelected', spiderManager, function (e) {
                        if (e.cluster) {
                            showPopup(e.cluster.geometry.coordinates, e.shape.getProperties(), [0, 0]);
                        } else {
                            showPopup(e.shape.getCoordinates(), e.shape.getProperties(), [0, -20]);
                        }
                    });

                    //Add event handler for when a feature is unselected.
                    map.events.add('featureUnselected', spiderManager, function () {
                        hidePopup();
                    });
                });
            });
        }

        var popupTemplate = '<div class="customInfobox"><div class="name">{name} ({status})</div></div>';
        showPopup = function (position, properties, pixelOffset) {
            var content = popupTemplate.replace(/{name}/g, properties.Name).replace(/{status}/g, properties.Status);
            popup.setOptions({
                //Update the content of the popup.
                content: content,
                //Update the position of the popup with the symbols coordinate.
                position: position,
                //Offset the popups position for better alignment with the layer.
                pixelOffset: pixelOffset
            });

            //Open the popup.
            popup.open(map);
        }

        hidePopup = function () {
            popup.close();
        }
    </script>
</body>
</html>

一切正常,但问题是我没有在 map 中使用任何 IoT 相关服务,但 Azure Billing 生成了太多账单 “Azure map - 位置洞察”。

这是什么意思以及如何禁用它,因为它产生了太多的账单。

提前致谢。

最佳答案

位置见解是一组 Azure map 服务,主要与搜索和地理编码相关。本地图 View 位于矢量 map 图 block 中细节很少的区域时, map 确实使用反向地理编码服务来为屏幕阅读器提供辅助功能。当您的 map 位于森林和海洋等无人居住区域时,更有可能调用此服务。本地图位于人口稠密地区时,它不太可能被调用,因为矢量图 block 更有可能具有可用于为屏幕阅读器供电的标签。

请注意,上述行为适用于 Azure Maps Web SDK 版本 2。如果您使用的是版本1,每次 map 移动时它都会调用反向地理编码器,强烈建议您升级到v2(它向后兼容,只需指向最新版本)。大约 4 年前,Azure Maps 首次发布后的 6 个月内,V1 被 v2 取代。

此外,值得注意的是,与 map 图 block 不同,对反向地理编码器的调用不会被缓存,因为输入坐标几乎总是唯一的。

综上所述,如果您使用的是 v2,并且希望 map 在矢量切片中找不到标签时不更新屏幕阅读器(减少可访问性),您可以向 map 添加以下选项加载 map 时的选项:

enableAccessibilityLocationFallback: false

现在,上述所有内容都假设反向地理编码服务是您使用位置洞察类别的来源。您可以通过执行以下操作来验证这一点:

  1. 转到 Azure 门户中的 Azure Maps 帐户。
  2. 转到“指标”,然后将“指标”下拉菜单设置为“使用情况”。
  3. 然后点击“添加过滤器”,并将“属性”设置为“API 名称”,将“值”设置为“SearchReverseAddress”。
  4. 检查该使用量是否与您看到的峰值相符。如果它不查看“值”下拉列表中的其他选项,请检查其中是否有任何其他“搜索”相关值。如果是这样,请检查使用情况,直到找到该使用情况来自哪个 API。

如果您进行上述更改并继续看到位置洞察的使用情况,则您的订阅 key 很可能正在其他地方与其中一项位置洞察服务一起使用。这可能是您的另一个应用程序,也可能是您团队中的其他人(如果您有共享订阅),或者如果您的应用程序是公开可用的(代码或托管 Web 应用程序),那么有人可能会抢走您的 key 并用它来调用一个应用程序的其他服务。通常建议在生产中使用 Azure Active Directory 进行身份验证,这样可以防止有人窃取您的 key 。

关于javascript - Azure map 产生巨额账单,详细信息显示由于 "Azure Maps - Location Insights",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74277043/

相关文章:

javascript - 如何使用单击事件处理程序在点之间画线?

javascript - 未捕获的类型错误 : Object #<Object> has no method 'connect'

PowerShell脚本错误: the string is missing the terminator:

azure - 对 Azure Maps 搜索中的结果进行排序

javascript - 如何从 AngularJS 指令中获取和设置元素高度

javascript - 如何有效地将网络流缓冲到 JavaScript 中的文件中?

azure - Web异常 "The remote server returned an error: (409) Conflict"

azure - 如何将 Azure Web 应用程序锁定到特定用户组

angular - Azure map 控制导致 Angular 通用 SSR 错误

azure - Azure Maps 是否将图像叠加层发送到云?