Замена GTileLayer в Google Maps v3 на ImageMapType, ограничивающую рамку плитки? - PullRequest
4 голосов
/ 26 мая 2010

Мне нужно обновить этот код:

radar_layer.getTileUrl=function(tile,zoom) {

    var llp = new GPoint(tile.x*256,(tile.y+1)*256);
    var urp = new GPoint((tile.x+1)*256,tile.y*256);
    var ll = G_NORMAL_MAP.getProjection().fromPixelToLatLng(llp,zoom);
    var ur = G_NORMAL_MAP.getProjection().fromPixelToLatLng(urp,zoom);
    var dt = new Date();
    var nowtime = dt.getTime();

    var tileurl = "http://demo.remoteservice.com/cgi-bin/serve.cgi?";
        tileurl+="bbox="+ll.lng()+","+ll.lat()+","+ur.lng()+","+ur.lat();
        tileurl+="&width=256&height=256&reaspect=false&cachetime="+nowtime;

    return tileurl;
};

Я дошел до:

var DemoLayer = new google.maps.ImageMapType({

     getTileUrl: function(coord, zoom) {

     var llp = new google.maps.Point(coord.x*256,(coord.y+1)*256);
     var urp = new google.maps.Point((coord.x+1)*256,coord.y*256);
     var ll = googleMap.getProjection().fromPointToLatLng(llp);
     var ur = googleMap.getProjection().fromPointToLatLng(urp);
     var dt = new Date();
     var nowtime = dt.getTime();

     var tileurl = "http://demo.remoteservice.com/cgi-bin/serve.cgi?";
         tileurl+="bbox="+ll.lng()+","+ll.lat()+","+ur.lng()+","+ur.lat();
  tileurl+="&width=256&height=256&reaspect=false&cachetime="+nowtime;

     return tileurl;

     },
             tileSize: new google.maps.Size(256, 256),
             opacity:1.0,
             isPng: true
         });

В частности, мне нужна помощь с этим разделом:

var llp = new google.maps.Point(coord.x*256,(coord.y+1)*256);
 var urp = new google.maps.Point((coord.x+1)*256,coord.y*256);
 var ll = googleMap.getProjection().fromPointToLatLng(llp);
 var ur = googleMap.getProjection().fromPointToLatLng(urp);

Служба хочет ограничить рамку плитки тем, что я понимаю. Тем не менее, ll и ваш, кажется, не исправить вообще.

У меня он работал и отображал всю ограничивающую рамку карты в каждой плитке, но, конечно, это не то, что мне нужно.

Любое понимание здесь будет с благодарностью, если не иметь GTileLayers в V3, это хорошо, если я могу обойти это, до тех пор, пока я разочарован.

Ответы [ 3 ]

11 голосов
/ 03 июня 2010

Исправление в моем случае состояло в том, чтобы использовать обновленный сервис листов от того же издателя. Он принимает более простые параметры:

   globalfoovar = new google.maps.ImageMapType({
    getTileUrl: function(tile, zoom) {
        return "http://bar.com/" + zoom + "/" + tile.x + "/" + tile.y +".png"; 
    },
    tileSize: new google.maps.Size(256, 256),
    opacity:0.60,
    isPng: true
});

googleMap.overlayMapTypes.push(null); // create empty overlay entry
googleMap.overlayMapTypes.setAt("0",globalfoovar); // set the overlay, 0 index

// if you want to hide the layer later (toggle):
// googleMap.overlayMapTypes.setAt("0",null);

Как видите, это намного проще, чем код, который я разместил в описании проблемы.

Однако, если вы все еще читаете, вы, вероятно, по-прежнему хотите получить ответ на исходную проблему, которая заключается в преобразовании латль в пиксели. Не беспокойся, у меня тоже есть решение.

Чтобы получить доступ к 4 полезным преобразованиям латлинга, точки и пикселя, вам нужно добавить фиктивный OverlayView.

Шаг 1) Определите заглушку, чтобы она была доступна глобально, вместе с вашей картой и другими переменными:

var googleMap = {}; // global map var
var mapCanvasStub = {}; // map OverlayView var

Шаг 2) После рендеринга карты настройте этот пустой / заглушка OverlayView следующим образом:

googleMap = new google.maps.Map($('#mapCanvas')[0]); // google map init

mapCanvasStub = function (map) { this.setMap(map); }  // start building overlay stub
mapCanvasStub.prototype = new google.maps.OverlayView(); 
mapCanvasStub.prototype.draw = function() {}; 
mapCanvasStub = new mapCanvasStub(googleMap); // bin dthe overlay to the map

Теперь у вас есть функциональный OverlayView, привязанный к карте, когда вам нужно использовать эти преобразования, вы можете сделать это следующим образом:

var projection = mapCanvasStub.getProjection();
var position = projection.fromLatLngToContainerPixel( latLng );
                   // or fromContainerPixelToLatLng()
                   // or fromDivPixelToLatLng()
                   // or fromLatLngToDivPixel()
                   // or fromLatLngToDivPixel()

В моем случае я использую это для создания пользовательских информационных пузырей, вот фрагмент из моего события клика:

function customAlertClick(a,b,c) {

    var projection = mapCanvasStub.getProjection();
    var position = projection.fromLatLngToContainerPixel(b);
    var top = (position.y + parseInt($('#mapCanvas').position().top));
    var lft = (position.x + parseInt($('#mapCanvas').position().left));

    // obviously this is an overly simple example
    $('#foo').css('top',top + 'px');
    $('#foo').css('lft',left + 'px');
}

Надеюсь, это поможет кому-нибудь еще сделать прыжок к V3.

Если вам интересно, почему мы должны прыгать через эти дополнительные обручи, чтобы сделать что-то, что так просто в V2, ответ довольно очевиден, когда вы думаете об этом. V3 настроен для работы на мобильных устройствах, где пропускная способность и мощность процессора ограничены. Они убрали как можно больше кода, чтобы получить простой рендеринг карт, и ожидают, что вы вручную подключите эти дополнения, если они вам абсолютно необходимы.

Если бы у меня было больше времени, я бы написал sample.html, но это должно помочь вам.

4 голосов
/ 04 июня 2010

Спасибо за подробности. На самом деле в моем случае я не мог изменить API, чтобы использовать номер плитки, который мне нужно передать LatLng. Я нашел это решение ... пока оно работает для меня:

var myMapOptions = {
          getTileUrl: function(coord,zoom) { 
            var proj = map.getProjection();
            var zfactor=Math.pow(2,zoom);
            var top=proj.fromPointToLatLng(new google.maps.Point(coord.x*256/zfactor,coord.y*256/zfactor));
            var bot=proj.fromPointToLatLng(new google.maps.Point((coord.x+1)*256/zfactor,(coord.y+1)*256/zfactor));
            url = "/layer/layer_"+zoom+"_"+top.lng().toFixed(6)+"_"+bot.lat().toFixed(6)+"_"+bot.lng().toFixed(6)+"_"+top.lat().toFixed(6)+".png";
        return url; 
       },
      tileSize: new google.maps.Size(256, 256),
      isPng: true,
      opacity: 0.4
     }
0 голосов
/ 25 января 2018

у меня сработало

Я использовал Tileset MapBox.Light Style в верхней части Google API V3

function loadMap() {
    // Default the map view to the continental U.S.
    mapOptions = {
      center: new google.maps.LatLng(17.387140, 78.491684),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      zoom: 8
    };

    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    var imageMapType = new google.maps.ImageMapType({
      getTileUrl: function(coord, zoom) {
        return "https://api.mapbox.com/v4/mapbox.light/" +zoom+"/"+coord.x+"/"+coord.y+"@2x.png?access_token=<<access_token>>";

      },
      tileSize: new google.maps.Size(256, 256)
    });

    map.overlayMapTypes.push(imageMapType);        

}

loadMap();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...