Angular-google-maps: ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” FitBounds

์— ๋งŒ๋“  2016๋…„ 10์›” 23์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: SebastianM/angular-google-maps

@SebastianM ๋ฌธ์„œ์— ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๊ณ„๋ฅผ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

import {MapsAPILoader} from 'angular2-google-maps/core';

 constructor(private mapsAPILoader: MapsAPILoader) {
        this.mapsAPILoader.load().then(() => {
                **this.latlngBounds = new window['google'].maps.LatLngBounds();**
                this.measurement.locations.forEach((location) => {
                    this.latlngBounds.extend(new window['google'].maps.LatLng(location.lat, location.lng))
                })
            }
        )
)
            <sebm-google-map
                    [latitude]="lat"
                    [longitude]="lng"
                    [zoomControl]="false"
                    [disableDefaultUI]="true"
                    [streetViewControl]="false"
                    [mapDraggable]="false"
                    **[fitBounds]="latlngBounds"**
                    [scrollwheel]="false">
                <sebm-google-map-marker
                        *ngFor="let location of measurement.locations"
                        [latitude]="location.lat"
                        [longitude]="location.lng">
                </sebm-google-map-marker>
            </sebm-google-map>

๋ชจ๋“  21 ๋Œ“๊ธ€

์ด fitbound ๊ธฐ๋Šฅ๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ปค์—์„œ ๊ฒฝ๊ณ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” angular 2 ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  sebm-google-map-marker์˜ fitBounds ์†์„ฑ์„ ๋‚ด bounds ๋ณ€์ˆ˜์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก bound.exists ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  LatLng ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ํ‰์ƒ ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
@suleymanozev -- LatLng ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ fitbounds๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ๊ป˜ ์ž‘์—…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์žฅ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ์ž‘์—…์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„œ์ชฝ, ๋™์ชฝ, ๋ถ์ชฝ ๋ฐ ๋‚จ์ชฝ ์‚ฌ์ด์˜ ํ‰๊ท ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ค‘์‹ฌ์ ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์‹ฌ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•๋Œ€/์ถ•์†Œ ์ˆ˜์ค€์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

west = devicedata[0].Long;
east = devicedata[0].Long;
north = devicedata[0].Lat;
south = devicedata[0].Lat;
for(let dev of this.devicedata) {
if(west > dev.Long){
west = dev.Long
}
if(east < dev.Long){
east = dev.Long
}
if( north < dev.Lat){
north = dev.Lat
}
if( south > dev.Lat){
south = dev.Lat
}
}
this.center.lat = (north + south)/2;
this.center.lng = (east + west)/2;

์—…๋ฐ์ดํŠธ
LatLngBoundsLiteral์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ๊ณ„์‚ฐ๋œ ๋™์ชฝ, ์„œ์ชฝ, ๋ถ์ชฝ, ๋‚จ์ชฝ์„ ์ง์ ‘ ๋งคํ•‘ํ–ˆ์œผ๋ฉฐ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var offset = 0.25;
this.boundsl = <LatLngBoundsLiteral>{west: west - offset, north: north + offset, south: south - offset, east: east + offset};

๊ทธ๋Ÿฐ ๋‹ค์Œ HTML ์ฝ”๋“œ
<sebm-google-map #mygmap [latitude]="center.lat" [longitude]="center.lng" usePanning="true" [fitBounds]="boundsl">

๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LatLngBounds๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { MapsAPILoader } from 'angular2-google-maps/core';
constructor(private mapsAPILoader:MapsAPILoader) {}
this.mapsAPILoader.load().then(() => {let latlngbounds = new google.maps.LatLngBounds();})

์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ด ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— google.maps ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— angular2-google-maps์˜ MapsApiLoader์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, @SebastianM์—์„œ ์ด ์ปค๋ฐ‹์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. https://github.com/SebastianM/angular2-google-maps/commit/d625ab6796768d167d7a0f9f2b9a504fce8a2bea
๊ทธ๊ฐ€ ์ด๋ฏธ fitbounds ์†์„ฑ์„ ์ œ๊ฑฐํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

AngularJS์—์„œ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฒฝ๊ณ„๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๊ฒฝ๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘์‹ฌ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•๋Œ€/์ถ•์†Œ ์ˆ˜์ค€๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

generateBounds(markers): any {
        if (markers && markers.length > 0) {
            var bounds = new google.maps.LatLngBounds();

            markers.forEach((marker: any) => {
                bounds.extend(new google.maps.LatLng({ lat: marker.latitude, lng: marker.longitude }));
            });

            //check if there is only one marker
            if (bounds.getNorthEast().equals(bounds.getSouthWest())) {
                var extendPoint = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01);
                bounds.extend(extendPoint);
            }

            return {
                northeast: {
                    latitude: bounds.getNorthEast().lat(),
                    longitude: bounds.getNorthEast().lng()
                },
                southwest: {
                    latitude: bounds.getSouthWest().lat(),
                    longitude: bounds.getSouthWest().lng()
                }
            }
        }
        //return empty object when no bundle selected
        return {};
    }
this.bounds = this.generateBounds(this.bundleMarkers)
this.lat = (this.bounds.northeast.latitude + this.bounds.southwest.latitude) / 2;
this.lng = (this.bounds.northeast.longitude + this.bounds.southwest.longitude) / 2;
<sebm-google-map [latitude]="lat" [longitude]="lng">        
    <sebm-google-map-marker 
        *ngFor="let marker of bundleMarkers"
        [latitude]="marker.latitude"
        [longitude]="marker.longitude"
        [label]="marker.label"
        [title]="marker.title">
    </sebm-google-map-marker>
</sebm-google-map>

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด lib๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋งˆ์ปค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€๋„๋ฅผ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...
๋งˆ์ปค๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋งˆ์ปค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€๋„๋ฅผ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

getCenterMarkers(): ๋ฌดํšจ{

    let lat: number = 0;
    let lng: number = 0;

    this.markers.forEach(marker => {
        lat += marker.lat;
        lng += marker.lng;
    });

    this.center.lat = lat/this.markers.length;
    this.center.lng = lng/this.markers.length;
}

@VinceEeckhout ์ด๊ฒŒ ์™œ ์ด๋ ‡๊ฒŒ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์ดํ•ด๊ฐ€

์ค‘์‹ฌ์„ ์žก๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ 'ํ™•๋Œ€' ์ˆ˜์ค€์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด LatBounds๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์ด๋ฉฐ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import {MapsAPILoader} from 'angular2-google-maps/core';

 constructor(private mapsAPILoader: MapsAPILoader) {
        this.mapsAPILoader.load().then(() => {
                **this.latlngBounds = new window['google'].maps.LatLngBounds();**
                this.measurement.locations.forEach((location) => {
                    this.latlngBounds.extend(new window['google'].maps.LatLng(location.lat, location.lng))
                })
            }
        )
)
            <sebm-google-map
                    [latitude]="lat"
                    [longitude]="lng"
                    [zoomControl]="false"
                    [disableDefaultUI]="true"
                    [streetViewControl]="false"
                    [mapDraggable]="false"
                    **[fitBounds]="latlngBounds"**
                    [scrollwheel]="false">
                <sebm-google-map-marker
                        *ngFor="let location of measurement.locations"
                        [latitude]="location.lat"
                        [longitude]="location.lng">
                </sebm-google-map-marker>
            </sebm-google-map>

@trungk18 ์ง€๋„ ์ค‘์•™์— ์žˆ๋Š” ๋ชจ๋“  ๋งˆ์ปค๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ์ถ•์†Œ ๋˜๋Š” ํ™•๋Œ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@Jonatthu ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์œ„์˜ generateBounds ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด

@trungk18 ์˜ˆ, ์ž‘๋™ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ์šฉํ•œ ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

@tscislo ์ƒ์„ฑ์ž๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
ILocation์€ ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ธก์ • ์œ ํ˜•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
@angular/common์—์„œ๋งŒ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Jonatthu ๋Š” sebm ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณด๋ฉด 'scrollwheel=false'๋ผ๊ณ  ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•๋Œ€ํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐ latbounds ์ดํ›„์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด latlngbounds๋ฅผ ์žฌ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ™•๋Œ€/์ถ•์†Œ ์ˆ˜์ค€์„ ๋‹ค์‹œ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@tscislo ๋Š” ๊ทธ๊ฒƒ์„ ์ž˜ํ–ˆ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ๋‹ค:

import { MapsAPILoader } from 'angular2-google-maps/core';

latlngBounds;

    constructor(
        ...
        private mapsAPILoader: MapsAPILoader
    ) { };


    this.mapsAPILoader.load().then(() => {
                    this.latlngBounds = new window['google'].maps.LatLngBounds();
                    this.markers.forEach((location) => {
                        this.latlngBounds.extend(new window['google'].maps.LatLng(location.lat, location.lng))
                    })
                });



md5-3b89998d3378d7952a828cbdec3a9606




 <sebm-google-map [latitude]="lat" [longitude]="lng" [zoom]="zoom" [disableDefaultUI]="false" [zoomControl]="false" (mapClick)="mapClicked($event)" [streetViewControl]="false" [fitBounds]="latlngBounds" class="content-map"> </sebm-google-map>

@Ccanny ์ง€๋„์— ์˜คํ”„์…‹์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@VinceEeckhout
๋‚ด ์˜ˆ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ง€์ • ILocation ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@tscislo ๋„์›€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘
@Ccanny ๋„์›€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

@Ccanny๋‹˜ ๊ณผ @tscislo๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”. Observable ์—์„œ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. params๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•œ ํ›„(์žฅ์†Œ ๋ชฉ๋ก์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง) this.marker๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
NgZone์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ฝ”๋“œ์—์„œ Ngzone์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‹ซํ˜”๋Š”์ง€, ๋ฌธ์„œ๋Š” ์•„์ง API ๋ฌธ์„œ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@tscislo ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ์–ด๋””์—

@samtidbit 1์›” 23์ผ ๋‚ด ์˜๊ฒฌ ์–‘์‹์„ ๋ด์ฃผ์„ธ์š”

์˜ˆ, ๋‹ค๋ฅธ ์ˆ˜์ž…ํ’ˆ์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ํ•ดํ‚น์ด ์•„๋‹Œ ์‹ค์ œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@tscislo , ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ณด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰