ăŻăă㍠é§
ăĄă˘ďźăăźă ă§ă¨ăłă¸ăă˘ăăăŚăă id:wgg00sh ă§ăă ăăŽč¨äşă§ăŻăé§
ăĄă˘ďźĺ
ă§ĺ°ĺłăŻăŠă¤ă˘ăłăă¨ăăŚä˝żç¨ăăŚăă mapbox-gl-js ă使ăăŤăăăŁăŚĺˇĽĺ¤ŤăăçšăŞăŠăç´šäťăăŚăăăžăă ăâ¨ć°ćŠč˝ăŞăŞăźăšâ¨ă 6/1 12ćé ăăăă˘ăăŞçé§
ăĄă˘ďźăŤăŚăăżă¤ă ăŠă¤ăłă¨ĺ°ĺłăŽĺćżćŠč˝ăăăŞăŞăźăšăăžăăđ ćŹćŠč˝ă§ăŻĺ°ĺłăčŚăŞăăăă§ăăŻă¤ăłăčĄăăăă ĺ°ĺłä¸ă§ăŹăźăăźăŽĺŻžčąĄé§
ăé§
ăŽĺąć§çă確čŞăăăă¨ăă§ăăžăđŞ čŠłç´°ăŻăçĽăăăăă確čŞăă ăă⪠#é§
ăĄă˘ #é§
ăĄă˘10ĺ¨ĺš´ pic.twitter.com/vneZv27AVU — é§
ăĄă˘ďźĺ
Źĺź (@ekimemo) June 1, 2024 é§
ăĄă˘ďźă§ăŻă2024 ĺš´ 6 ćăŤăăăżă¤ă ăŠă¤ăłă¨ĺ°ĺłăŽĺćżćŠč˝ă(䝼é:ăżă¤ă ăŠă¤ăłĺ°ĺłăćŹćŠč˝)ăăŞăŞăźăšăăžăăă ćŹćŠč˝ăŽĺŽçžăŤăăăŁăŚăčŚĺ´ăăçšăăăŽč§Łćąşćšćłăć¸ăăŚăăăžăă ćŹč¨äşă§ćąăĺ
厚 ăăŽč¨äşă§ăŻă丝㍠Mapbox GL JS ăŽäťĽä¸ăŽćŠč˝ăťăăăăăŁăŤé˘ăă芹ăăăžăă icon-allow-overlap , text-allow-overlap icon-ignore-placement , text-ignore-placement symbol-sort-key ćŠč˝ăŽćŚčŚčŞŹć ăŻăăăŤăćŹćŠč˝ăŤă¤ăăŚăŽčŞŹćăăăžăă é常ăŽăżă¤ă ăŠă¤ăł ăżă¤ă ăŠă¤ăłĺ°ĺł é§
ăĄă˘ďźăŻăšăăźăăăŠăłăŽä˝ç˝Žć
ĺ ąăĺĺžăăŚăćĺŻăé§
ăŤă˘ăŻăťăšăăŚéăśă˛ăźă ă§ăăăżă¤ă ăŠă¤ăłĺ°ĺłă§ăŻçťĺĺłĺ´ăŽăăăŤçžĺ¨ĺ°ăĺ¨čžşăŽć
ĺ ąăĺ°ĺłä¸ăŤčĄ¨ç¤şăăŞăăăăŹă¤ăăăă¨ăĺŻč˝ăŤăŞăăžăă ăăăŤăăăĺžćĽăăăç´ćçăŤé§
ăŽć
ĺ ąă確čŞăăŞăăăăŹă¤ăăăă¨ăă§ăăăăăŤăŞăăžăăă ĺŽçžăŤăăăŁăŚç´é˘ăăĺéĄ ăăăăăŻăăăă¤ăćŹćŠč˝ăŽĺŽçžăŤăăăŁăŚčŚĺ´ăăçšăăăŽč§Łćąşçă¨ĺăăăŚčŞŹćăăžăă addLayer() ă使ăŁăŚč¤ć°ăŽçťĺăçľăżĺăăăă˘ă¤ăłăłăćçťăăăĺ ´ĺ äťĺăŽăżă¤ă ăŠă¤ăłĺ°ĺłćŠč˝ă§ăŻăé§
ăĄă˘ďźăŽéăłă§ăăăé§
ăŽĺéăă¨ăé§
ăŽĺăĺăăăŽä¸ĄćšăŤçŚçšăĺăăăŚé§
ăŽć
ĺ ąăćçťăăŚăăžăă ăżă¤ă ăŠă¤ăłĺ°ĺłă§ćçťăăăă˘ă¤ăłăłăŽĺ
厚 ăżă¤ă ăŠă¤ăłĺ°ĺłă§ä˝żç¨ăăŚăăé§
ă˘ă¤ăłăłăŻăăŽăăăŞăăŽă§ăă ăăŽă˘ă¤ăłăłăŽćçťăŤĺż
čŚăŞć
ĺ ąă¨ăăŚă3 ă¤ăŽčŚç´ ăŤĺč§Łăăăă¨ăă§ăăžăă é§
ĺąć§ ă˘ăŻăťăšçśćł é§
ĺ é§
ĺąć§ăŻăă˛ăźă ĺ
ă§é§
ăŽĺăĺăăăăăŤăăăŁăŚĺ˝ąéżăăăăŠăĄăźăżă§ă4 㤠(heatăecoăcool, ăăăłĺťé§
ăŤăŽăżéŠç¨ăăăăĺąć§çĄăă) ăŽăăĄăăăă 1 ă¤ăĺż
ăćăĄăžăă ă˘ăŻăťăšçśćłăŻăăŚăźăśăăăŽé§
ăŤă˘ăŻăťăšăăăăŽçść
ă§ă4 ă¤ďźćŞă˘ăŻăťăšăĺ˝ććŞă˘ăŻăťăšăĺ˝ćă˘ăŻăťăšć¸ăżăĺ˝ćĽă˘ăŻăťăšć¸ăżďźăŽăăăă 1 ă¤ăŽçść
ăŤăŞăăžăă é§
ĺăŻăăăŽĺĺăŽéăé§
ăŤĺ˛ăćŻăăăĺç§°ă§ăä˝ăăăăŽćĺĺăŤăŞăăžăă ă˘ă¤ăłăłăŽćçťććłăŤă¤ă㌠ăăă§čŚĺ´ăăăŽăăă˘ăŻăťăšçśćłă¨é§
ĺąć§ă严ćšĺŤăă˘ă¤ăłăłăćçťăăçšă§ăă Mapbox GL JS ă§ĺ°ĺłä¸ăŽçšĺŽăŽĺş§ć¨ăŤă˘ă¤ăłăłăćçťăăăŤăŻă大ăă 2 ă¤ăŽććłăăăăžăă ăŹă¤ă¤ăźćŠč˝ăç¨ăăŚćçťăăćšćł HTML ăăźăŤăźăĺ°ĺłä¸ăŤé
罎ăăćšćł ćŹćŠč˝ă§ăŻăćçťăăăă˘ă¤ăłăłăŽć°ăŻé常ăŤĺ¤ăăŞăăăăăăHTML ăăźăŤăźăç¨ăăăă¨ă§ăăăŠăźăăłăšăŽćŞĺăć¸ĺżľăăăžăă ăăŽăăăŹă¤ă¤ăźćŠč˝ă§ćçťăăé¸ćč˘ăăăăăžăăă§ăăăăăăăăăŽĺ ´ĺćçťă§ăăĺ
厚ăŤĺ¤§ăăŞĺśç´ăăăăăžăă symbol ăŹă¤ă¤ăźă襨示ă§ăăĺ
厚 ĺčż°ăŽăŞăłăŻĺ
ăŤč¨čźăăăŚăăžăăă symbol ăŹă¤ă¤ăźă§ăŻĺä¸ăŹă¤ă¤ăźăŽĺčŚç´ ăŤĺŻžăăŚăă1 ă¤ăŽćĺĺăă¨ă1 ă¤ăŽçťĺăăçľăżĺăăăŚćçťăăžăăďźćĺĺăçťĺčŞä˝ăŻăăăăăŁăĺç
§ă§ăăăŽă§čŚç´ ăă¨ăŤç°ăŞăăăźăżă渥ăăžăďź symbol ăŹă¤ă¤ăźăç¨ăăŚăăźăżăćçťăăĺ ´ĺăŽăľăłăăŤăŻä¸č¨ăŽăăăŤăŞăăžăă map . addLayer ({ id : "stations" , source : "stations" , type : "symbol" , layout : { "text-field" : "{name}" , // é§
ĺ "icon-image" : [ "get" , "icon-key" ] , // çťĺ } , }) 1 ă¤ăŽă˘ă¤ăłăłăŤăŻ 1 ă¤ăŽçťĺăžă§ăăĺŠç¨ăăăă¨ăă§ăăžăăă ăăŽăăăé§
ĺąć§ăťă˘ăŻăťăšçśćłăăăăăŤĺŻžĺżăăçťĺăç¨ćăăăăă 2 ă¤ăŽçťĺăŽçľăżĺăăăç¨ă㌠1 ă¤ăŽă˘ă¤ăłăłăćçťăăăă¨ăăŁăăă¨ăŻă§ăăžăăă§ăăă ăăŽĺéĄăč§ŁćąşăăçşăŤăäťĺ 2 ă¤ăŽćĄă芌ăăžăăă ćĄ 1: ăŹă¤ă¤ăźă 2 ă¤ç¨ćăă ćĄ 2: 2 ă¤ăŽçťĺăçľăżĺăăăĺä¸ăŽçťĺăăăăăăç¨ćăăŚăă ćĄ 1: ăŹă¤ă¤ăźă 2 ă¤ç¨ćăă é§
ĺąć§çťĺă¨ă˘ăŻăťăšçśćłçťĺăăăăăç¨ćďź4+4=8 税ďźăăŚă2 ă¤ăŽăŹă¤ă¤ăźă§ăăăăćçťăăŚăżăžăă map . addLayer ({ id : "stations" , source : "stations" , type : "symbol" , layout : { "icon-anchor" : "center" , "icon-image" : [ "get" , "element" ] , "icon-size" : 0 . 5 , "icon-offset" : [ 0 , -60 ] , // é§
ĺ "text-field" : "{name}" , "text-anchor" : "top" , "text-offset" : [ 0 , 0 . 5 ] , } , }) map . addLayer ({ id : "stations2" , source : "stations" , type : "symbol" , layout : { "icon-anchor" : "center" , "icon-image" : [ "get" , "status" ] , "icon-size" : 0 . 5 , "icon-offset" : [ 0 , -15 ] , "symbol-sort-key" : [ "get" , "sort-key" ] , } , }) ăăŽăăăŤăăťă¨ăăŠăŽĺ ´ćă§ćŁăă襨示ăăăŞăăŞăŁăŚăăžăăžăă é常ăMapbox GL JS ㎠symbol ăŹă¤ă¤ăźăŻ,ă˘ă¤ăłăłăťăăăšăĺ壍ăŤĺŻžăăŚčĄçŞć¤ĺşăčĄăăéăŞăŁăŚăăă°ä¸ćšăćçťăăŞăăăăŤăăžăă ăăăŻă icon-allow-overlap ă text-allow-overlap ăăăăăăăăŠăŤăă§ false ăŤăŞăŁăŚăăăăă§ăă (ĺč: https://docs.mapbox.com/help/troubleshooting/optimize-map-label-placement/) ăăŽćŠč˝ăŽăăăă§ăćçťăăšăă˘ă¤ăłăłăč¨ĺ¤§ăŞĺ ´ĺăŤăéŠĺăŞčŚăăăăäżă¤ăă¨ăă§ăăćçťč˛ čˇăćăăăăžăă ăăŽäťçľăżăçĄĺšăŤăăăŤăŻăăăăăăŽăŹă¤ă¤ăźăŤ icon-ignore-placement: true , text-ignore-placement: true ăäťä¸ăăžăă map . addLayer ({ id : "stations" , source : "stations" , type : "symbol" , layout : { // äťăŽč¨ĺŽ "icon-ignore-placement" : true , "text-ignore-placement" : true , } , }) map . addLayer ({ id : "stations2" , source : "stations" , type : "symbol" , layout : { // äťăŽč¨ĺŽ "icon-ignore-placement" : true , "text-ignore-placement" : true , } , }) é常ăŤčŚăĽăăăŞăŁăŚăăžăŁăŚăăžăăžăăă ăăăŻă icon-ignore-placement ă text-ignore-placement ăäťä¸ăăăă¨ă§ăĺăé§
ăŽĺąć§ăťă˘ăŻăťăšçśćłăŻéăăŚćçťă§ăăăăăŤăŞăŁăăăŽăŽăäťăŽé§
ă¨ăŽéăŞăăçĄčŚăăăăăăŤăŞăŁăŚăăžăŁăăăă§ăă é§
ć°ăĺ°ăŞăĺ°ĺă§ăŻăé§
ĺ壍ăĺŻćĽăăăă¨ăŻăŞăăăă§ăĺéĄăŞăăăăăăžăăăăé˝ĺżé¨ă§ăŻçťĺăŽă¨ăăăŤä¸ćăćçťă§ăăžăăă ăăŽăăăăăŽă˘ăăăźăăŻä¸ĺĺă¨ĺ¤ćăăžăăă ćĄ 2: 2 ă¤ăŽçťĺăçľăżĺăăăĺä¸ăŽçťĺăăăăăăç¨ćăăŚăă ăăä¸ćšăŽă˘ăăăźăăŻăăăăăă 2 ă¤ăŽçťĺăçľăżĺăă㌠1 ă¤ăŽçťĺă¨ăăŚć¸ăĺşăăŚăăăăŽă§ăă cool ăă¤ăă˘ăŻăťăšć¸ăż heat ăă¤ăäťććŞă˘ăŻăťăš ĺąć§çĄăăă¤ăćŹćĽćŞă˘ăŻăťăš ăăŽăăăŤă ĺąć§4税 x ă˘ăŻăťăšçśćł4税 = 16税 ăŽçťĺăăăăăăä˝ćăăŚăăăžăă type Station = { name : string lat : number lng : number element : string status : string } [ "heat" , "cool" , "eco" , "none" ] . forEach (( element ) => { [ "unaccessed" , "unaccessed_month" , "unaccessed_today" , "accessed_today" , ] . forEach (( status ) => { map.loadImage( `/img/station_element/ ${ element } _ ${ status } .png` , ( error , image ) => { if (error || !image) { console .error( "Failed to load image" , error) return } map.addImage( ` ${ element } _ ${ status } ` , image) } ) } ) } ) const getIconKey = ( station ) => { return ` ${ station.element } _ ${ station. status} ` } map.addSource( "stations" , { type : "geojson" , data : { type : "FeatureCollection" , features : stations. map (( station : Station , index ) => { return { type : "Feature" , geometry : { type : "Point" , coordinates : [ station.lng, station.lat ] , } , properties : { name : station. name , "icon-key" : getIconKey(station), } , } } ), } , } ) map.addLayer( { id : "stations" , source : "stations" , type : "symbol" , layout : { "icon-anchor" : "center" , "icon-image" : [ "get" , "icon-key" ] , "icon-size" : 0.5 , "icon-offset" : [ 0 , - 30 ] , "text-field" : "{name}" , "text-max-width" : 10 , "text-size" : 14 , "text-anchor" : "top" , "text-offset" : [ 0 , 0.5 ] , } , } ) ăăŽăăăŤăăăă¨ă§ăéĺźăăŤă寞ĺżăăŚč¤ć°çťĺăçľăżĺăăăă˘ă¤ăłăłăćçťăăăă¨ăă§ăăžăăă ćĄ 2 ăŽć¸ĺżľçš äťĺăŽăąăźăšă§ăŻăĺĺ¨ăăçťĺăŽçľăżĺăăăă16 éăă¨ĺ¤ăăŻăŞăăăĺ
¨ăŚäşăä˝ćăăŚăă形ă§ĺŻžĺŚăăžăăăăăąăźăšăŤăăŁăŚăŻăăăéŁăăĺ ´ĺăăăăăăăăžăăă äžăă°ăăă㍠4 éăăŽăăŠăĄăźăżă 1 ă¤ăť2 ă¤ă¨ĺ˘ăăă°ĺ
¨é¨ă§ 64 éăăť256 éăă¨ăŞăăçťĺăŽçćăčŞĺĺă§ăăŞăĺ ´ĺăŻä˝ćăŤćăăä˝ćĽăłăšăă大ăăăĺ
¨ăŚ loadImage() ă§äżćăăĺ ´ĺăĄă˘ăŞăŽĺ§čżŤăĺżé
ăŤăŞăŁăŚăăžăă ăăŽĺ ´ĺăč§Łćąşçă¨ăăŚăŻ ĺŽéăŤä˝żăăăçľăżĺăăăŽăżčŞăżčžźă çťĺăŽä˝ćăĺŽčĄćăŤĺçăŤčĄă ă¨ăăŁă塼复ăĺż
čŚăŤăŞăŁăŚăăă¨ćăăăžăă äťĺăŻçťĺăŽć°ăĺ°ć°ăă¤äşăćąşăžăŁăŚăăăăăĺ
¨ăăżăźăłăä˝ćăăćšćłăćĄăăžăăă é§
ăĺŻéăăŚăăĺ ´ĺăŤăĺŞĺ
ăăŚćçťăăăé§
ăćĺŽăăă Mapbox GL JS ă§ăŻăé§
ăĺŻéăăŚăăă¨ă˘ă¤ăłăłăŽćçťăăăç¨ĺşŚčŞĺçăŤéĺźăăăă¨ăă芹ăĺ
ăŤăăžăăă ăżă¤ă ăŠă¤ăłĺ°ĺłćŠč˝ă§ăŻăăŠă¤ăăŠăŞăŽăăăŠăŤăăŽĺŞĺ
庌ă§ăŻăŞăăăŚăźăśăŽăăŹă¤çśćłăŤĺżăăŚĺŞĺ
çăŤćçťăăé§
ăé¸ćăăŚăăžăă ĺ
ˇä˝çăŤăŻăăŚăźăśăŽçžĺ¨ĺ°äťčżăŽé§
ăă大čŚć¨ĄăŞé§
ăŞăŠăŻéĺźăăăĽăăăŞăăăăŤăăŚăăžăă äžă¨ăăŚăăĺąąćçˇăŽĺé§
ăĺŞĺ
ăăŚéĺźăăťéĺźăăŞăăă¨ăă 2 ă¤ăŽćĄäťśă§ăĺăćçťçŻĺ˛ăŽçťé˘ăç¨ćăăŚăżăžăăă ĺąąćçˇăăŞăăšăéĺźă ĺąąćçˇăĺŞĺ
ăăŚćŽă ĺžč
ăŤăŻăćąäşŹăťĺĺˇăťćą č˘ăŞăŠă丝čŚăŞé§
ăéĺźăăăăŤćŽăŁăŚăăăă¨ăăăăă¨ćăăžăă const TARGET_STATION_IDS: number [] = [ xxx, yyy, ... ] // ĺąąćçˇăŽĺé§
ăŽID map.addSource( 'stations' , { type : 'geojson' , data : { type : 'FeatureCollection' , features : stations. map (( station : Station , index ) => { return { type : 'Feature' , geometry : { type : 'Point' , coordinates : [ station.lng, station.lat ] } , properties : { 'sort-key' : TARGET_STATION_IDS. includes (station. id ) ? 0 : 1 , } } ; } ) } } ); map.addLayer( { id : 'stations' , source : 'stations' , type : 'symbol' , layout : { 'symbol-sort-key' : [ 'get' , 'sort-key' ] , } , } ); ĺŽéăŽé§
ăĄă˘ďźĺ
ă§ăŻăăăŽăłăźăăŽăăăŤçšĺŽăŽé§
ă ăĺŞĺ
庌ăä¸ăă形ă§ăŻăŞăăăŚăźăśăŽăăŹă¤çśćłăŤĺżăăŚč¤ć°ăŽčŚłçšăăĺŞĺ
庌ăćąşĺŽăăŚăăžăă ăăă㍠ăżă¤ă ăŠă¤ăłĺ°ĺłćŠč˝ăŽĺŽčŁ
ăŤăăăŁăŚăćçťĺ¨ăă§ăŽĺˇĽĺ¤Ťăç´šäťăăžăăă ćçťĺ
厚ăťé ĺşă塼复ăăăă¨ă§ăăŚăźăśăŤă¨ăŁăŚčŚăăăĺ°ĺłăćäžăăăă¨ăă§ăăžăăă äťĺăŽéçşăéăăŚăMapbox GL JS ăŤăăăŞćŠč˝ăăăŁăăŽăă¨ĺŚăłăăăĺ¤ăă塼复揥珏ă§ăăžăăžăŞčĄ¨çžăĺŻč˝ă§ăăăă¨ăĺŽćăăžăăă ĺč Mapbox GL JS symbol Mapbox GL JS ă§ăŤăšăżă ăăźăŤăźăčż˝ĺ ăă Optimize map label placement