mobile background

2021

2nd LIVE, 세컨드 라이브

COLLECTIVE ENVIRONMENT ACTION

[ 2021. 이타 프로젝트는 집단지성과 새로운 라이프스타일을 통한 환경미션의 대중화를 추구합니다. ]

본 워크샵에서는 서울시 영등포구 지역의 재활용품 수거장소 현황 데이터를 기반으로, 데이터 읽기를 학습합니다. 


데이터 가져오기

<서울특별시 영등포구_재활용품 수거장소 현황> CSV 파일 데이터를 다운 받습니다.  본 자료는 서울특별시 영등포구 병류, 캔, 고철, 플라스틱, 비닐류, 종이팩등 재활용이 가능한 물품을 수거하는 위치정보를 기록한 데이터시트 입니다. 


인덱스 정보는 시도명, 시군구명, 행정동명, 도로명주소, 운영요일, 운영일시, 취급목록 으로 이루어져 있습니다. 






파일 다운로드

서울특별시 영등포구_재활용품 수거장소 현황_20201221


공공데이터 활용방법

공공데이터활용지원센터는 공공데이터포털에 개방되는 3단계 이상의 오픈 포맷 파일데이터를 오픈 API(RestAPI 기반의 JSON/XML)로 자동변환하여 제공한다. 

1. 파일데이터는 로그인 없이 다운로드를 통해 이용하실 수 있습니다. 

2. 오픈 API를 활용하기 위해서는 공공데이터포털 회원 가입 및 활용신청이 필요하며, 일부 자료의 활용 관련 문의는 공공데이터활용지원센터로 연락하여 상담 가능합니다.




투명페트병을 별도로 배출한다. 

2020.12.25 일부터 「재활용가능자원의 분리수거 등에 관한 지침」(2020.8.24. 일부개정) 에 따라 전국 공동주택 대상 단위로 플라스틱류로 일괄배출하던 투명페트병을 별도 수거함에 별도로 배출하는 개정안을 시행했다.  

210409_records_데이터셋

210409 8:00 1차

image-20210409084056660

 

<textarea spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
xxxxxxxxxx


















<script>
  let catchpt;
  let catchpt_who;
  let catchpt_geo;
  let rundata;
  function fc_catchpt_geo(e) {
    return e.reduce(function (pre, value) {
      pre.push([value.lat, value.lng]);
      return pre;
    }, []);
    console.log("2done")
  }
  function runRecord(data) {
    let runArr = {};
    for (var i = 0; i < data.length; i++) {
      d = data[i];
      //   var jupsum = d.reduce(function (pre, value) {
      //   return pre + Number(value.numb);
      // }, 0);
      // if (!runArr[d["who"]]) {
      if (runArr[d.who] === undefined) {
        runArr[d.who] = {};
      }
      if (runArr[d.who][d.clearnum] === undefined) {
        runArr[d.who][d.clearnum] = [];
      }
      if (runArr[d.who][d.clearnum].run === undefined) {
        runArr[d.who][d.clearnum].run = [];
      }
      runArr[d.who][d.clearnum].run.push({
        "clearnum": d.clearnum,
        "types": d.types,
        "jupnum": d.numb,
        "routes": [d.lat, d.lng],
        "mTime": d.mTime,
        "mDate": d.mDate,
        "clock": d.clock,
        "event": d.event
      })
    }
    for (key1 in runArr) {
      for (key2 in runArr[key1]) {
        var jupsum = 0;
        var dislap = 0;
        var startTime, EndTime;
        var runs = runArr[key1][key2].run
        for (var i = 0; i < runs.length; i++) {
          // runs.length = 5  0,1,2,3,4
          jupsum += Number(runs[i].jupnum);
          startTime = FormatTime(runs[0].clock);
          endTime = FormatTime(runs[runs.length - 1].clock);
          lapTime = FormatTime(Number(runs[runs.length - 1].clock) - Number(runs[0].clock));
          // console.log("loop", i)
          if (i > 0) {
            // console.log("dis_loop", i)
            dislap += Number(disGPS3(runs[i].routes[0], runs[i].routes[1], runs[i - 1].routes[0], runs[i - 1].routes[
              1]));
            // console.log("runs[i].routes,runs[i-1].routes------", dislap1, dislap2, dislap3)
          }
          // jupsum //////////////
          // console.log("-----key2",jupsum, lapTime, dislap)
        }
        runArr[key1][key2].jupsum = jupsum
        runArr[key1][key2].startTime = startTime
        runArr[key1][key2].endTime = endTime
        runArr[key1][key2].lapTime = lapTime
        runArr[key1][key2].dislap = dislap
        console.log("key1------", key1)
      }
    }
    return runArr
  };
  // general fuc 
  function groupBy(xs, key) {
    return xs.reduce(function (rv, x) {
      var v = key instanceof Function ? key(x) : x[key];
      (rv[v] = rv[v] || []).push(x);
      return rv;
    }, {});
  };
  ReadData_mclear_points()
  function ReadData_mclear_points() {
    $('.wrap-loading').show();
    var data_read; //미리 함수에 data_read 로 변수를 두고, ajax 처리 후 success시 변수에 담아서 return 시키기
    $.ajax({
      url: "crud/read_mclear_JS.php",
      dataType: "json",
      async: false,
      success: function (data) {
        $('.wrap-loading').fadeOut();
        catchpt = data; //  
        console.log("초기 get obj arr 완료") //  
        catchpt_who = groupBy(catchpt, 'who');
        console.log("1. who로 정렬된 데이터 mclear셋 완료") //  
        rundata = runRecord(catchpt);
        console.log("2. who로 정렬된 데이터 record셋 완료", rundata) //  
        catchpt_geo = fc_catchpt_geo(catchpt);
        console.log("3.모든 포인트 > 맵에 사용 완료")
        naverMapping(catchpt_geo);
      },
      error: function (e) {
        alert("값을 가져오지 못했습니다.");
      }
    });
    // return data;
  }
  function cs(x) {
    console.log(x);
  }
  // original  외부 함수표현식으로 변수return 받음//////////////////////////
  // var catchpt = ReadData_mclear_points();
  // var catchpt_who = groupBy(catchpt, 'who');
  // var catchpt_geo = catchpt.reduce(function (pre, value) {
  //   pre.push([value.lat, value.lng]);
  //   return pre;
  // }, []);
  // console.log("catchpt", catchpt, catchpt_who, catchpt_geo)
</script>






우아~~~

21.04.09.09:00

 

 

update

위계

alljupsum - jupsum - jupnum

alljuptime - juptime 

alljupdis - jupdis

 

 

 


image-20210409235427669

함수 내부에서 var 를 안쓰면 글로벌 변수가 되어버린다. 

image-20210409235521494

 

 

ver 2

<textarea spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
xxxxxxxxxx


















// plog Record data-fetching 
// 모든 store 개념의 글로벌 변수를 먼저 db fetch 한다. 
// ajax fetch 이후 success 내부에 함수형으로 프로세스를 실행한다. 
// global data store 
let catchpt; // plog 데이터 mclear db 
let catchpt_who; // who 정렬
let catchpt_geo; // geo points array
let rundata; // who-clearnum 정렬 
function fc_catchpt_geo(e) {
  return e.reduce(function (pre, value) {
    pre.push([value.lat, value.lng]);
    return pre;
  }, []);
  // console.log("2done")
}
function runRecord(data) {
  let runArr = {};
  for (var i = 0; i < data.length; i++) {
    d = data[i];
    if (runArr[d.who] === undefined) {
      runArr[d.who] = {};
    }
    if (runArr[d.who][d.clearnum] === undefined) {
      runArr[d.who][d.clearnum] = [];
    }
    if (runArr[d.who][d.clearnum].run === undefined) {
      runArr[d.who][d.clearnum].run = [];
    }
    if (runArr[d.who][d.clearnum].routes === undefined) {
      runArr[d.who][d.clearnum].routes = [];
    }
    // runArr[key1][key2].pics = pics;
    runArr[d.who][d.clearnum].routes.push([d.lat, d.lng]);
    runArr[d.who][d.clearnum].run.push({
      "who": d.who,
      "clearnum": d.clearnum,
      "types": d.types,
      "jupnum": d.numb,
      "point": [d.lat, d.lng],
      "mTime": d.mTime,
      "mDate": d.mDate,
      "clock": d.clock,
      "event": d.event
    })
  }
  for (key1 in runArr) {
    for (key2 in runArr[key1]) {
      var jupsum = 0;
      var dislap = 0;
      var starttime, endtime;
      var runs = runArr[key1][key2].run
      for (var i = 0; i < runs.length; i++) {
        // runs.length = 5  0,1,2,3,4
        jupsum += Number(runs[i].jupnum);
        starttime = FormatTime(runs[0].clock);
        endtime = FormatTime(runs[runs.length - 1].clock);
        timelap = FormatTime(Number(runs[runs.length - 1].clock) - Number(runs[0].clock));
        // console.log("loop", i)
        if (i > 0) {
          // console.log("dis_loop", i)
          dislap += Number(disGPS3(runs[i].point[0], runs[i].point[1], runs[i - 1].point[0], runs[i - 1].point[
            1]));
          // console.log("runs[i].point,runs[i-1].point------", dislap1, dislap2, dislap3)
        }
        // jupsum //////////////
        // console.log("-----key2",jupsum, timelap, dislap)
      }
      runArr[key1][key2].jupsum = jupsum;
      runArr[key1][key2].starttime = starttime;
      runArr[key1][key2].endtime = endtime;
      runArr[key1][key2].timelap = timelap;
      runArr[key1][key2].dislap = dislap;
      console.log("key1------", key1)
    }
  }
  return runArr
};
// general fuc 
function groupBy(xs, key) {
  return xs.reduce(function (rv, x) {
    var v = key instanceof Function ? key(x) : x[key];
    (rv[v] = rv[v] || []).push(x);
    return rv;
  }, {});
};
function ReadData_mclear_points() {
  $('.wrap-loading').show();
  $.ajax({
    url: "crud/read_mclear_JS.php",
    dataType: "json",
    async: false,
    success: function (data) {
      $('.wrap-loading').fadeOut();
      catchpt = data; //  
      console.log("초기 get obj arr 완료") // 
      catchpt_who = groupBy(catchpt, 'who');
      console.log("1. who로 정렬된 데이터 mclear셋 완료") //  
      rundata = runRecord(catchpt);
      console.log("2. who로 정렬된 데이터 record셋 완료", rundata)
      stat_RecordBoard(rundata);
      console.log("0. 대쉬보드 메인 기록")
      recordGraph(catchpt_who[m_user])
      console.log("r1. 오염물 분석 기록")
      catchpt_geo = fc_catchpt_geo(catchpt);
      console.log("3.모든 포인트 > 맵에 사용 완료")
      naverMapping(catchpt_geo);
      renderRecord(catchpt_who[m_user])
    },
    error: function (e) {
      alert("값을 가져오지 못했습니다.");
    }
  });
  // return data;
}
function renderRecord(data) {
  if (data.length) {
    $('.jubtotal').text(data.length)
  } else {
    $('.jubtotal').text(0);
  }
}
$(document).ready(function () {
  ReadData_mclear_points();
});
function cs(x) {
  console.log(x);
}






 

서울특별시 양천구_재활용품_월별발생량_20201014 


 

서울특별시 양천구_재활용품_월별발생량(CSV )


양천구 재활용품 월별 발생량
- 종이류, 필름류, 플라스틱(페트, 혼합)
- 금속캔선별량(혼합)
- 유리별 선별량(잡병)
- 스티로폼, 기타, 잔재물









. 'PETE BOTTLE`' , 한정된 소재,

 생명 이후의 새 생명으로 재 탄생시켜준다는 콘셉

2nd Bottle 은 음료를 마신 다음 버리는 것이 아니라, 상황에 맞춰 뚜껑만 교체해주면 된다. 

재활용은 물론 재미와 실용성까지 가미되어, 페트병이 실생활 곳곳에서 보이면서 기업의 간접 홍보도 가능해진다.