从 JSON 文件中的数组中查找最小值和最大值 p5.js
Finding the minimum and maximum value from an array in a JSON File in p5.js
我有一个JSON数据显示黄金海岸的公交候车亭
从那里我想使用 p5.js 找出最小和最大纬度和经度并将它们绘制在图表上
这是我到目前为止的代码
function preload(){
shelters = loadJSON('https://data.gov.au/geoserver/gold-coast/wfs?request=GetFeature&typeName=ckan_be880d63_175a_4383_b0f2_ef88b831eba9&outputFormat=json')
}
function setup() {
createCanvas(400, 400`enter code here`);
print(shelters)
noLoop()
}
function draw() {
background(220);
bus = shelters.features
max_min()
}
function max_min(){
for(let i = 0; i < bus.length; i ++ ){
latitudes = createDiv('h1', bus[i].geometry.coordinate)
max_lat = Math.max(latitudes)
}
console.log(...max_lat)
}
我找不到最大和最小纬度和经度
您有一些无法在您的代码中运行的内容,让我们先看一下:
首先,在你的 createCanvas(400, 400``enter code here``);
行中你有一个语法错误,你需要删除 enter code here
字符串。
然后在你的 max_min()
函数中,你迭代所有的总线并得到 bus[i].geometry.coordinate
。我的理解是,这是一个包含公交车经纬度的数组,所以在这个数组上使用 Math.max
将 return 当前公交车的经纬度之间的最大值,这不是你想要什么。
你有多种选择来做你想做的事。如果你真的想使用 Math.max()
和 Math.min()
并且熟悉 map
你可以:
- 构建所有纬度的数组:
bus.map(b => b.geometry.coordinates[0])
即获取 bus
数组中的所有项目并将其转换为仅包含每条公交车 geometry.coordinates
第一项的数组属性。 (将 [0]
替换为 [1]
以获得经度)
- 使用
...
运算符解构它,因为 Math.max()
不接受数组而是参数列表
- 并将其分配给一个值,您的函数将如下所示:
function max_min() {
const maxLat = Math.max(...bus.map(b => b.geometry.coordinates[0]));
const minLat = Math.min(...bus.map(b => b.geometry.coordinates[0]));
const maxLong = Math.max(...bus.map(b => b.geometry.coordinates[1]));
const minLong = Math.min(...bus.map(b => b.geometry.coordinates[1]));
return { maxLat, minLat, maxLong, minLong };
}
这里的代码很短,但是你在 bus
数组上迭代了 4 次,效率不是特别高。因此,您还可以采用另一种方法,即创建一个简短的辅助函数来获取公交车的经纬度:
// Given a feature return its latitude and longitude in an object
function getLatLong(feature) {
const [lat, long] = feature.geometry.coordinates;
return { lat, long };
}
然后遍历所有总线并根据这些信息更新最小值和最大值,如下所示:
// Find the max and min longitude and latitude and return them in an object
function max_min() {
// Use the first feature of the list to initialize the max and min values
const { lat: firstLat, long: firstLong } = getLatLong(bus[0]);
let maxLat = firstLat;
let minLat = firstLat;
let maxLong = firstLong;
let minLong = firstLong;
// Iterate through all the features to update the max and min values
for (let i = 1; i < bus.length; i++) {
const { lat, long } = getLatLong(bus[i]);
if (lat > maxLat) {
maxLat = lat;
}
if (lat < minLat) {
minLat = lat;
}
if (long > maxLong) {
maxLong = long;
}
if (long < minLong) {
minLong = long;
}
}
// Return the updated max and min values
return { maxLat, minLat, maxLong, minLong };
}
终于在draw()
中你可以对它们做任何你想做的事了,例如我只把它们写在canvas:
function draw() {
background(220);
// Get the max and min values with our helper function
const { maxLat, minLat, maxLong, minLong } = max_min();
// Show the values
text(`max lat ${maxLat}`, 0, 10);
text(`min lat ${minLat}`, 0, 30);
text(`max long ${maxLong}`, 0, 50);
text(`min long ${minLong}`, 0, 70);
}
我创建了 this codepen 完整的代码,这样您就可以了解各个部分是如何协同工作的。
我有一个JSON数据显示黄金海岸的公交候车亭
从那里我想使用 p5.js 找出最小和最大纬度和经度并将它们绘制在图表上 这是我到目前为止的代码
function preload(){
shelters = loadJSON('https://data.gov.au/geoserver/gold-coast/wfs?request=GetFeature&typeName=ckan_be880d63_175a_4383_b0f2_ef88b831eba9&outputFormat=json')
}
function setup() {
createCanvas(400, 400`enter code here`);
print(shelters)
noLoop()
}
function draw() {
background(220);
bus = shelters.features
max_min()
}
function max_min(){
for(let i = 0; i < bus.length; i ++ ){
latitudes = createDiv('h1', bus[i].geometry.coordinate)
max_lat = Math.max(latitudes)
}
console.log(...max_lat)
}
我找不到最大和最小纬度和经度
您有一些无法在您的代码中运行的内容,让我们先看一下:
首先,在你的
createCanvas(400, 400``enter code here``);
行中你有一个语法错误,你需要删除enter code here
字符串。然后在你的
max_min()
函数中,你迭代所有的总线并得到bus[i].geometry.coordinate
。我的理解是,这是一个包含公交车经纬度的数组,所以在这个数组上使用Math.max
将 return 当前公交车的经纬度之间的最大值,这不是你想要什么。
你有多种选择来做你想做的事。如果你真的想使用 Math.max()
和 Math.min()
并且熟悉 map
你可以:
- 构建所有纬度的数组:
bus.map(b => b.geometry.coordinates[0])
即获取bus
数组中的所有项目并将其转换为仅包含每条公交车geometry.coordinates
第一项的数组属性。 (将[0]
替换为[1]
以获得经度) - 使用
...
运算符解构它,因为Math.max()
不接受数组而是参数列表 - 并将其分配给一个值,您的函数将如下所示:
function max_min() {
const maxLat = Math.max(...bus.map(b => b.geometry.coordinates[0]));
const minLat = Math.min(...bus.map(b => b.geometry.coordinates[0]));
const maxLong = Math.max(...bus.map(b => b.geometry.coordinates[1]));
const minLong = Math.min(...bus.map(b => b.geometry.coordinates[1]));
return { maxLat, minLat, maxLong, minLong };
}
这里的代码很短,但是你在 bus
数组上迭代了 4 次,效率不是特别高。因此,您还可以采用另一种方法,即创建一个简短的辅助函数来获取公交车的经纬度:
// Given a feature return its latitude and longitude in an object
function getLatLong(feature) {
const [lat, long] = feature.geometry.coordinates;
return { lat, long };
}
然后遍历所有总线并根据这些信息更新最小值和最大值,如下所示:
// Find the max and min longitude and latitude and return them in an object
function max_min() {
// Use the first feature of the list to initialize the max and min values
const { lat: firstLat, long: firstLong } = getLatLong(bus[0]);
let maxLat = firstLat;
let minLat = firstLat;
let maxLong = firstLong;
let minLong = firstLong;
// Iterate through all the features to update the max and min values
for (let i = 1; i < bus.length; i++) {
const { lat, long } = getLatLong(bus[i]);
if (lat > maxLat) {
maxLat = lat;
}
if (lat < minLat) {
minLat = lat;
}
if (long > maxLong) {
maxLong = long;
}
if (long < minLong) {
minLong = long;
}
}
// Return the updated max and min values
return { maxLat, minLat, maxLong, minLong };
}
终于在draw()
中你可以对它们做任何你想做的事了,例如我只把它们写在canvas:
function draw() {
background(220);
// Get the max and min values with our helper function
const { maxLat, minLat, maxLong, minLong } = max_min();
// Show the values
text(`max lat ${maxLat}`, 0, 10);
text(`min lat ${minLat}`, 0, 30);
text(`max long ${maxLong}`, 0, 50);
text(`min long ${minLong}`, 0, 70);
}
我创建了 this codepen 完整的代码,这样您就可以了解各个部分是如何协同工作的。