因此,我正在构建一个 React 项目作为代码练习的一部分。我有一张 geojson 数据,其中定义了各种多边形。我的任务是获取一对用户坐标并检查该组坐标是否位于任何指定的多边形内。但是,一旦我提交坐标,它就会抛出以下错误:
Uncaught TypeError: ring is undefined
inRing index.js:82
booleanPointInPolygon index.js:54
CheckCoordinate CheckCoordinate.jsx:24
CheckCoordinate CheckCoordinate.jsx:23
React 8
commitHookEffectListMount
commitPassiveMountOnFiber
commitPassiveMountEffects_complete
commitPassiveMountEffects_begin
commitPassiveMountEffects
flushPassiveEffectsImpl
flushPassiveEffects
commitRootImpl
workLoop scheduler.development.js:266
flushWork scheduler.development.js:239
performWorkUntilDeadline scheduler.development.js:533
我只是想知道造成这种情况的原因。我最初认为这是由于动态获取 geojson 文件所致,我将其删除并用直接导入替换,如下面的代码块中所示。然而,这并没有改变行为。
import React, { useState, useEffect } from 'react';
import * as turf from '@turf/turf';
import yardZoneMap from './yard-zone-map.json'; // Adjust the path as necessary
function CheckCoordinate(props) {
const unparsedString = props.inputCoord || '';
const parsedValues = unparsedString.split(',').map(item => parseFloat(item));
const [pointLocation, setPointLocation] = useState(null);
const [isInside, setIsInside] = useState(false);
useEffect(() => {
if (parsedValues.length === 2) {
setPointLocation(parsedValues);
}
}, [unparsedString]);
useEffect(() => {
if (pointLocation) {
const point = turf.point(pointLocation); // Correctly define the point here
let insideAnyPolygon = false;
yardZoneMap.features.forEach(feature => {
if (turf.booleanPointInPolygon(point, feature)) {
insideAnyPolygon = true;
}
});
setIsInside(insideAnyPolygon);
}
}, [pointLocation]);
return (
<div>
<p>Point is inside polygon: {isInside ? 'Yes' : 'No'}</p>
</div>
);
}
export default CheckCoordinate;
我已经使用在线验证工具来验证我的geojson数据是否良好并且显示没有问题,所以我相当确定这不是数据格式问题,而是与我的处理方式有关它。
如有任何建议,我们将不胜感激!
问题是由于 JSON 数据包含点要素而不仅仅是多边形。一旦我编辑程序以忽略这些功能,事情就开始顺利运行。