资讯专栏INFORMATION COLUMN

JAVA Polygon 在配送区域超区校验的实践

Me_Kun / 651人阅读

摘要:业务背景物流同城配送,在用户下单的时候会进行配送超区校验,前端会将用户的定位传入后台服务,后台服务针对商家的自定义配送区域通过地图控件拖拽出来的不规则图形进行校验。

业务背景

物流同城配送,在用户下单的时候会进行配送超区校验,前端会将用户的定位传入后台服务,后台服务针对商家的自定义配送区域(通过地图控件拖拽出来的不规则图形)进行校验。

实现方案

利用java se工具类来做 java.awt.Polygon

api地址: https://docs.oracle.com/javas...

使用到的api主要有:

public Polygon(int[] xpoints,int[] ypoints,int npoints)
Parameters:
xpoints - an array of X coordinates 所有点的x坐标
ypoints - an array of Y coordinates 所有点的y坐标
npoints - the total number of points in the Polygon 总共的点数
scene:
把商家通过地图拖拽的多边形各点传入进来,实例化Polygon对象

public boolean contains(double x,double y)
Parameters:
x - the specified X coordinate to be tested x坐标
y - the specified Y coordinate to be tested y坐标
scene:
获取用户当前定位的经纬度,作为x,y坐标系传入进行判断

使用示例 判断规则矩形包含点

   /**
     * 用例描述:测试场景 多边形为矩形 判断点是否在范围内
     *
     *
     * @since  2016-12-06 by 青芒
     */
    @Test
    public void test_rec_ContainsPoint(){
        try {
            int[] xpoints = {1,1,5,5};
            int[] ypoints = {1,5,5,1};
            Polygon polygon = new Polygon(xpoints, ypoints,4);

            boolean contains;

            Point p = new Point(2,2);
            contains = polygon.contains(p);
            Assert.assertTrue(contains);

            contains = polygon.contains(2, 2);
            Assert.assertTrue(contains);

            contains = polygon.contains(1, 4);
            Assert.assertTrue(contains);

            contains = polygon.contains(2, 2);
            Assert.assertTrue(contains);

            contains = polygon.contains(2.5, 2.5);
            Assert.assertTrue(contains);
        } catch (Exception e) {
            Assert.fail();
        }
    }
判断规则矩形包含矩形(拓展下,当前场景用不到)

   /**
     * 用例描述:测试场景 多边形为矩形 判断矩形是否在范围内
     *
     *
     * @since  2016-12-06 by 青芒
     */
    @Test
    public void test_rec_ContainsRectangle(){
        try {
            int[] xpoints = {1,1,5,5};
            int[] ypoints = {1,5,5,1};
            Polygon polygon = new Polygon(xpoints, ypoints,4);

            Rectangle2D rectangle = new Rectangle(2,2,1,1);
            boolean contains = polygon.contains(rectangle);
            Assert.assertTrue(contains);
        } catch (Exception e) {
            Assert.fail();
        }
    }
判断不规则图形包含点

   /**
     * 用例描述:测试场景 不规则多边形 包含点
     *
     *
     * @since  2016-12-06 by 青芒
     */
    @Test
    public void test_polygon_ContainsPoint(){
        try {
            int[] xpoints = {1,2,4,1,2};
            int[] ypoints = {3,4,3,3,2};
            Polygon polygon = new Polygon(xpoints, ypoints,5);
            boolean contains = polygon.contains(3, 3 );
            Assert.assertTrue(contains);

            contains = polygon.contains(2, 1);
            Assert.assertFalse(contains);
        } catch (Exception e) {
            Assert.fail();
        }
    }
判断交叉不规则多边形包含点

    /**
     * 用例描述:测试场景 交叉多边形 包含点
     *
     *
     * @since  2016-12-06 by 青芒
     */
    @Test
    public void test_crossing_ContainsPoint(){
        try {
            int[] xpoints = {1,2,1,3,3};
            int[] ypoints = {1,2,3,3,1};
            Polygon polygon = new Polygon(xpoints, ypoints,5);
            boolean contains = polygon.contains(2, 2 );
            Assert.assertTrue(contains);

            contains = polygon.contains(2, 1 );
            Assert.assertTrue(contains);

            contains = polygon.contains(2, 1.5);
            Assert.assertTrue(contains);

            contains = polygon.contains(2.5, 2.5 );
            Assert.assertTrue(contains);

            //多边形外围
            contains = polygon.contains(0, 1);
            Assert.assertFalse(contains);

            contains = polygon.contains(1, 2);
            Assert.assertFalse(contains);

            contains = polygon.contains(3, 2);
            Assert.assertFalse(contains);
        } catch (Exception e) {
            Assert.fail();
        }
    }
结束

至此对于该超区校验场景的实践已经介绍完毕,使用起来也不难,主要是让大家知道通过javase 的awt类也是可以容易实现的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66338.html

相关文章

  • 为了30分钟配送,盒马工程师都有哪些“神操作”?

    摘要:阿里妹导读提到盒马鲜生,除了新鲜的大龙虾以外,大家印象最深的就是快速配送门店附近公里范围内,分钟送货上门。系统异常业务异常的处理,上线时门店灰度方案一个门店出问题,不影响整个盒马门店,缓存机制柔性可用重试机制事务处理串并行打日志等等。 showImg(https://segmentfault.com/img/remote/1460000018587196); 阿里妹导读:提到盒马鲜生...

    Me_Kun 评论0 收藏0
  • 机器学习美团配送系统实践:用技术还原真实世界

    摘要:可以说,美团要建设的就是配送系统的超级大脑。美团超脑配送系统目前互联网技术,很大部分还是针对线上产品和系统研发,整个流程可以在线上全部完成,而这也正是配送技术最大的不同和挑战。 在2018 AI开发者大会(AI NEXTCon)上,美团配送AI方向负责人何仁清,分享了美团在即时配送领域中机器学习技术的最新进展,以及如何通过大数据和机器学习手段,建立对线下真实世界各种场景的感知能力,还原...

    hearaway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<