返回

在地图上绘制矩形以获取 OSMLuildings 数据的简便方法

前端

前言

在做可视化项目的时候, 有一个需求就是让用户选择一个范围, 自动根据选中的范围生成3d地图, 3dtiles数据是一个老大难的问题, 最近终于实现了这个小工具, 可以通过node实现,从OSMBuildings获取3d楼层。

在地图上绘制矩形以获取 OSMLuildings 数据

  1. 引入必要的库

首先,我们需要引入一些必要的库,包括请求库、文件系统库和流库:

const request = require('request');
const fs = require('fs');
const stream = require('stream');
  1. 定义请求参数

接下来,我们需要定义请求参数, 包括请求url, 请求头和请求参数。请求url是OSMBuildings API的url, 请求头是用来告诉服务器我们请求的是什么类型的数据, 请求参数是用来指定我们要获取的区域的。

const url = 'https://osmbuildings.org/api/v1/download';
const headers = {
  'Accept': 'application/json',
  'Content-Type': 'application/json'
};
const params = {
  bbox: '-122.4194,37.7749,-122.4086,37.7822',
  format: 'obj'
};
  1. 发送请求

发送请求后,我们需要等待服务器返回数据。服务器返回的数据是一个json字符串, 我们需要把它解析成json对象。

request.get(url, {headers: headers, params: params}, (error, response, body) => {
  if (error) {
    throw error;
  }
  const data = JSON.parse(body);
});
  1. 保存数据

服务器返回的数据是一个json对象, 里面包含了下载链接。我们需要把下载链接保存下来, 然后用它来下载数据。

const downloadUrl = data.url;
const fileName = 'buildings.obj';
fs.createWriteStream(fileName)
  .pipe(request.get(downloadUrl));
  1. 使用数据

数据下载完成后, 就可以使用它来生成3d地图了。我们可以使用Three.js或其他3d引擎来加载数据, 然后把它渲染到屏幕上。

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const loader = new THREE.OBJLoader();
loader.load('buildings.obj', (object) => {
  scene.add(object);
});

camera.position.z = 5;

const animate = () => {
  requestAnimationFrame(animate);

  renderer.render(scene, camera);
};

animate();

结论

这就是如何使用 Node.js 从 OSMLuildings 获取 3d 楼层数据,以及如何在地图上绘制矩形来获取当前区域的 OSMLuildings 数据。希望对您有所帮助。