Leaflet: рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдкрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЬреБрд▓ре░ 2012  ┬╖  31рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Leaflet/Leaflet

рдирдорд╕реНрддреЗред рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╛рдИрдВ рдУрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдмрдбрд╝рд╛ рдмреЙрдХреНрд╕ рд╣реИ, рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдХреЗрдВрджреНрд░ рджрд╛рдИрдВ рдУрд░ рдЕрдзрд┐рдХ рд╣реЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдПрдХ рдкреИрди рдпрд╛ рдХреЗрдВрджреНрд░ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдпрд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдСрдлрд╕реЗрдЯ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрддрд░реАрдп рд╕реЗрдЯрд┐рдВрдЧ рд╣реЛрдЧреАред

рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХрдИ рдЬреЗрдПрд╕ рдореИрдкрд┐рдВрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕реЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдмрд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рд╢рд╛рдирджрд╛рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/codeforamerica/lv-trucks-map (http://clvfoodtrucks.com/ рдкрд░ рд▓рд╛рдЗрд╡ рд╕рд╛рдЗрдЯ) рдкрд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдирдЯреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ L.map рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдореИрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ "рдореВрд▓ рд░реВрдк рд╕реЗ" рдЙрдкрд▓рдмреНрдз рд╣реЛ, рдФрд░ рдЗрд╕реЗ рдореИрдк рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

L.Map.prototype.panToOffset = function (latlng, offset, options) {
    var x = this.latLngToContainerPoint(latlng).x - offset[0]
    var y = this.latLngToContainerPoint(latlng).y - offset[1]
    var point = this.containerPointToLatLng([x, y])
    return this.setView(point, this._zoom, { pan: options })
}

рдпрд╣ panTo() рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде, offset , рдЬреЛ [xOffset, yOffset] рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд░рдгреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдПрдХ setViewOffset() рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА 31 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЖрдкрдХреЛ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ map.containerPointToLatLng рд╡рд┐рдзрд┐ред рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдБ рдХреЛрдиреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреБрдЫ рдкрд┐рдХреНрд╕реЗрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

var centerPoint = map.getSize().divideBy(2),
    targetPoint = centerPoint.subtract([overlayWidth, 0]),
    targetLatLng = map.containerPointToLatLng(centerPoint);

map.panTo(targetLatLng);

рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ?

рдЕрд░реЗред рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрдВрджреНрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдСрдлрд╕реЗрдЯ рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЛ рдЪрд░рдгреЛрдВ рд╡рд╛рд▓рд╛ рдЖрдВрджреЛрд▓рди рд╣реЛрдЧрд╛ред рд▓реЗрдЯ-рд▓реИрдВрдЧ рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ, рдСрдлрд╕реЗрдЯрд┐рдВрдЧ, рдлрд┐рд░ рдкреИрдирд┐рдВрдЧ; рдПрдХ рдПрдХрд▓ рдЖрдВрджреЛрд▓рдиред

рдУрд╣, рдореЗрд░реА рдЧрдгрдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗрдВрджреНрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдСрдлрд╝рд╕реЗрдЯ рдХреЗрдВрджреНрд░ рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБ рдореЗрдВ рд╣реЛ, рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ overlayWidth / 2 ред рддреЛ рдпрд╣рд╛рдБ рдПрдХ рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХреЛрдб рд╣реИ:

var targetPoint = map.project(targetLatLng, targetZoom).subtract([overlayWidth / 2, 0]),
    targetLatLng = map.unproject(targetPoint, targetZoom);

map.setView(targetLatLng, targetZoom);

рдпрд╣ рд╡рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреА рдерд╛ - рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдереЛрдбрд╝рд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╕рд╛рдЗрдбрдмрд╛рд░ рдУрд╡рд░рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм рднреА рд╣рдо рдлрд┐рдЯрдмрд╛рдЙрдВрдб () рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЖрдВрджреЛрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрдбрдмрд╛рд░ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдерд╛ред

@ рд╢реЛрдХ рдЬреЛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ред рдпрд╣ рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

@ajbeaven рдХреА рддрд░рд╣, рдПрдХ (рдЬрд┐рдпреЛрдЬрд╕рди) рдкрд░рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдлрд╕реЗрдЯ рдлрд┐рдЯрдмрд╛рдЙрдВрдб рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЗрд╡рд▓ рдСрдлрд╕реЗрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреА рд╕реАрдорд╛рдПрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдмрджрд▓ рд░рд╣реА рд╣реИрдВ, рдФрд░ рди рд╣реА рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХрд┐рд╕реА рднреА рддрд░рд╣, рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реА рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рджред

fitBounds рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ рд▓реЗрдХрд┐рди рдЖрд╕рд╛рди рднреА рд╣реИред рдмрд╕ рдЗрд╕ https://github.com/CloudMade/Leaflet/blob/master/src/map/Map.js#L275 рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ, рдпрд╣ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

var targetZoom = altGetBoundsZoom(map, bounds);
// ... calculate targetLatLng as above
map.setView(targetLatLng, targetZoom);

рдирдорд╕реНрддреЗред рдореИрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ fitBounds рдХреЗ рд╕рд╛рде LatLng[] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд┐рд╕реНрдордд рдХреЗред
рдореЗрд░реЗ рд╡реЗрдм рдореЗрдВ рдПрдХ рд╕рд╛рдЗрдбрдмрд╛рд░ рдУрд╡рд░рд▓реЗ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдирдХреНрд╢рд╛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдИ рджреЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдУрд╡рд░рд▓реЗ рдХреЗ рдиреАрдЪреЗ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред (рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗрдВрджреНрд░ рдХреЛ рднреА рдСрдлрд╕реЗрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ _offset map_ рдкрд░ fitBounds рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдЖрдкрдиреЗ рдКрдкрд░ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдореИрдВ рдХрд╛рдлреА рднреНрд░рдорд┐рдд рд╣реВрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ targetLatLng рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА targetPoint рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдВрдХреЛрдВ рдХреА рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВред рдХрдВрдЯреЗрдирд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░рдл рдЕрд░реНрдз-рдУрд╡рд░рд▓реЗ рд╕реНрдерд╛рди рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдЖрдк рдЕрднреА рднреА рдирдХреНрд╢рд╛ рдЦреАрдВрдЪреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдорд╛рд░реНрдХрд░реЛрдВ рдкрд░ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд░рдЦреЗрдВрдЧреЗред

рдЖрдк рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред (рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╡рд╣рд╛рдВ рд╣реИ) рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирдХреНрд╢рд╛ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рдХрд┐ рдкрддреНрд░рдХ рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИред рдЗрд╕рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:

рдРрдкрд╕реЗрдЯ рд╡реНрдпреВ
рдРрдкрд╕реЗрдЯрдмрд╛рдЙрдВрдб
рдРрдкрдЧреЗрдЯрдмрд╛рдЙрдВрдбрдЬрд╝реВрдо

https://github.com/MinnPost/minnpost-my-boundaries/blob/master/visualizations/index.html#L556

рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде 550px рдХреА рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рд╕реВрдЪреА рд░рдЦрдиреА рдереАред рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдПрд▓.рдореИрдк рдХреЗ рдХреБрдЫ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдЖрдкрдХреЗ рд╕рднреА рдЖрдЗрдбрд┐рдпрд╛рдЬ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рдХреЛ рдХрд╡рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ 100% рдпрдХреАрди рдирд╣реАрдВ рд╣реИред

MapCenterOffsetMixin = {
    UIOffset: [550, 0], // x, y
    getBounds: function(){
        var a=this.getPixelBounds(),
            b=this.unproject(new L.Point(a.min.x+this.UIOffset[0],a.max.y+this.UIOffset[1]), this._zoom,!0),
            c=this.unproject(new L.Point(a.max.x,a.min.y),this._zoom,!0);
            return new L.LatLngBounds(b,c)
    },
    _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
        var targetPoint = this.project(newCenter, newCenter).subtract([this.UIOffset[0]/2, this.UIOffset[1]/2]),
            newCenter = this.unproject(targetPoint, newZoom);
        var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
        return this.project(latlng, newZoom)._subtract(topLeft);
    },
    _getCenterLayerPoint: function () {
        return this.containerPointToLayerPoint(this.getSize().divideBy(2).add([this.UIOffset[0]/2, this.UIOffset[1]/2]));
    },
    _resetView: function (a, b, c, d) {
        var e = this._zoom !== b;
        // Change the center
        var targetPoint = this.project(a, b).subtract([this.UIOffset[0] / 2, this.UIOffset[1]/2]),
            a = this.unproject(targetPoint, b);
        d || (this.fire("movestart"), e && this.fire("zoomstart")), this._zoom = b, this._initialTopLeftPoint = this._getNewTopLeftPoint(a);
        if (!c) L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
        else {
            var f = L.DomUtil.getPosition(this._mapPane);
            this._initialTopLeftPoint._add(f)
        }
        this._tileLayersToLoad = this._tileLayersNum, this.fire("viewreset", {
            hard: !c
        }), this.fire("move"), (e || d) && this.fire("zoomend"), this.fire("moveend"), this._loaded || (this._loaded = !0, this.fire("load"))
    }
}

L.Map.include(MapCenterOffsetMixin);

@averrips рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ ... рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрд╝реВрдо рдирд┐рдпрдВрддреНрд░рдг рдЕрдм рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ :( рдореБрдЭреЗ "рдХреИрдЪреЙрд▓" рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ: TypeError: t рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ

рдпрд╣рд╛рдБ FitBoundsPadded рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬрд┐рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдЗрд╕реЗ рдлрд┐рдЯрдмрд╛рдЙрдВрдб рдХреА рддрд░рд╣ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдкрдиреА рдЗрдЪреНрдЫрд┐рдд рдкреИрдбрд┐рдВрдЧ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд░реЗрдВ:

map.fitBoundsPadded(myBounds, new L.Point(0, 0), new L.Point(0, 150));

рдФрд░ рдХреЛрдб:

    fitBoundsPadded: function (bounds, paddingTopLeft, paddingBottomRight) { //(LatLngBounds, Point, Point)

        var zoom = this.getBoundsZoom(bounds);
        var zoomToTry = zoom;

        while (true) {
            var newTopLeft = this.unproject(this.project(bounds.getNorthEast(), zoomToTry).add(paddingTopLeft), zoomToTry);
            var newBottomRight = this.unproject(this.project(bounds.getSouthWest(), zoomToTry).add(paddingBottomRight), zoomToTry);

            var paddedBounds = new L.LatLngBounds([bounds.getSouthWest(), bounds.getNorthEast(), newTopLeft, newBottomRight]);

            var zoom2 = this.getBoundsZoom(paddedBounds);

            if (zoom2 == zoomToTry) {
                return this.fitBounds(paddedBounds);
            } else {
                zoomToTry--;
            }
        }
    },

рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд▓рд╛рдЧреВ! рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

map.fitBounds(bounds, [20, 30], [40, 50]); // bounds, topLeftPadding, bottomRightPadding

рдпрд╛ рдХреЗрд╡рд▓ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдиреАрдЪреЗ-рджрд╛рдПрдВ рдкреИрдбрд┐рдВрдЧ рдХреЛ рдмрд░рд╛рдмрд░ рд╢реАрд░реНрд╖-рдмрд╛рдПрдВ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ред рдЕрдм рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

map.fitBounds(bounds, {
    padding: [20, 30]
});

map.fitBounds(bounds, {
    paddingTopLeft: [20, 30],
    paddingbottomRight: [40, 50]
});

рдХреНрдпрд╛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкреИрдбрд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХреЛрдИ рдирд┐рдпреЛрдЬрд┐рдд рдХрд╛рд░реНрдп рд╣реИ?

рд╢рд╛рдпрдж, рд╣рд╛рдБред рдХрдо рд╕реЗ рдХрдо setView рдФрд░ panTo рдХреЗ рд▓рд┐рдПред

рд╕рднреА рддрд░рдл рдПрдХ рд╣реА рдкреИрдбрд┐рдВрдЧ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ред

map.fitBounds(bounds, { padding: 20 });

рд╡рд░реНрддрдорд╛рди рдХреЗ рдмрдЬрд╛рдп ...

map.fitBounds(bounds, { padding: [20, 20] });

@averrips рд╡рд╣ рдорд┐рдХреНрд╕рд┐рди рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдерд╛, рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рдЕрднреА рддрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдЖрдк рдпрд╣рд╛рдВ рдЬрд╛рдПрдВ (рдЕрд╕рд▓реА рдЖрд╕рд╛рди):

 рдлрд╝рдВрдХреНрд╢рди рд░реАрд╕реЗрдВрдЯрд░ (рдорд╛рдирдЪрд┐рддреНрд░, рдЕрдХреНрд╖рд╛рдВрд╢, рдСрдлрд╝рд╕реЗрдЯ, рдСрдлрд╝рд╕реЗрдЯреА) {
 рд╡рд░ рдХреЗрдВрджреНрд░ = рдирдХреНрд╢рд╛.рдкрд░рд┐рдпреЛрдЬрдирд╛ (latlng);
 рдХреЗрдВрджреНрд░ = рдирдпрд╛ рдПрд▓.рдмрд┐рдВрджреБ (рдХреЗрдВрджреНрд░.рдПрдХреНрд╕+рдСрдлрд╝рд╕реЗрдЯрдПрдХреНрд╕,рд╕реЗрдВрдЯрд░.рд╡рд╛рдИ+рдСрдлрд╝рд╕реЗрдЯреА);
 рд╡рд░ рд▓рдХреНрд╖реНрдп = map.unproject (рдХреЗрдВрджреНрд░);
 map.panTo (рд▓рдХреНрд╖реНрдп);
 }

рдХреГрдкрдпрд╛ "рд╕реЗрдЯ рд╡реНрдпреВ" рдФрд░ "рдкреИрдирдЯреЛ" рдХреЗ рд▓рд┐рдП рднреА рд╡рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВред
рдзрдиреНрдпрд╡рд╛рдж!

рд╕рд╛рде рд╣реА, рдмрд╛рдПрдВ | рджрд╛рдПрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рднреА рдкреИрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/codeforamerica/lv-trucks-map (http://clvfoodtrucks.com/ рдкрд░ рд▓рд╛рдЗрд╡ рд╕рд╛рдЗрдЯ) рдкрд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдирдЯреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ L.map рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдореИрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ "рдореВрд▓ рд░реВрдк рд╕реЗ" рдЙрдкрд▓рдмреНрдз рд╣реЛ, рдФрд░ рдЗрд╕реЗ рдореИрдк рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

L.Map.prototype.panToOffset = function (latlng, offset, options) {
    var x = this.latLngToContainerPoint(latlng).x - offset[0]
    var y = this.latLngToContainerPoint(latlng).y - offset[1]
    var point = this.containerPointToLatLng([x, y])
    return this.setView(point, this._zoom, { pan: options })
}

рдпрд╣ panTo() рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде, offset , рдЬреЛ [xOffset, yOffset] рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд░рдгреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдПрдХ setViewOffset() рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рдж, рд▓реЛрд╣!

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрд░реЗ рд▓рд┐рдП рдХреНрд╖реИрддрд┐рдЬ рдСрдлрд╕реЗрдЯ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдлреЛрд░рд╕реНрдХреНрд╡реЗрдпрд░ рд╣реЛрдордкреЗрдЬ рдкрд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред
https://gist.github.com/missinglink/7620340

рдзрдиреНрдпрд╡рд╛рдж @louh!

рдзрдиреНрдпрд╡рд╛рдж @missinglink , рдЖрдкрдХрд╛ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдХреНрдпрд╛ рдЬрд╝реВрдо рдЗрди/рдЖрдЙрдЯ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

        var MapCenterOffsetMixin = {
            getMapOffset: function() {
                console.log('getMapOffset');
                return [$('#left-panel').offset().left, 0];
            },
            getBounds: function(){
                console.log('getBounds');
                var offset = this.getMapOffset(),
                    bounds = this.getPixelBounds(),
                    sw = this.unproject(new L.Point(bounds.min.x + offset[0], bounds.max.y + offset[1]), this._zoom, !0),
                    ne = this.unproject(new L.Point(bounds.max.x, bounds.min.y), this._zoom, !0);

                return new L.LatLngBounds(sw, ne)
            },
            _oldLatLngToNewLayerPoint: L.Map.prototype._latLngToNewLayerPoint,
            _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
                console.log('_latLngToNewLayerPoint');
                var offset = this.getMapOffset(),
                    targetPoint = this.project(newCenter, newCenter).subtract([offset[0] / 2, offset[1] / 2]);
                newCenter = this.unproject(targetPoint, newZoom);

                return this._oldLatLngToNewLayerPoint(latlng, newZoom, newCenter);
            },
            _getCenterLayerPoint: function () {
                console.log('_getCenterLayerPoint');
                var offset = this.getMapOffset();
                return this.containerPointToLayerPoint(this.getSize().divideBy(2).add([offset[0] / 2, offset[1] / 2]));
            },
            _oldResetView: L.Map.prototype._resetView,
            _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
                console.log('_resetView');
                var offset = this.getMapOffset(),
                    targetPoint = this.project(center, zoom).subtract([offset[0] / 2, offset[1] / 2]);
                center = this.unproject(targetPoint, zoom);

                this._oldResetView(center, zoom, preserveMapOffset, afterZoomAnim);
            }
        };
        L.Map.include(MapCenterOffsetMixin);

рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╝реВрдо рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рд╣реИ: https://github.com/Mappy/Leaflet-active-areaред рдмрд╣реБрдд рдЦреВрдм! :)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'map.fitBounds (рд╕реАрдорд╛, topLeftPadding, bottomRightPadding)' рдлрд╝рдВрдХреНрд╢рди, рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рддреЛ рдЬрд╝реВрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВрдЧреЗ рдХрд┐ рдирдХреНрд╢рд╛ рдХрд┐рддрдиреА рджреВрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдХреЛрдИ рдПрдХ рд╕реЗрдЯ рдЖрдХрд╛рд░ рд╕рд╛рдЗрдб-рдмрд╛рд░ рдпрд╛ рд╢реАрд░реНрд╖ рдореЗрдиреВ рд▓рд╛ рд░рд╣рд╛ рд╣реИ, рд╕рдорд╛рдпреЛрдЬрди рдЬрд╝реВрдо рд╕реНрддрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХреЛрдИ рдмрд┐рд▓реНрдЯ-рдЗрди рд▓реАрдлрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмрдЬрд╛рдп рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреИрдбрд┐рдВрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ?

topLeftPadding рдФрд░ bottomRightPadding рдкрд┐рдХреНрд╕рд▓ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди: http://leafletjs.com/reference.html#map -fitboundoptions

рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдорд╛рд░реНрдХрд░ рдХреЛ 15 рдХреЗ рдЬрд╝реВрдо рд╕реНрддрд░ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдпрд╣ рдЖрджреЗрд╢ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ ...
map.fitBounds(pointsArray, {paddingTopLeft: [0,0], paddingBottomRight: [800,0], maxZoom: map.getZoom()});
рдлрд┐рд░ рдореИрдВ рдорд╛рд░реНрдХрд░ рдХреЛ 19 рдХреЗ рдЬрд╝реВрдо рд╕реНрддрд░ рдкрд░ рдкреБрди: рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВред 15 рдХреЗ рд╕реНрддрд░ рдкрд░ рдпрд╣ рд▓рдЧрднрдЧ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдиреА рд░рд╛рд╢рд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, 19 рдХреЗ рд╕реНрддрд░ рдкрд░, рдпрд╣ рд▓рдЧрднрдЧ рдЖрдзреЗ рдкреГрд╖реНрда рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jblarsen picture jblarsen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

piehei picture piehei  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

walterfn2 picture walterfn2  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

timwis picture timwis  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ssured picture ssured  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ