OpenLayer는 경로에 따른 자동차의 움직임을 어떻게 구현하나요?
이 글에서는 주로 openlayer에서 경로 모션을 구현하는 방법에 대해 설명합니다. 관심 있는 친구들은 한 번 살펴보세요.
1. 요구사항 분석
고객이 원하는 기능은 Gis 지도의 경로에 따라 차량이 이동할 수 있도록 하는 것입니다. (이것은 고객이 지정한 요구사항입니다. 말문이 막힙니다.) 그리고 고객님께서도 기본 지도는 교체가 쉬워야 한다고 하셨는데, Gis를 이용해 표현하고 싶었던 것은 Baidu나 Amap 같은 기성 Gis 인터페이스를 사용할 수가 없었습니다.
위의 요구 사항을 고려하여 웹 GiS 프레임워크에 대해 너무 많이 배우지 않았습니다. Gis의 고객 컨셉은 확대 및 축소가 가능하고 경로 계획 등을 할 수 있다는 것이기 때문입니다. 그래서 나는 이 문제를 해결하기 위해 ol을 선택하고 그의 정적 사진(기본 맵을 유연하게 업데이트하려는 고객의 요구를 충족시키기 위해 이것을 선택)을 Gis 기본 맵으로 사용했습니다.
관련 튜토리얼: js 영상 튜토리얼
2. 효과 표시
3. 의사코드 구현
기술적인 인증코드라 좀 지저분해서 키코드만 알려드립니다. 비즈니스 요구 사항이 있는 경우 함께 논의할 수 있습니다.
3.1 경로 그리기 구현
이 단계는 주로 Ol의 Draw 개체를 사용합니다.
draw(type){ this.stopdraw(); this._draw = new Draw({ source: this.layer.getSource(), type: type == 'Icon' ? 'Point' : type }); this._draw.on('drawend', (event)=>{ if(type == 'LineString'){ this.traceLine = event.feature; } if(type != 'Icon') return; let f = event.feature; f.setStyle(new Style({ image: new Icon({ src: '/content/battery.gif' }), text: new Text({ text: 'new item', fill: new Fill({ color: "red" }) }) })); f.type = 'battery'; }); this.map.addInteraction(this._draw); this._snap = new Snap({source: this.layer.getSource()}); this.map.addInteraction(this._snap); }
핵심 코드는 Drawend 이벤트인 경우입니다. , 이것을 사용하십시오. 이 기능은 경로가 실행될 때 사용하기 쉽도록 공용 변수에 배치됩니다.
3.2 경로 데이터 분해
3.1의 선스트링은 여러 선분의 집합이므로 이동의 본질은 아이콘의 좌표를 변경하는 것이므로 3.1단계의 경로를 구해서 분석하는 부분입니다. 빠르게 만들고 지속적인 변화는 움직이는 효과를 만듭니다. 따라서 경로 세분화 방법은 다음과 같습니다. 코드는 다음과 같습니다.
cutTrace(){ let traceCroods = this.traceLine.getGeometry().getCoordinates(); let len = traceCroods.length; let destCroods = []; for(let i = 0; i < len - 1; ++i){ let bPoint = traceCroods[i]; let ePoint = traceCroods[i+1]; let bevelling = Math.sqrt(Math.pow(ePoint[0] - bPoint[0], 2) + Math.pow(ePoint[1] - bPoint[1], 2) ); let cosA = (ePoint[0] - bPoint[0]) / bevelling; let sinA = (ePoint[1] - bPoint[1]) / bevelling; let curStep = 0; let step = 5; destCroods.push(new Point([bPoint[0], bPoint[1]])); do{ curStep++; let nextPoint; if(curStep * step >= bevelling){ nextPoint = new Point([ePoint[0], ePoint[1]]); }else{ nextPoint = new Point([ cosA * curStep * step + bPoint[0] , sinA * curStep * step + bPoint[1] ]); } destCroods.push(nextPoint); }while(curStep * step < bevelling); } return destCroods; }
일부 수학적 삼각함수와 계산 방법이 사용됩니다. 이 방법은 최종적으로 스텝 크기를 기준으로 계산된 좌표 세트를 선택합니다.
3.3 postcompose를 사용하여 모션 효과 구현
코드는 다음과 같습니다.
tracerun(){ if(!this.traceLine) return; this.traceCroods = this.cutTrace(); this.now = new Date().getTime(); this.map.on('postcompose', this.moveFeature.bind(this)); this.map.render(); } moveFeature(event){ let vCxt = event.vectorContext; let fState = event.frameState; let elapsedTime = fState.time - this.now; let index = Math.round(300 * elapsedTime / 1000); let len = this.traceCroods.length; if(index >= len){ //stop this.map.un('postcompose', this.moveFeature); return; } let dx, dy, rotation; if(this.traceCroods[index] && this.traceCroods[index + 1]){ let isRigth = false; let bCrood = this.traceCroods[index].getCoordinates(); let eCrood = this.traceCroods[index + 1].getCoordinates(); if(bCrood[0] < eCrood[0]){ //左->右 isRigth = true } dx = bCrood[0] - eCrood[0]; dy = bCrood[1] - eCrood[1]; rotation = Math.atan2(dy,dx); if(rotation > (Math.PI / 2)){ //修正 rotation = Math.PI - rotation; }else if(rotation < -1 * (Math.PI / 2)){ rotation = -1 * Math.PI - rotation; }else{ rotation = -rotation; } console.log(dx + ' ' + dy + ' ' + rotation); let curPoint = this.traceCroods[index]; var anchor = new Feature(curPoint); let style = new Style({ image: new Icon({ img: isRigth ? this.carRight : this.carImg, imgSize: [32,32], rotateWithView: false, rotation: rotation }), text: new Text({ text: 'Car', fill: new Fill({ color: 'red' }), offsetY: -20 }) }); vCxt.drawFeature(anchor, style); //this.map.getView().setCenter(bCrood); } this.map.render(); }
이 모바일 코드는 ol의 postcompose 이벤트를 사용하여 구현됩니다. 렌더링 메서드가 실행된 후 postcompose 이벤트가 트리거되기 때문에 타이머 구현 계획. 그 중 회전은 2점 좌표를 기준으로 움직이는 아이콘의 기울기와 이동 방향을 계산해 디스플레이에 더욱 임팩트를 준다.
위 내용은 OpenLayer는 경로에 따른 자동차의 움직임을 어떻게 구현하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











HTML의 테이블 테두리 안내. 여기에서는 HTML의 테이블 테두리 예제를 사용하여 테이블 테두리를 정의하는 여러 가지 방법을 논의합니다.

HTML 여백-왼쪽 안내. 여기에서는 HTML margin-left에 대한 간략한 개요와 코드 구현과 함께 예제를 논의합니다.

HTML의 Nested Table에 대한 안내입니다. 여기에서는 각 예와 함께 테이블 내에 테이블을 만드는 방법을 설명합니다.

HTML 테이블 레이아웃 안내. 여기에서는 HTML 테이블 레이아웃의 값에 대해 예제 및 출력 n 세부 사항과 함께 논의합니다.

HTML 입력 자리 표시자 안내. 여기서는 코드 및 출력과 함께 HTML 입력 자리 표시자의 예를 논의합니다.

HTML 순서 목록에 대한 안내입니다. 여기서는 HTML Ordered 목록 및 유형에 대한 소개와 각각의 예에 대해서도 설명합니다.

HTML에서 텍스트 이동 안내. 여기서는 Marquee 태그가 구문과 함께 작동하는 방식과 구현할 예제에 대해 소개합니다.

HTML onclick 버튼에 대한 안내입니다. 여기에서는 각각의 소개, 작업, 예제 및 다양한 이벤트의 onclick 이벤트에 대해 설명합니다.
