惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
PCI Perspectives
PCI Perspectives
H
Help Net Security
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
S
Secure Thoughts
Jina AI
Jina AI
Attack and Defense Labs
Attack and Defense Labs
大猫的无限游戏
大猫的无限游戏
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security @ Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
T
Tor Project blog
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
博客园 - 【当耐特】
G
Google Developers Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
I
Intezer
S
Schneier on Security
S
Securelist
W
WeLiveSecurity
C
Cybersecurity and Infrastructure Security Agency CISA
P
Palo Alto Networks Blog
Scott Helme
Scott Helme
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
T
Threatpost
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
Last Week in AI
Last Week in AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
A
Arctic Wolf
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog

博客园 - 柏放

检测移动设备横竖屏 [转]一句css代码让你的网站变灰,一起悼念地震中逝去的生命! MYSQL命令行常用操作 MySQL数据库导入导出详解[转发] 国外达人收集的Cheet Sheet PHP学习:字符串操作和正则表达式 PHP学习:数组 PHP学习:文件操作 SQL Server:获得用户最新或前n条订单的几种SQL语句 SQL Server:APPLY表运算符 SQL Server:查询当前服务器有多少连接请求 SQL Server:关于Null的一些事 js倒计时 SQL Server:在Management Studio中使用Web浏览器 SQL Server:获得表的元数据 - SET FMTONLY ON 排序:插入排序及希尔排序 SQL Server:把CSV文件导入到SQL Server表中 SQL Server:使用一个语句块插入多条记录 SQL Server:在事务中回滚TRUNCATE操作
Google Map API学习记录
柏放 · 2010-03-13 · via 博客园 - 柏放

去年年底用Google Map API做了一个GIS系统,以下简称GMA,初看GMA的时候感觉写GMA工程师确实挺强的,把Javascript运用的如火纯清,不愧是全球顶尖的公司;

下面我就把我平时遇到的问题,总结一下,顺便做个记录备忘一下,如果在这能发现解决你问题的解决方案,那就更好!

1,限制地图的缩放级别

    我们知道GMA的地图的缩放级别是1-20,如果我们只是让用户在4-15范围内操作地图,那怎么办呢?下面就是一个解决方案!
     //限制缩放级别
    //Min
    G_PHYSICAL_MAP.getMinimumResolution = function() { return _zoomMinLevel; };
    G_NORMAL_MAP.getMinimumResolution = function() { return _zoomMinLevel; };
    G_SATELLITE_MAP.getMinimumResolution = function() { return _zoomMinLevel; };
    G_HYBRID_MAP.getMinimumResolution = function() { return _zoomMinLevel; };
    //Max
    G_PHYSICAL_MAP.getMaximumResolution = function() { return _zoomMaxLevel; };
    G_NORMAL_MAP.getMaximumResolution = function() { return _zoomMaxLevel; };
    G_SATELLITE_MAP.getMaximumResolution = function() { return _zoomMaxLevel; };
    G_HYBRID_MAP.getMaximumResolution = function() { return _zoomMaxLevel; };
2,绑定鼠标右键操作
      我们在用Google地图查某一个地方的时候,如果你右击鼠标,就会出现一个菜单,包含一些“以此为出发点”、“以此为终点”、“放大”、“缩小”等操作,那我们怎么实现定义自己的右键操作呢?当时为了实现这个功能,还费了好长时间。不多说了,直接看代码:

/* Init Google Map Mouse Right ContextMenu Start */
function initializeGoogleMapContextMenu() {
    /*contextMenu*/
    _contextMenu = document.createElement("div");
    $(_contextMenu).css({ display: "none" });
    var contextMenuImage = document.createElement("img");
    $(contextMenuImage).css({ cursor: "pointer" });
    $(contextMenuImage).click(clickContextMenuEvent);
    contextMenuImage.src = "/images/btn_mouse_right_upload.png";
    _contextMenu.appendChild(contextMenuImage);
    map.getContainer().appendChild(_contextMenu);

    //Bind Event
    GEvent.addListener(map, "singlerightclick", function(pixel, tile) {
        _contextMenuClickPixel = pixel;
        var x = _contextMenuClickPixel.x;
        var y = _contextMenuClickPixel.y;

        if (x > map.getSize().width - 120) { x = map.getSize().width - 120 }
        if (y > map.getSize().height - 100) { y = map.getSize().height - 100 }
        //判断是否登陆
        if (!checkLogin()) {
            alert("请先登录,在上传视频");
            return;
        }
        //设置菜单位置
        var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x, y));
        pos.apply(_contextMenu);
        displayContextMenu();
    });
}
function clickContextMenuEvent() {
    //Google map api内置像素转坐标函数
    var point = map.fromContainerPixelToLatLng(new GPoint(_contextMenuClickPixel.x, _contextMenuClickPixel.y));
    var _params = {
        lat: point.lat(),
        lng: point.lng()
    };
    //弹出一个窗口
    var myHtml = createIframeHtml(310, 310, "upload.aspx", _params);
    map.openInfoWindowHtml(point, myHtml)
}
//显示菜单
function displayContextMenu() {
    $(_contextMenu).show();
    //点击任意位置,隐藏菜单
    $(document).one('click', hideContextMenu);
}
//隐藏菜单
function hideContextMenu() {
    $(_contextMenu).hide();
}
/* Init Google Map Mouse Right ContextMenu End */

我们在初始化Google Map的时候,直接调用initializeGoogleMapContextMenu()方法就行了,其中,我的右键菜单只是一张图片,你可以根据你的实际情况,任意设计。

3,自定义GroundOverlay
     GMA中有一个GGroundOverlay类,用它可以在地图上任意位置贴图或划线,但是当我用它贴雷达图或云图的时候,发现它老是给我把位置贴错,我的雷达图或云图首先根据当前视窗获得西南角和东北角两个点的坐标以及中心点的坐标,然后计算出当前视窗对应的最大维度值和最小维度值,来生成雷达图或云图,最后把生成的雷达图或云图贴在当前的视窗口上。实验了好几次,用它老是给我贴错,好像是把我的图给我缩小了。
    实在没有办法了,就索性按照GMA的教程写了一个,虽然我感觉他给出的例子和他内置的应该一样,但是用自己写的就可以正确的贴上去,十分不解!
   

//GISGroundOverlay
function GISGroundOverlay(imageUrl, bounds, opacity) {
    this.imageUrl_ = imageUrl;
    this.bounds_ = bounds;
    this.opacity_ = opacity || 1;
    this.overlayImgId_ = "__groundoverlay_img";
}
GISGroundOverlay.prototype = new GOverlay();
GISGroundOverlay.prototype.initialize = function(map) {
    var pane = map.getPane(G_MAP_MAP_PANE);
    $(pane).empty();
    var div = document.createElement("div");
    div.style.position = "absolute";
    var img = document.createElement("img");
    img.id = this.overlayImgId_;
    img.src = this.imageUrl_;
    $(img).css({ "opacity": this.opacity_ });
    if (this.imageUrl_) {
        $(div).append(img);
    }
    pane.appendChild(div);

    this.div_ = div;
    this.map_ = map;
    this.img_ = img;
}
GISGroundOverlay.prototype.setOverlayImage = function(src) {
    if (src) {
        $("#" + this.overlayImgId_).attr("src",src);
    }
}
GISGroundOverlay.prototype.remove = function() {
    if (this.div_.parentNode)
        this.div_.parentNode.removeChild(this.div_);
}
GISGroundOverlay.prototype.copy = function() {
    return new GISOverlay(this.bounds_);
}
GISGroundOverlay.prototype.setOpacity = function(opacity) {
    $(this.img_).css({ "opacity": opacity });
}
GISGroundOverlay.prototype.redraw = function(force) {
    if (!force) return;

    // Calculate the DIV coordinates of two opposite corners of our bounds to
    // get the size and position of our rectangle
    var c1 = this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
    var c2 = this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());
    var width = Math.abs(c2.x - c1.x);
    var height = Math.abs(c2.y - c1.y);
    var left = Math.min(c2.x, c1.x);
    var top = Math.min(c2.y, c1.y);

    // Now position our DIV based on the DIV coordinates of our bounds

    this.div_.style.width = width + "px";
    this.div_.style.height = height + "px";
    this.div_.style.left = left + "px";
    this.div_.style.top = top + "px";
}
 
 
下面列出一些Google map api的参考站点:
http://econym.org.uk/gmap/
http://maps.forum.nu/
http://koti.mbnet.fi/ojalesa/exam/index.html
Author:兴百放
Web:http://xbf321.cnblogs.com/
Time:2010,3,13