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

1 回复

更多关于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环境配置正确。运行这个示例,你应该能看到哪些点在多边形内的结果。

回到顶部