实现轨迹定位效果图

基于konvajs进行实现,一个强大的canvas库,进行了组件化,支持原生js、react、vue.

https://konvajs.org/docs/react/Custom_Shape.html

先上效果图:

import React, { Component } from "react";
import Konva from 'konva';
import { render } from "react-dom";
import { Stage, Layer, Text, Circle, Shape, Line } from "react-konva";

class App extends Component {
  state = {
    iamge: null,
    // 设置图片的自适应缩放,以0.55为缩放基准,所以原图大小除以1.8
    fillPatternScale: 0
  };

  componentDidMount() {
    this.im();
  }

  im = () => {
    this.image = new Image();
    this.image.src = "https://konvajs.org/assets/lion.png";
    this.image.addEventListener("load", this.handleLoad);
  };

  handleLoad = () => {
    console.log(this.image);
    // after setState react-konva will update canvas and redraw the layer
    // because "image" property is changed
    this.setState({
      image: this.image,
      fillPatternScale: (this.image.width/1.8) / this.image.width
    });
    // if you keep same image object during source updates
    // you will have to update layer manually:
    // this.imageNode.getLayer().batchDraw();
  };
  render() {
    const { image,fillPatternScale } = this.state;
    let xx = [];
    return (
      <Stage width={window.innerWidth} height={window.innerHeight}>
        <Layer>
        <Line
            points={xx}
            stroke="green"
            lineJoin="round"
            lineCap="round"
            dash={[8, 10, 0.001, 10]}
          />
          {[
            { x: 100, y: 200, startTime: 1 },
            { x: 200, y: 100, startTime: 2 },
            { x: 300, y: 200, startTime: 3 }
          ].map(item => {
            xx.push(item.x, item.y + 45);
            return [
              <Shape
                x={item.x}
                y={item.y}
                sceneFunc={(context, shape) => {
                  context.beginPath();
                  context.arc(0, 0, 20, 0.75 * Math.PI, 0.25 * Math.PI);
                  context.lineTo(0, 30);
                  context.closePath();
                  // (!) Konva specific method, it is very important
                  context.fillStrokeShape(shape);
                }}
                stroke="blue"
                strokeWidth={2}
                fillPatternImage={image}
                fillPatternRepeat="no-repeat"
                // 设置偏移量
                fillPatternOffsetX={85}
                fillPatternOffsetY={50}
                // 设置图片自缩放
                fillPatternScaleX={fillPatternScale}
                fillPatternScaleY={fillPatternScale}
              />,
              
              <Text
                text={item.startTime}
                fontFamily={"宋体"}
                x={item.x - 4}
                y={item.y + 60}
                fontSize={15}
                stroke="blue"
              />,
              <Circle
                x={item.x}
                y={item.y + 45}
                radius={4}
                strokeWidth={3}
                fill={"white"}
                stroke="#09D3EF"
              />
            ];
          })}

          
        </Layer>
      </Stage>
    );
  }
}

render(<App />, document.getElementById("root"));

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用百度地API实现GPS步行轨迹,首先需要在Android项目中引入百度地SDK。然后,可以按照以下步骤实现: 1. 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2. 在build.gradle文件中添加以下依赖: ```groovy implementation 'com.baidu.lbs:trace:6.2.0' ``` 3. 在布局文件中添加MapView: ```xml <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 4. 在Activity中初始化MapView: ```java public class MainActivity extends AppCompatActivity { private MapView mMapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取地控件引用 mMapView = (MapView) findViewById(R.id.map_view); // 初始化地 BaiduMap baiduMap = mMapView.getMap(); // 开启定位层 baiduMap.setMyLocationEnabled(true); } } ``` 5. 实现LocationListener接口,获取GPS位置信息: ```java public class MainActivity extends AppCompatActivity implements LocationListener { private MapView mMapView; private BaiduMap mBaiduMap; private LocationClient mLocationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取地控件引用 mMapView = (MapView) findViewById(R.id.map_view); // 初始化地 mBaiduMap = mMapView.getMap(); // 开启定位层 mBaiduMap.setMyLocationEnabled(true); // 初始化定位客户端 mLocationClient = new LocationClient(this); // 注册定位监听器 mLocationClient.registerLocationListener(this); // 配置定位参数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setCoorType("bd09ll"); option.setScanSpan(1000); // 每隔1秒定位一次 mLocationClient.setLocOption(option); // 开始定位 mLocationClient.start(); } @Override public void onLocationChanged(BDLocation location) { if (location == null) return; // 获取经纬度 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 构造定位数据 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) .direction(location.getDirection()) .latitude(latitude) .longitude(longitude) .build(); // 设置定位数据 mBaiduMap.setMyLocationData(locData); // 更新地状态 MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(new LatLng(latitude, longitude)); mBaiduMap.animateMapStatus(update); } } ``` 6. 使用百度地的Trace功能记录步行轨迹: ```java public class MainActivity extends AppCompatActivity implements LocationListener { private MapView mMapView; private BaiduMap mBaiduMap; private LocationClient mLocationClient; private Trace mTrace; private long mServiceId; private String mEntityName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取地控件引用 mMapView = (MapView) findViewById(R.id.map_view); // 初始化地 mBaiduMap = mMapView.getMap(); // 开启定位层 mBaiduMap.setMyLocationEnabled(true); // 初始化定位客户端 mLocationClient = new LocationClient(this); // 注册定位监听器 mLocationClient.registerLocationListener(this); // 配置定位参数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setCoorType("bd09ll"); option.setScanSpan(1000); // 每隔1秒定位一次 mLocationClient.setLocOption(option); // 开始定位 mLocationClient.start(); // 初始化Trace mTrace = new Trace(getApplicationContext(), 123456, "mytrace", true); // 开启服务 mServiceId = mTrace.getServiceId(); // 设置实体名称 mEntityName = "myentity"; } @Override public void onLocationChanged(BDLocation location) { if (location == null) return; // 获取经纬度 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 构造定位数据 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) .direction(location.getDirection()) .latitude(latitude) .longitude(longitude) .build(); // 设置定位数据 mBaiduMap.setMyLocationData(locData); // 更新地状态 MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(new LatLng(latitude, longitude)); mBaiduMap.animateMapStatus(update); // 添加轨迹点 LatLng point = new LatLng(latitude, longitude); TraceLocation traceLocation = new TraceLocation.Builder() .setLatitude(latitude) .setLongitude(longitude) .setSpeed(location.getSpeed()) .setBearing(location.getDirection()) .setTime(System.currentTimeMillis() / 1000) .build(); List<TraceLocation> locations = new ArrayList<>(); locations.add(traceLocation); mTrace.track(locations, mServiceId, mEntityName, new OnTrackListener() { @Override public void onRequestFailedCallback(String s) { Log.e("MainActivity", "轨迹上传失败:" + s); } @Override public void onTraceProcessingCallback(int i, String s) { Log.i("MainActivity", "轨迹上传中:" + s); } @Override public void onTraceCallback(byte[] bytes, String s) { Log.i("MainActivity", "轨迹上传成功:" + s); } }); } } ``` 以上就是使用百度地API实现GPS步行轨迹的步骤。需要注意的是,为了保证定位精度和轨迹记录效果,可以根据具体需求调整定位参数和轨迹记录频率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值