2016-11-04 1 views
0

Nodejs, 전단지 및 PostGIS를 사용하여 새 매핑 프로젝트 작업. 이 시점에서 Postgis의 영업 담당자 영역과 함께지도 타일 레이어를로드하고 표시 할 수 있습니다. 이제 Postgresql에 저장되어있는 모든 미국 카운티를 표시하는 다른 레이어를 추가하려고합니다. 따로 따로 사용할 때 Postgis 쿼리가 실행되고 표시되지만로드와 함께 표시 할 수는 없습니다.PostGIS 쿼리의 다중 레이어가있는 NodeJS 전단지

router.get('/map', function(req, res) { 
var client = new pg.Client(conString); // Setup our Postgres Client 
client.connect(); // connect to the client 
var query = client.query(zone_query); // Run our Query 
query.on("row", function (row, result) { 
    result.addRow(row); 
}); 
// Pass the result to the map page 
query.on("end", function (result) { 
    var data = result.rows[0].row_to_json; // Save the JSON as variable data 
    res.render('map', { 
     title: "Express API", // Give a title to our page 
     zoneData: data // Pass data to the View 
    }); 
}); 
}); 

router.get('/map', function(req, res) { 
var client = new pg.Client(conString); // Setup our Postgres Client 
client.connect(); // connect to the client 
var query = client.query(counties_query); // Run our Query 
query.on("row", function (row, result) { 
    result.addRow(row); 
}); 
// Pass the result to the map page 
query.on("end", function (result) { 
    var data2 = result.rows[0].row_to_json; // Save the JSON as variable data 
    res.render('map', { 
     title: "Express API", // Give a title to our page 
     countyData: data2 // Pass data to the View 
    }); 
}); 
}); 

그리고 '보기/map.pug'에서 :

script("text/javascript"). 
    $(document).ready(function(){ 
     var myData = !{JSON.stringify(zoneData)}; 
     var cntyData = !{JSON.stringify(countyData)}; 
     // Create variable to hold map element, give initial settings to map 
     var map = L.map('map',{ 
      center: [39.7799642, -86.2728367], 
      zoom: 6, 
      //layers: [zones, counties] 
     }); 

... 그리고 더 아래 다음 : 여기에 nodejs '루트 /하는 index.js'에서 발췌 한 것입니다

L.geoJson(myData,{ 
      style: zoneStyle, 

      onEachFeature: function (feature, layer) { 
       var ofc = JSON.stringify(feature.properties.office); 
       var zn = JSON.stringify(feature.properties.zone); 
       layer.bindPopup("office: " + ofc + "<br>" + "zone #" + zn); 
       // layer.bindPopup("Zone #"+JSON.stringify(feature.properties.zone)); 
      } 
     }).addTo(map); 

     // Add county data to map 
     L.geoJson(cntyData,{ 
      onEachFeature: function (feature, layer) { 
       //var desc = JSON.stringify(feature.properties.descriptio); 
       layer.bindPopup(desc); 
      } 
     }).addTo(map); 

이 중 하나가 완벽하게 작동하지만 두 레이어를로드하려고하면 아무 것도 표시되지 않습니다. 궁극적으로 제가 달성하고자하는 것은 판매 구역과 주 카운티 경계 레이어를 켜거나 끄는 것입니다.

모든 의견에 감사드립니다.

+0

내부적으로 충돌을 일으킬 수있는 두 개의 PGSQL 쿼리 모두에 대해 'query' 변수 이름을 사용하고 있습니다. 다른 이름을 사용하거나 클로저를 사용하십시오. – IvanSanchez

+0

그 중, 당신은'res.render()'를 두 번 시도하고 있습니다. 내 node.js는 녹슬지 않으므로 익스프레스에서 의미가 있다는 것을 확실히하십시오. – IvanSanchez

+0

'res.render()'의 첫 번째 호출은 모든 HTML을 브라우저에 반환하고 사물의 빠른 쪽에서 요청 - 응답 스트림을 닫아'res.render()'호출 중 하나를 만들 가능성이 높습니다 조용히 실패하라. – IvanSanchez

답변

0

그래서 나는 같은 문제를 겪고 있었고 일부 동료의 도움을 받아이 솔루션을 제안했습니다.

router.get('/', function (req, res) { 
var client = new pg.Client(conString); // Setup our Postgres Client 
client.connect(); // connect to the client 

// creating an empty array for my row_to_json queries 
var data = [] 

var resto_query = client.query(restoPoint_query); //connects to postgres so it can query up my request 
resto_query.on("row", function (row, result) { 
result.addRow(row); 
}); 
resto_query.on("end", function (result) { 
var resto_to_json = result.rows[0].row_to_json; // Save the JSON as variable data 
data.push(resto_to_json); // push JSON data to data[] 

var barrierQuery = client.query(barrier_query); 
barrierQuery.on("row", function (row, result) { 
    result.addRow(row); 
}); 
barrierQuery.on("end", function (result) { 
    var barrier_to_json = result.rows[0].row_to_json; 
    data.push(barrier_to_json); 

    res.render('map', { 
     title: "Leaflet Test API", // Give a title to our page 
     resto_point: data[0], // Pass data to the View 
     barrier: data[1] 

아마도 가장 좋은 해결책은 아니지만 당분간 작동합니다.

+0

응답이 부족하여 죄송합니다. 다른 프로젝트로 가져 왔지만 이제는이 프로젝트로 되돌아갑니다. 안토니, 코드를 시험해보고 다시 알려 드리겠습니다. 입력하십시오. – Godfried

+0

레이어에로드하는 더 나은 방법을 찾아내는 경우 공유하십시오. –

+0

우리가이 프로젝트를 다시 시작 했으므로 먼지를 날려 버렸습니다. 위의 예제를 시도했지만 작동하지 않았습니다. 웹 콘솔 (브라우저 개발 도구)에서 두 쿼리의 데이터가 표시된 페이지로 전달되지 않았 음을 보여줍니다. y 프로그래밍의 제한된 지식 "data.push"가 잘못된 일이 아닌지 궁금합니다. – Godfried