layers.eachLayer(function (layer) { var geom = layer.feature.geometry.coordinates; var basicRing = geom[0]; var holeRings = geom.slice(1); var i, j; var scale = 1; var hscale = 6; var pos = new THREE.Vector3(); pos.z = 0; var pxy = llSwap(sm.forward(llSwap(basicRing[0]))); pos.x = pxy[0]; pos.y = pxy[1]; console.log('p>', pos); var shape = new THREE.Shape(); for (i = 0; i < basicRing.length; i++) { var p = llSwap(sm.forward(llSwap(basicRing[i]))); shape.moveTo(p[0] * scale - pos.x, p[1] * scale - pos.y); } for (j = 0; j < holeRings.length; j++) { var hole = new THREE.Path(); for (i = 0; i < holeRings[j].length; i++) { var p = llSwap(sm.forward(llSwap(holeRings[j][i]))); hole.moveTo(p[0] * scale - pos.x, p[1] * scale - pos.y); } shape.holes.push(hole); } console.log(layer.feature); var height = layer.feature.properties['B_LEVELS'] * hscale; console.log('bl> ', layer.feature.properties['B_LEVELS']); var houseGeometry = shape.extrude({ amount: height, bevelEnabled: false, material: 0, extrudeMaterial: 0 }); var material = new THREE.MeshNormalMaterial(); var houseMesh = window.hm = new THREE.Mesh(houseGeometry, material); houseMesh.position.x = pos.x; houseMesh.position.y = pos.y; houseMesh.position.z = pos.z; scene.add(houseMesh); console.log(houseMesh); camera.position.x = 5993256.531453259; camera.position.y = 6245827.850407017; camera.position.z = 6; camera.lookAt(houseMesh.position); camera.rotateZ(Math.PI/2) });
function zoomTo() { var center = document.getElementById('center').value.split(','), zoom = parseInt(document.getElementById('zoom').value), mercCenter, mapExtent, res, tiles; // calculate map parameters in mercator projection mercCenter = merc.forward([parseFloat(center[0]),parseFloat(center[1])]); res = mercatorMaxRes/Math.pow(2,zoom); mapExtent = { left: mercCenter[0] - size.width/2 * res, right: mercCenter[0] + size.width/2 * res, bottom: mercCenter[1] - size.height/2 * res, top: mercCenter[1] + size.height/2 * res }; // get map tiles list for our map extent tiles = webMercatorTiles(mapExtent, zoom); // append map tile images to the map div mapDiv.innerHTML = ""; tiles.forEach(function(t) { var img = document.createElement('img'); img.src = baseURL + '/'+ t.Z + '/' + t.X + '/' + t.Y + '.png'; img.setAttribute('style', 'left:'+ t.left + 'px;top:'+t.top+'px;'); img.setAttribute('class','tile'); mapDiv.appendChild(img); }); }
/** * coarse - sorts results based on coarse tile grid values * * @param {Array} results grid results to sort * @param {Array} grids Array of Arrays of grid esults for each layer * @param {Array} zooms Array of zooms for each layer * @param {Object} options geocoder options * @return {Array} sorted grid results */ function coarse(results, grids, zooms, options) { //Setup grid lookup - each layer is an object in the array with id->grid var gridlookup = []; var proxSM = sm.forward(options.proximity); //proximity in merc var layer_it = grids.length; while (layer_it--) { //Allow grid lookup by gridlookup[idx][id] gridlookup[layer_it] = {}; var grid_it = grids[layer_it].length; while (grid_it--) { var tmpGrid = ops.grid(grids[layer_it][grid_it]); gridlookup[layer_it][tmpGrid.id] = tmpGrid; } } var relevlookup = {}; var relev_it = results.length; while (relev_it--) { //precalculate center & dist to proc for sorting relevlookup[results[relev_it]] = { relev: new Relev(results[relev_it]) }; var currentRelev = relevlookup[results[relev_it]].relev; var currentCenter = toCenter( sm.bbox( gridlookup[currentRelev.idx][currentRelev.id].x, gridlookup[currentRelev.idx][currentRelev.id].y, zooms[currentRelev.idx] ) ); // a^2 + b^2 as dist relevlookup[results[relev_it]].dist = (currentCenter[0] - proxSM[0])*(currentCenter[0] - proxSM[0]) + (currentCenter[1] - proxSM[1])*(currentCenter[1] - proxSM[1]); } results.sort(function(a, b) { a = relevlookup[a]; b = relevlookup[b]; if (a.relev.relev !== b.relev.relev) return 0; //Only sort with same relev return a.dist - b.dist; }); return results; }
/** * toCenter - takes lat/lng bbox and returns centre in mercator * * @param {Array} bbox in format [w, s, e, n] * @return {Array} [x,y] of mercator center */ function toCenter(bbox) { return sm.forward([(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2]); }