在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

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

2016-12-20 13:11| 发布者: zhangjf| 查看: 639| 评论: 0

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

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

实现方案

利用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坐标系传入进行判断

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

  1. /**
  2. * 用例描述:测试场景 多边形为矩形 判断点是否在范围内
  3. *
  4. *
  5. * @since 2016-12-06 by 青芒
  6. */
  7. @Test
  8. public void test_rec_ContainsPoint(){
  9. try {
  10. int[] xpoints = {1,1,5,5};
  11. int[] ypoints = {1,5,5,1};
  12. Polygon polygon = new Polygon(xpoints, ypoints,4);
  13. boolean contains;
  14. Point p = new Point(2,2);
  15. contains = polygon.contains(p);
  16. Assert.assertTrue(contains);
  17. contains = polygon.contains(2, 2);
  18. Assert.assertTrue(contains);
  19. contains = polygon.contains(1, 4);
  20. Assert.assertTrue(contains);
  21. contains = polygon.contains(2, 2);
  22. Assert.assertTrue(contains);
  23. contains = polygon.contains(2.5, 2.5);
  24. Assert.assertTrue(contains);
  25. } catch (Exception e) {
  26. Assert.fail();
  27. }
  28. }
复制代码
判断规则矩形包含矩形(拓展下,当前场景用不到)

  1. /**
  2. * 用例描述:测试场景 多边形为矩形 判断矩形是否在范围内
  3. *
  4. *
  5. * @since 2016-12-06 by 青芒
  6. */
  7. @Test
  8. public void test_rec_ContainsRectangle(){
  9. try {
  10. int[] xpoints = {1,1,5,5};
  11. int[] ypoints = {1,5,5,1};
  12. Polygon polygon = new Polygon(xpoints, ypoints,4);
  13. Rectangle2D rectangle = new Rectangle(2,2,1,1);
  14. boolean contains = polygon.contains(rectangle);
  15. Assert.assertTrue(contains);
  16. } catch (Exception e) {
  17. Assert.fail();
  18. }
  19. }
复制代码
判断不规则图形包含点

  1. /**
  2. * 用例描述:测试场景 不规则多边形 包含点
  3. *
  4. *
  5. * @since 2016-12-06 by 青芒
  6. */
  7. @Test
  8. public void test_polygon_ContainsPoint(){
  9. try {
  10. int[] xpoints = {1,2,4,1,2};
  11. int[] ypoints = {3,4,3,3,2};
  12. Polygon polygon = new Polygon(xpoints, ypoints,5);
  13. boolean contains = polygon.contains(3, 3 );
  14. Assert.assertTrue(contains);
  15. contains = polygon.contains(2, 1);
  16. Assert.assertFalse(contains);
  17. } catch (Exception e) {
  18. Assert.fail();
  19. }
  20. }
复制代码
判断交叉不规则多边形包含点

  1. /**
  2. * 用例描述:测试场景 交叉多边形 包含点
  3. *
  4. *
  5. * @since 2016-12-06 by 青芒
  6. */
  7. @Test
  8. public void test_crossing_ContainsPoint(){
  9. try {
  10. int[] xpoints = {1,2,1,3,3};
  11. int[] ypoints = {1,2,3,3,1};
  12. Polygon polygon = new Polygon(xpoints, ypoints,5);
  13. boolean contains = polygon.contains(2, 2 );
  14. Assert.assertTrue(contains);
  15. contains = polygon.contains(2, 1 );
  16. Assert.assertTrue(contains);
  17. contains = polygon.contains(2, 1.5);
  18. Assert.assertTrue(contains);
  19. contains = polygon.contains(2.5, 2.5 );
  20. Assert.assertTrue(contains);
  21. //多边形外围
  22. contains = polygon.contains(0, 1);
  23. Assert.assertFalse(contains);
  24. contains = polygon.contains(1, 2);
  25. Assert.assertFalse(contains);
  26. contains = polygon.contains(3, 2);
  27. Assert.assertFalse(contains);
  28. } catch (Exception e) {
  29. Assert.fail();
  30. }
  31. }
复制代码
结束

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

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-7 20:38

Copyright 2015-2025 djqfx

返回顶部