Flutter地理空间分析插件turf_pip的使用
Flutter地理空间分析插件turf_pip的使用
插件介绍
turf_pip
是一个用于检测点是否位于多边形内部的小型库。它基于Hao的论文“Optimal Reliable Point-in-Polygon Test and Differential Coding Boolean Operations on Polygons”实现。
特性
- 支持具有洞的多边形
- 支持退化/自相交多边形
- 返回
PointInPolygonResult.isOnEdge
如果在边缘,PointInPolygonResult.isInside
如果在内部和PointInPolygonResult.isOutside
如果在外部 - 不受浮点误差影响
使用方法
通过以下命令安装插件:
dart pub add turf_pip
示例代码
import 'package:turf_pip/turf_pip.dart';
const polygon = Polygon(coordinates:[
[
Position.of([1, yi]),
Position.of([yi, yz]),
Position.of([yz, zc]),
Position.of([zc, za]),
Position.of([za, za]),
]
]);
// 检测点是否在多边形内部
pointInPolygon(Point(coordinates: Position.of([x, y])), polygon)
// > PointInPolygonResult.isInside
pointInPolygon(Point(coordinates: Position.of([x, y])), polygon)
// > PointInPolygonResult.isOutside
pointInPolygon(Point(coordinates: Position.of([x, y])), polygon)
// > PointInPolygonResult.isOnEdge
注意事项
输入的多边形格式应符合GeoJson规范,即多边形的第一个和最后一个坐标必须重复,否则将抛出错误。
var polygonWithHole = Polygon(coordinates:([
[
Position.of([0, 0]),
Position.of([1, yi]),
Position.of([yz, zc]),
Position.of([zc, za]),
Position.of([za, za]),
],
[
Position.of([0.1, 0.1]),
Position.of([0.1, 0.9]),
Position.of([0.9, 0.9]),
Position.of([0.9, 0.1]),
Position.of([0.1, 0.1]),
]
]);
该库不支持多边形集合(MultiPolygons)。
性能比较
与类似库相比的一些粗略比较。
虽然 point-in-polygon
在大多数情况下稍快一些,但它不支持具有洞或退化的多边形。
// 对于一个多边形中的点检查
point-in-poly-hao x 474,180 ops/sec ±0.55% (93 runs sampled)
point-in-polygon x 489,649 ops/sec ±0.75% (91 runs sampled
robust-point-in-polygon x 376,268 ops/sec ±0.79% (89 runs sampled
// 对于边界框检查
point-in-poly-hao x 29,365,704 ops/sec ±1.30% (90 runs sampled
point-in-polygon x 42,339,450 ops/sec ±0.78% (95 runs sampled
robust-point-in-polygon x 20,675,569 ops/sec ±0.65% (95 runs sampled
更多关于Flutter地理空间分析插件turf_pip的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地理空间分析插件turf_pip的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用turf_pip
插件进行地理空间分析(Point-in-Polygon,即点在多边形内)的示例代码。这个插件是基于Turf.js库,用于地理空间数据处理和分析。
首先,确保你的Flutter项目已经配置好,并且你已经添加了turf_pip
依赖。你可以在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
turf_pip: ^latest_version # 请替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
以下是一个完整的Flutter应用示例,展示如何使用turf_pip
插件进行点在多边形内的分析:
import 'package:flutter/material.dart';
import 'package:turf_pip/turf_pip.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Turf PIP Example'),
),
body: Center(
child: PipExample(),
),
),
);
}
}
class PipExample extends StatefulWidget {
@override
_PipExampleState createState() => _PipExampleState();
}
class _PipExampleState extends State<PipExample> {
List<dynamic> points = [
{"type": "Feature", "geometry": {"type": "Point", "coordinates": [0, 0]}},
{"type": "Feature", "geometry": {"type": "Point", "coordinates": [1, 1]}},
{"type": "Feature", "geometry": {"type": "Point", "coordinates": [2, 2]}},
];
List<dynamic> polygon = [
{"type": "Feature", "geometry": {
"type": "Polygon",
"coordinates": [
[
[0, 0], [4, 0], [4, 4], [0, 4], [0, 0]
]
]
}}
];
String resultText = "";
@override
void initState() {
super.initState();
_checkPointsInPolygon();
}
void _checkPointsInPolygon() async {
List<dynamic> insidePoints = await turfPip(points, polygon);
setState(() {
resultText = "Points inside polygon: ${insidePoints.map((point) => point['geometry']['coordinates']).join(", ")}";
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Points and Polygon"),
Text("Polygon Coordinates:\n${polygon[0]['geometry']['coordinates'].map((ring) => ring.map((coord) => "${coord[0]}, ${coord[1]}").join(", ")).join("; ")}"),
Text("Points Coordinates:\n${points.map((point) => "${point['geometry']['coordinates'][0]}, ${point['geometry']['coordinates'][1]}").join(", ")}"),
SizedBox(height: 20),
Text(resultText),
],
);
}
}
在这个示例中,我们首先定义了一些点和一个多边形。然后在_checkPointsInPolygon
方法中,我们使用turfPip
函数来检查哪些点在多边形内,并将结果更新到状态中。最后,我们在UI中显示了这些点和多边形的坐标,以及哪些点在多边形内的结果。
请注意,turf_pip
插件可能需要一些异步操作,因此我们在initState
方法中调用_checkPointsInPolygon
,并在其中使用await
来等待结果。
确保你已经正确安装了turf_pip
插件,并且你的Flutter环境配置正确。运行这个示例,你应该能看到哪些点在多边形内的结果。