RoadService.js 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571
  1. import RoadPoint from "../Geometry/RoadPoint.js";
  2. import Road from "../Geometry/Road.js";
  3. import CurveRoad from "../Geometry/CurveRoad.js";
  4. import { dataService } from "./DataService.js";
  5. import { roadPointService } from "./RoadPointService.js";
  6. import { edgeService } from "./EdgeService.js";
  7. import { mathUtil } from "../Util/MathUtil.js";
  8. import Constant from "../Constant";
  9. import { crossPointService } from "./CrossPointService.js";
  10. import { lineService } from "./LineService.js";
  11. import { uiService } from "./UIService.js";
  12. import VectorStyle from "../enum/VectorStyle.js";
  13. export default class RoadService {
  14. constructor() {}
  15. create(startId, endId, vectorId) {
  16. let road = new Road(startId, endId, vectorId);
  17. dataService.addRoad(road);
  18. let startPoint = dataService.getRoadPoint(startId);
  19. startPoint.setPointParent(road.vectorId, "start");
  20. let endPoint = dataService.getRoadPoint(endId);
  21. endPoint.setPointParent(road.vectorId, "end");
  22. let edgePoints;
  23. if (road.way == Constant.oneWay) {
  24. edgePoints = mathUtil.RectangleVertex(
  25. startPoint,
  26. endPoint,
  27. road.singleRoadWidth
  28. );
  29. } else {
  30. edgePoints = mathUtil.RectangleVertex(
  31. startPoint,
  32. endPoint,
  33. road.leftWidth + road.rightWidth + road.midDivide.midDivideWidth
  34. );
  35. }
  36. let leftEdge = edgeService.create(
  37. edgePoints.leftEdgeStart,
  38. edgePoints.leftEdgeEnd,
  39. null,
  40. vectorId
  41. );
  42. let rightEdge = edgeService.create(
  43. edgePoints.rightEdgeStart,
  44. edgePoints.rightEdgeEnd,
  45. null,
  46. vectorId
  47. );
  48. road.setLeftEdge(leftEdge.vectorId);
  49. road.setRightEdge(rightEdge.vectorId);
  50. if (!vectorId) {
  51. leftEdge.setEdgeParent(road.vectorId);
  52. rightEdge.setEdgeParent(road.vectorId);
  53. }
  54. this.setLanes(road.vectorId);
  55. return road;
  56. }
  57. //撤销恢复用的,edge这些会专门调用
  58. createOnlyRoad(startId, endId, vectorId) {
  59. let road = new Road(startId, endId, vectorId);
  60. dataService.addRoad(road);
  61. let startPoint = dataService.getRoadPoint(startId);
  62. startPoint.setPointParent(road.vectorId, "start");
  63. let endPoint = dataService.getRoadPoint(endId);
  64. endPoint.setPointParent(road.vectorId, "end");
  65. return road;
  66. }
  67. copyRoad(vectorId) {
  68. let road = dataService.getRoad(vectorId);
  69. let startPoint = dataService.getRoadPoint(road.startId);
  70. let endPoint = dataService.getRoadPoint(road.endId);
  71. let newStartPoint = uiService.getNewPositionForPop(startPoint);
  72. newStartPoint = roadPointService.create(newStartPoint);
  73. let newEndPoint = uiService.getNewPositionForPop(endPoint);
  74. newEndPoint = roadPointService.create(newEndPoint);
  75. let newRoad = new Road(newStartPoint.vectorId, newEndPoint.vectorId);
  76. dataService.addRoad(newRoad);
  77. newStartPoint.setPointParent(newRoad.vectorId, "start");
  78. newEndPoint.setPointParent(newRoad.vectorId, "end");
  79. newRoad.setWay(road.way);
  80. newRoad.singleRoadWidth = road.singleRoadWidth;
  81. newRoad.leftWidth = road.leftWidth;
  82. newRoad.rightWidth = road.rightWidth;
  83. let edgePoints;
  84. if (newRoad.way == Constant.oneWay) {
  85. edgePoints = mathUtil.RectangleVertex(
  86. newStartPoint,
  87. newEndPoint,
  88. road.singleRoadWidth
  89. );
  90. } else {
  91. edgePoints = mathUtil.RectangleVertex(
  92. newStartPoint,
  93. newEndPoint,
  94. road.leftWidth + road.rightWidth + road.midDivide.midDivideWidth
  95. );
  96. }
  97. let leftEdge = edgeService.create(
  98. edgePoints.leftEdgeStart,
  99. edgePoints.leftEdgeEnd,
  100. null,
  101. vectorId
  102. );
  103. let rightEdge = edgeService.create(
  104. edgePoints.rightEdgeStart,
  105. edgePoints.rightEdgeEnd,
  106. null,
  107. vectorId
  108. );
  109. newRoad.setLeftEdge(leftEdge.vectorId);
  110. newRoad.setRightEdge(rightEdge.vectorId);
  111. if (!vectorId) {
  112. leftEdge.setEdgeParent(newRoad.vectorId);
  113. rightEdge.setEdgeParent(newRoad.vectorId);
  114. }
  115. let oldLeftEdge = dataService.getRoadEdge(road.leftEdgeId);
  116. leftEdge.start = uiService.getNewPositionForPop(oldLeftEdge.start);
  117. leftEdge.end = uiService.getNewPositionForPop(oldLeftEdge.end);
  118. leftEdge.setParent(newRoad.vectorId);
  119. leftEdge.setStyle(oldLeftEdge.getStyle());
  120. leftEdge.setWeight(oldLeftEdge.getWeight());
  121. let oldRightEdge = dataService.getRoadEdge(road.rightEdgeId);
  122. rightEdge.start = uiService.getNewPositionForPop(oldRightEdge.start);
  123. rightEdge.end = uiService.getNewPositionForPop(oldRightEdge.end);
  124. rightEdge.setParent(newRoad.vectorId);
  125. rightEdge.setStyle(oldRightEdge.getStyle());
  126. rightEdge.setWeight(oldRightEdge.getWeight());
  127. newRoad.singleRoadDrivewayCount = road.singleRoadDrivewayCount;
  128. newRoad.leftDrivewayCount = road.leftDrivewayCount;
  129. newRoad.rightDrivewayCount = road.rightDrivewayCount;
  130. this.setLanes(newRoad.vectorId);
  131. return newRoad.vectorId;
  132. }
  133. getMidLine(road) {
  134. let startPoint = dataService.getRoadPoint(road.startId);
  135. let endPoint = dataService.getRoadPoint(road.endId);
  136. let line = mathUtil.createLine1(startPoint, endPoint);
  137. return line;
  138. }
  139. // roadId对应墙的两个端点。尽量不要改
  140. // dir表示:保留start还是保留end(对应端点的parent不用变)
  141. splitRoad(roadId, pointId, dir) {
  142. const road = dataService.getRoad(roadId);
  143. const startPoint = dataService.getRoadPoint(road.startId);
  144. const endPoint = dataService.getRoadPoint(road.endId);
  145. const point = dataService.getRoadPoint(pointId);
  146. if (
  147. mathUtil.getDistance(startPoint, point) < Constant.minAdsorbPix ||
  148. mathUtil.getDistance(endPoint, point) < Constant.minAdsorbPix
  149. ) {
  150. }
  151. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  152. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  153. let oldLeftEdgeStartPoint = {
  154. x: leftEdge.start.x,
  155. y: leftEdge.start.y,
  156. };
  157. let oldLeftEdgeEndPoint = {
  158. x: leftEdge.end.x,
  159. y: leftEdge.end.y,
  160. };
  161. let oldRightEdgeStartPoint = {
  162. x: rightEdge.start.x,
  163. y: rightEdge.start.y,
  164. };
  165. let oldRightEdgeEndPoint = {
  166. x: rightEdge.end.x,
  167. y: rightEdge.end.y,
  168. };
  169. let newRoad = null;
  170. if (dir == "start") {
  171. // 第一步把旧的road的另一端点对应的parent(旧的roadId)断开
  172. delete endPoint.parent[roadId];
  173. newRoad = this.create(pointId, road.endId);
  174. // 更新旧公路的end
  175. point.setPointParent(roadId, "end");
  176. road.endId = pointId;
  177. } else if (dir == "end") {
  178. delete startPoint.parent[roadId];
  179. newRoad = this.create(road.startId, pointId);
  180. //修改旧公路的start
  181. point.setPointParent(roadId, "start");
  182. road.startId = pointId;
  183. }
  184. if (road.way == Constant.oneWay) {
  185. newRoad.setWay(road.way);
  186. newRoad.singleRoadDrivewayCount = road.singleRoadDrivewayCount;
  187. } else if (road.way == Constant.twoWay) {
  188. newRoad.setWay(road.way);
  189. newRoad.leftDrivewayCount = road.leftDrivewayCount;
  190. newRoad.rightDrivewayCount = road.rightDrivewayCount;
  191. }
  192. // 更新断开后两个road之间的edge
  193. edgeService.updateEdgeForTwoRoad(roadId, newRoad.vectorId);
  194. // 需要更新crossPoints
  195. if (dir == "start") {
  196. let cpt = dataService.getCrossPointForEdgeId(road.leftEdgeId, "end");
  197. crossPointService.replaceEdgeId(cpt, road.leftEdgeId, newRoad.leftEdgeId);
  198. cpt = dataService.getCrossPointForEdgeId(road.rightEdgeId, "end");
  199. crossPointService.replaceEdgeId(
  200. cpt,
  201. road.rightEdgeId,
  202. newRoad.rightEdgeId
  203. );
  204. let newRoadLeftEdge = dataService.getRoadEdge(newRoad.leftEdgeId);
  205. mathUtil.clonePoint(newRoadLeftEdge.end, oldLeftEdgeEndPoint);
  206. let newRoadRightEdge = dataService.getRoadEdge(newRoad.rightEdgeId);
  207. mathUtil.clonePoint(newRoadRightEdge.end, oldRightEdgeEndPoint);
  208. if (Object.keys(startPoint).length > 1) {
  209. mathUtil.clonePoint(leftEdge.start, oldLeftEdgeStartPoint);
  210. mathUtil.clonePoint(rightEdge.start, oldRightEdgeStartPoint);
  211. }
  212. } else if (dir == "end") {
  213. let cpt = dataService.getCrossPointForEdgeId(road.leftEdgeId, "start");
  214. crossPointService.replaceEdgeId(cpt, road.leftEdgeId, newRoad.leftEdgeId);
  215. cpt = dataService.getCrossPointForEdgeId(road.rightEdgeId, "start");
  216. crossPointService.replaceEdgeId(
  217. cpt,
  218. road.rightEdgeId,
  219. newRoad.rightEdgeId
  220. );
  221. let newRoadLeftEdge = dataService.getRoadEdge(newRoad.leftEdgeId);
  222. mathUtil.clonePoint(newRoadLeftEdge.start, oldLeftEdgeStartPoint);
  223. let newRoadRightEdge = dataService.getRoadEdge(newRoad.rightEdgeId);
  224. mathUtil.clonePoint(newRoadRightEdge.start, oldRightEdgeStartPoint);
  225. if (Object.keys(endPoint).length > 1) {
  226. mathUtil.clonePoint(leftEdge.end, oldLeftEdgeEndPoint);
  227. mathUtil.clonePoint(rightEdge.end, oldRightEdgeEndPoint);
  228. }
  229. }
  230. return newRoad.vectorId;
  231. }
  232. // roadId的两个端点分别是pointId1,pointId2,获取这个roadId
  233. getRoadId(pointId1, pointId2) {
  234. const point1 = dataService.getRoadPoint(pointId1);
  235. const point2 = dataService.getRoadPoint(pointId2);
  236. // 公路可能删除了。
  237. if (!point1 || !point2) {
  238. console.warn("pointId1或者pointId2不存在");
  239. return null;
  240. }
  241. if (pointId1 == pointId2) {
  242. console.warn("给的是同一个point");
  243. return null;
  244. }
  245. const parent1 = point1.parent;
  246. const parent2 = point2.parent;
  247. for (const key in parent1) {
  248. if (parent2.hasOwnProperty(key)) {
  249. return key;
  250. }
  251. }
  252. return null;
  253. }
  254. getNeighPoints(pointId, exceptPointId) {
  255. let points = [];
  256. let point = dataService.getRoadPoint(pointId);
  257. for (let key in point.parent) {
  258. let road = dataService.getRoad(key);
  259. const otherPointId = road.getOtherPointId(pointId);
  260. if (exceptPointId && exceptPointId == otherPointId) {
  261. continue;
  262. }
  263. const otherPoint = dataService.getRoadPoint(otherPointId);
  264. points.push(otherPoint);
  265. }
  266. return points;
  267. }
  268. // id1和id2不相交
  269. AngleForRoad(id1, id2) {
  270. const road1 = dataService.getRoad(id1);
  271. const road2 = dataService.getRoad(id2);
  272. if (
  273. road1 == null ||
  274. road2 == null ||
  275. typeof road1 === "undefined" ||
  276. typeof road2 === "undefined"
  277. ) {
  278. return null;
  279. }
  280. const start1 = dataService.getRoadPoint(road1.startId);
  281. const end1 = dataService.getRoadPoint(road1.endId);
  282. const start2 = dataService.getRoadPoint(road2.startId);
  283. const end2 = dataService.getRoadPoint(road2.endId);
  284. const distance1 = mathUtil.getDistance(start1, start2);
  285. const distance2 = mathUtil.getDistance(start1, end2);
  286. const distance3 = mathUtil.getDistance(end1, start2);
  287. const distance4 = mathUtil.getDistance(end1, end2);
  288. const minDistance = Math.min(distance1, distance2, distance3, distance4);
  289. const join = mathUtil.getIntersectionPoint2(start1, end1, start2, end2);
  290. if (join == null) {
  291. return 180;
  292. }
  293. // start和start相交
  294. if (distance1 == minDistance) {
  295. end1.x += start2.x - start1.x;
  296. end1.y += start2.y - start1.y;
  297. return mathUtil.Angle(start2, end1, end2);
  298. } else if (distance2 == minDistance) {
  299. end1.x += end2.x - start1.x;
  300. end1.y += end2.y - start1.y;
  301. return mathUtil.Angle(end2, end1, start2);
  302. } else if (distance3 == minDistance) {
  303. start1.x += start2.x - end1.x;
  304. start1.y += start2.y - end1.y;
  305. return mathUtil.Angle(start2, start1, end2);
  306. } else if (distance4 == minDistance) {
  307. start1.x += end2.x - end1.x;
  308. start1.y += end2.y - end1.y;
  309. return mathUtil.Angle(end2, start1, start2);
  310. } else {
  311. console.error("AngleForRoad**************************1");
  312. return null;
  313. }
  314. }
  315. // 除了返回角度,还返回:id1对应的start,end和id2对应的另外一点组成的三角形,是顺时针还是逆时针
  316. AngleForRoad2(id1, id2) {
  317. const road1 = dataService.getRoad(id1);
  318. const road2 = dataService.getRoad(id2);
  319. if (
  320. road1 == null ||
  321. road2 == null ||
  322. typeof road1 === "undefined" ||
  323. typeof road2 === "undefined"
  324. ) {
  325. return null;
  326. }
  327. const start1 = dataService.getRoadPoint(road1.startId);
  328. const end1 = dataService.getRoadPoint(road1.endId);
  329. const start2 = dataService.getRoadPoint(road2.startId);
  330. const end2 = dataService.getRoadPoint(road2.endId);
  331. let angle = null;
  332. const points = [];
  333. points.push(start1);
  334. points.push(end1);
  335. if (road1.startId == road2.startId) {
  336. angle = mathUtil.Angle(start1, end1, end2);
  337. points.push(end2);
  338. } else if (road1.startId == road2.endId) {
  339. angle = mathUtil.Angle(start1, end1, start2);
  340. points.push(start2);
  341. } else if (road1.endId == road2.startId) {
  342. angle = mathUtil.Angle(end1, start1, end2);
  343. points[0] = end1;
  344. points[1] = start1;
  345. points.push(end2);
  346. } else if (road1.endId == road2.endId) {
  347. angle = mathUtil.Angle(end1, start1, start2);
  348. points[0] = end1;
  349. points[1] = start1;
  350. points.push(start2);
  351. }
  352. if (angle == null) {
  353. return null;
  354. } else {
  355. const flag = mathUtil.isClockwise(points);
  356. if (flag) {
  357. return {
  358. angle: angle,
  359. clockwise: 1,
  360. };
  361. } else {
  362. return {
  363. angle: angle,
  364. clockwise: 0,
  365. };
  366. }
  367. }
  368. }
  369. // id1的端点坐标不变
  370. AngleForRoad3(id1, id2) {
  371. const road1 = dataService.getRoad(id1);
  372. const road2 = dataService.getRoad(id2);
  373. if (
  374. road1 == null ||
  375. road2 == null ||
  376. typeof road1 === "undefined" ||
  377. typeof road2 === "undefined"
  378. ) {
  379. return null;
  380. }
  381. const start1 = dataService.getRoadPoint(road1.startId);
  382. const end1 = dataService.getRoadPoint(road1.endId);
  383. const start2 = dataService.getRoadPoint(road2.startId);
  384. const end2 = dataService.getRoadPoint(road2.endId);
  385. const distance1 = mathUtil.getDistance(start1, start2);
  386. const distance2 = mathUtil.getDistance(start1, end2);
  387. const distance3 = mathUtil.getDistance(end1, start2);
  388. const distance4 = mathUtil.getDistance(end1, end2);
  389. const minDistance = Math.min(distance1, distance2, distance3, distance4);
  390. const _start1 = {};
  391. const _end1 = {};
  392. // start和start相交
  393. if (distance1 == minDistance) {
  394. _end1.x = end1.x + start2.x - start1.x;
  395. _end1.y = end1.y + start2.y - start1.y;
  396. return mathUtil.Angle(start2, _end1, end2);
  397. } else if (distance2 == minDistance) {
  398. _end1.x = end1.x + end2.x - start1.x;
  399. _end1.y = end1.y + end2.y - start1.y;
  400. return mathUtil.Angle(end2, _end1, start2);
  401. } else if (distance3 == minDistance) {
  402. _start1.x = start1.x + start2.x - end1.x;
  403. _start1.y = start1.y + start2.y - end1.y;
  404. return mathUtil.Angle(start2, _start1, end2);
  405. } else if (distance4 == minDistance) {
  406. _start1.x = start1.x + end2.x - end1.x;
  407. _start1.y = start1.y + end2.y - end1.y;
  408. return mathUtil.Angle(end2, _start1, start2);
  409. } else {
  410. console.error(
  411. "RoadService.AngleForRoad3************************************1"
  412. );
  413. return null;
  414. }
  415. }
  416. // pointId的parent超过两个
  417. // 获取最小角度(顺时针和逆时针)
  418. // 可能缺顺时针或者逆时针,这时候对应的取最大角度的逆时针或者顺时针
  419. roadIdForMinAngle(pointId, roadId) {
  420. const point = dataService.getRoadPoint(pointId);
  421. const parent = point.parent;
  422. let minAngle0 = null;
  423. let maxAngle0 = null; // 可能minAngle1不存在,这时候要找逆时针最大的
  424. let minAngle1 = null;
  425. let maxAngle1 = null;
  426. let minInfo0, minInfo1;
  427. let maxInfo0, maxInfo1;
  428. if (Object.keys(parent).length > 2) {
  429. for (const key in parent) {
  430. if (key == roadId) {
  431. continue;
  432. }
  433. const angleInfo = this.AngleForRoad2(roadId, key);
  434. if (minAngle1 == null && angleInfo.clockwise == 1) {
  435. minInfo1 = angleInfo;
  436. minInfo1.roadId = key;
  437. minAngle1 = angleInfo.angle;
  438. maxInfo1 = angleInfo;
  439. maxInfo1.roadId = key;
  440. maxAngle1 = angleInfo.angle;
  441. } else if (minAngle1 > angleInfo.angle && angleInfo.clockwise == 1) {
  442. minInfo1 = angleInfo;
  443. minInfo1.roadId = key;
  444. minAngle1 = angleInfo.angle;
  445. } else if (maxAngle1 < angleInfo.angle && angleInfo.clockwise == 1) {
  446. maxInfo1 = angleInfo;
  447. maxInfo1.roadId = key;
  448. maxAngle1 = angleInfo.angle;
  449. } else if (minAngle0 == null && angleInfo.clockwise == 0) {
  450. minInfo0 = angleInfo;
  451. minInfo0.roadId = key;
  452. minAngle0 = angleInfo.angle;
  453. maxInfo0 = angleInfo;
  454. maxInfo0.roadId = key;
  455. maxAngle0 = angleInfo.angle;
  456. } else if (minAngle0 > angleInfo.angle && angleInfo.clockwise == 0) {
  457. minInfo0 = angleInfo;
  458. minInfo0.roadId = key;
  459. minAngle0 = angleInfo.angle;
  460. } else if (maxAngle0 < angleInfo.angle && angleInfo.clockwise == 0) {
  461. maxInfo0 = angleInfo;
  462. maxInfo0.roadId = key;
  463. maxAngle0 = angleInfo.angle;
  464. }
  465. }
  466. const result = {
  467. min0: minInfo0,
  468. min1: minInfo1,
  469. };
  470. if (!result.min0) {
  471. result.min0 = maxInfo1;
  472. result.min0.angle = 360 - maxInfo1.angle;
  473. }
  474. if (!result.min1) {
  475. result.min1 = maxInfo0;
  476. result.min1.angle = 360 - maxInfo0.angle;
  477. }
  478. return result;
  479. } else {
  480. console.error(
  481. "roadIdForMinAngle*********************************************************"
  482. );
  483. return null;
  484. }
  485. }
  486. isRoadLink(roadId1, roadId2) {
  487. let road1 = dataService.getRoad(roadId1);
  488. let road2 = dataService.getRoad(roadId2);
  489. if (
  490. road1.startId == road2.startId ||
  491. road1.startId == road2.endId ||
  492. road1.endId == road2.startId ||
  493. road1.endId == road2.endId
  494. ) {
  495. return true;
  496. } else {
  497. return false;
  498. }
  499. }
  500. //point在road所在的线上,只是不确定是否在线段上
  501. isContain(road, point) {
  502. const startPoint = dataService.getRoadPoint(road.startId);
  503. const endPoint = dataService.getRoadPoint(road.endId);
  504. const minDis = Constant.minAdsorbPix / 2;
  505. return mathUtil.isContainForSegment(point, startPoint, endPoint, minDis);
  506. }
  507. getDirction(pointId, roadId) {
  508. const road = dataService.getRoad(roadId);
  509. if (road.startId == pointId) {
  510. return "start";
  511. } else if (road.endId == pointId) {
  512. return "end";
  513. } else {
  514. console.error(
  515. "RoadService.getDirction*******************************************************************************************"
  516. );
  517. return null;
  518. }
  519. }
  520. subtraRoadFromIntersect(pointId, roadId) {
  521. const point = dataService.getRoadPoint(pointId);
  522. const parent = point.getParent();
  523. const dir = this.getDirction(pointId, roadId);
  524. if (Object.keys(parent).length == 1) {
  525. return;
  526. } else if (Object.keys(parent).length > 2) {
  527. const info = this.roadIdForMinAngle(pointId, roadId);
  528. edgeService.updateSingleEdgeForTwoRoad(
  529. info.min0.roadId,
  530. info.min1.roadId
  531. );
  532. }
  533. // 第一步先断开链接
  534. delete parent[roadId];
  535. // 第二步先新建端点
  536. const newPoint = roadPointService.create(point);
  537. // 第三步建立链接
  538. newPoint.setPointParent(roadId, dir);
  539. this.setRoadPointId(roadId, newPoint.vectorId, dir);
  540. // 第四步更新Edge
  541. edgeService.updateDefaultEdge(roadId, dir);
  542. this.setLanes(roadId, null, dir);
  543. }
  544. deleteRoadForLinked(roadId) {
  545. const road = dataService.getRoad(roadId);
  546. this.subtraRoadFromIntersect(road.startId, roadId);
  547. this.subtraRoadFromIntersect(road.endId, roadId);
  548. dataService.deleteRoad(roadId);
  549. dataService.deleteCrossPointForEdge(road.leftEdgeId, "start");
  550. dataService.deleteCrossPointForEdge(road.leftEdgeId, "end");
  551. dataService.deleteCrossPointForEdge(road.rightEdgeId, "start");
  552. dataService.deleteCrossPointForEdge(road.rightEdgeId, "end");
  553. }
  554. setRoadPointId(roadId, pointId, dir) {
  555. const vectorInfo = {};
  556. vectorInfo.roadId = roadId;
  557. vectorInfo.dir = dir;
  558. vectorInfo.pointId = pointId;
  559. this.setRoadInfo(vectorInfo);
  560. }
  561. setRoadInfo(vectorInfo) {
  562. const road = dataService.getRoad(vectorInfo.roadId);
  563. if (
  564. vectorInfo.hasOwnProperty("edgeId") &&
  565. vectorInfo.hasOwnProperty("dir")
  566. ) {
  567. if (vectorInfo.dir == "left") {
  568. road.leftEdgeId = vectorInfo.edgeId;
  569. } else if (vectorInfo.dir == "right") {
  570. road.rightEdgeId = vectorInfo.edgeId;
  571. }
  572. }
  573. if (
  574. vectorInfo.hasOwnProperty("pointId") &&
  575. vectorInfo.hasOwnProperty("dir")
  576. ) {
  577. if (vectorInfo.dir == "start") {
  578. road.startId = vectorInfo.pointId;
  579. } else if (vectorInfo.dir == "end") {
  580. road.endId = vectorInfo.pointId;
  581. }
  582. }
  583. }
  584. AngleForRoad2(id1, id2) {
  585. let road1 = dataService.getRoad(id1);
  586. let road2 = dataService.getRoad(id2);
  587. if (
  588. road1 == null ||
  589. road2 == null ||
  590. typeof road1 == "undefined" ||
  591. typeof road2 == "undefined"
  592. ) {
  593. return null;
  594. }
  595. let start1 = dataService.getRoadPoint(road1.startId);
  596. let end1 = dataService.getRoadPoint(road1.endId);
  597. let start2 = dataService.getRoadPoint(road2.startId);
  598. let end2 = dataService.getRoadPoint(road2.endId);
  599. let angle = null;
  600. let points = [];
  601. points.push(start1);
  602. points.push(end1);
  603. if (road1.startId == road2.startId) {
  604. angle = mathUtil.Angle(start1, end1, end2);
  605. points.push(end2);
  606. } else if (road1.startId == road2.endId) {
  607. angle = mathUtil.Angle(start1, end1, start2);
  608. points.push(start2);
  609. } else if (road1.endId == road2.startId) {
  610. angle = mathUtil.Angle(end1, start1, end2);
  611. points[0] = end1;
  612. points[1] = start1;
  613. points.push(end2);
  614. } else if (road1.endId == road2.endId) {
  615. angle = mathUtil.Angle(end1, start1, start2);
  616. points[0] = end1;
  617. points[1] = start1;
  618. points.push(start2);
  619. }
  620. if (angle == null) {
  621. return null;
  622. } else {
  623. let flag = mathUtil.isClockwise(points);
  624. if (flag) {
  625. return {
  626. angle: angle,
  627. clockwise: 1,
  628. };
  629. } else {
  630. return {
  631. angle: angle,
  632. clockwise: 0,
  633. };
  634. }
  635. }
  636. }
  637. //pointId的parent超过两个
  638. //获取最小角度(顺时针和逆时针)
  639. //可能缺顺时针或者逆时针,这时候对应的取最大角度的逆时针或者顺时针
  640. roadIdForMinAngle(pointId, roadId) {
  641. let point = dataService.getRoadPoint(pointId);
  642. let parent = point.getParent();
  643. let minAngle0 = null;
  644. let maxAngle0 = null; //可能minAngle1不存在,这时候要找逆时针最大的
  645. let minAngle1 = null;
  646. let maxAngle1 = null;
  647. let minInfo0, minInfo1;
  648. let maxInfo0, maxInfo1;
  649. if (Object.keys(parent).length > 2) {
  650. for (let key in parent) {
  651. if (key == roadId) {
  652. continue;
  653. }
  654. let angleInfo = this.AngleForRoad2(roadId, key);
  655. if (minAngle1 == null && angleInfo.clockwise == 1) {
  656. minInfo1 = angleInfo;
  657. minInfo1.roadId = key;
  658. minAngle1 = angleInfo.angle;
  659. maxInfo1 = angleInfo;
  660. maxInfo1.roadId = key;
  661. maxAngle1 = angleInfo.angle;
  662. } else if (minAngle1 > angleInfo.angle && angleInfo.clockwise == 1) {
  663. minInfo1 = angleInfo;
  664. minInfo1.roadId = key;
  665. minAngle1 = angleInfo.angle;
  666. } else if (maxAngle1 < angleInfo.angle && angleInfo.clockwise == 1) {
  667. maxInfo1 = angleInfo;
  668. maxInfo1.roadId = key;
  669. maxAngle1 = angleInfo.angle;
  670. } else if (minAngle0 == null && angleInfo.clockwise == 0) {
  671. minInfo0 = angleInfo;
  672. minInfo0.roadId = key;
  673. minAngle0 = angleInfo.angle;
  674. maxInfo0 = angleInfo;
  675. maxInfo0.roadId = key;
  676. maxAngle0 = angleInfo.angle;
  677. } else if (minAngle0 > angleInfo.angle && angleInfo.clockwise == 0) {
  678. minInfo0 = angleInfo;
  679. minInfo0.roadId = key;
  680. minAngle0 = angleInfo.angle;
  681. } else if (maxAngle0 < angleInfo.angle && angleInfo.clockwise == 0) {
  682. maxInfo0 = angleInfo;
  683. maxInfo0.roadId = key;
  684. maxAngle0 = angleInfo.angle;
  685. }
  686. }
  687. let result = {
  688. min0: minInfo0,
  689. min1: minInfo1,
  690. };
  691. if (!result.min0) {
  692. result.min0 = maxInfo1;
  693. result.min0.angle = 360 - maxInfo1.angle;
  694. }
  695. if (!result.min1) {
  696. result.min1 = maxInfo0;
  697. result.min1.angle = 360 - maxInfo0.angle;
  698. }
  699. return result;
  700. } else {
  701. console.error(
  702. "roadIdForMinAngle*********************************************************"
  703. );
  704. return null;
  705. }
  706. }
  707. getDirction(pointId, roadId) {
  708. let road = dataService.getRoad(roadId);
  709. if (road.startId == pointId) {
  710. return "start";
  711. } else if (road.endId == pointId) {
  712. return "end";
  713. } else {
  714. console.error(
  715. "getDirction*******************************************************************************************"
  716. );
  717. return null;
  718. }
  719. }
  720. //pointId的parent超过两个
  721. //获取最小角度(顺时针和逆时针)
  722. //可能缺顺时针或者逆时针,这时候对应的取最大角度的逆时针或者顺时针
  723. roadIdForMinAngle(pointId, roadId) {
  724. let point = dataService.getRoadPoint(pointId);
  725. let parent = point.parent;
  726. let minAngle0 = null;
  727. let maxAngle0 = null; //可能minAngle1不存在,这时候要找逆时针最大的
  728. let minAngle1 = null;
  729. let maxAngle1 = null;
  730. let minInfo0, minInfo1;
  731. let maxInfo0, maxInfo1;
  732. if (Object.keys(parent).length > 2) {
  733. for (let key in parent) {
  734. if (key == roadId) {
  735. continue;
  736. }
  737. let angleInfo = this.AngleForRoad2(roadId, key);
  738. if (minAngle1 == null && angleInfo.clockwise == 1) {
  739. minInfo1 = angleInfo;
  740. minInfo1.roadId = key;
  741. minAngle1 = angleInfo.angle;
  742. maxInfo1 = angleInfo;
  743. maxInfo1.roadId = key;
  744. maxAngle1 = angleInfo.angle;
  745. } else if (minAngle1 > angleInfo.angle && angleInfo.clockwise == 1) {
  746. minInfo1 = angleInfo;
  747. minInfo1.roadId = key;
  748. minAngle1 = angleInfo.angle;
  749. } else if (maxAngle1 < angleInfo.angle && angleInfo.clockwise == 1) {
  750. maxInfo1 = angleInfo;
  751. maxInfo1.roadId = key;
  752. maxAngle1 = angleInfo.angle;
  753. } else if (minAngle0 == null && angleInfo.clockwise == 0) {
  754. minInfo0 = angleInfo;
  755. minInfo0.roadId = key;
  756. minAngle0 = angleInfo.angle;
  757. maxInfo0 = angleInfo;
  758. maxInfo0.roadId = key;
  759. maxAngle0 = angleInfo.angle;
  760. } else if (minAngle0 > angleInfo.angle && angleInfo.clockwise == 0) {
  761. minInfo0 = angleInfo;
  762. minInfo0.roadId = key;
  763. minAngle0 = angleInfo.angle;
  764. } else if (maxAngle0 < angleInfo.angle && angleInfo.clockwise == 0) {
  765. maxInfo0 = angleInfo;
  766. maxInfo0.roadId = key;
  767. maxAngle0 = angleInfo.angle;
  768. }
  769. }
  770. let result = {
  771. min0: minInfo0,
  772. min1: minInfo1,
  773. };
  774. if (!result.min0) {
  775. result.min0 = maxInfo1;
  776. result.min0.angle = 360 - maxInfo1.angle;
  777. }
  778. if (!result.min1) {
  779. result.min1 = maxInfo0;
  780. result.min1.angle = 360 - maxInfo0.angle;
  781. }
  782. return result;
  783. } else {
  784. console.error(
  785. "roadIdForMinAngle*********************************************************"
  786. );
  787. return null;
  788. }
  789. }
  790. deleteRoad(roadId) {
  791. const road = dataService.getRoad(roadId);
  792. let startPoint = dataService.getRoadPoint(road.startId);
  793. let endPoint = dataService.getRoadPoint(road.endId);
  794. if (Object.keys(startPoint.getParent()).length > 2) {
  795. this.subtraRoadFromIntersect(road.startId, roadId);
  796. }
  797. if (Object.keys(endPoint.getParent()).length > 2) {
  798. this.subtraRoadFromIntersect(road.endId, roadId);
  799. }
  800. }
  801. /****************************************************************************************************************************************************************/
  802. // updateDrivewayCount(roadId, dir, type) {
  803. // let road = dataService.getRoad(roadId);
  804. // if (dir == "left") {
  805. // if (type == "add") {
  806. // ++road.leftDrivewayCount;
  807. // } else if (type == "sub") {
  808. // --road.leftDrivewayCount;
  809. // if (road.leftDrivewayCount < 0) {
  810. // road.leftDrivewayCount = 0;
  811. // }
  812. // }
  813. // } else if (dir == "right") {
  814. // if (type == "add") {
  815. // ++road.rightDrivewayCount;
  816. // } else if (type == "sub") {
  817. // --road.rightDrivewayCount;
  818. // if (road.rightDrivewayCount < 0) {
  819. // road.rightDrivewayCount = 0;
  820. // }
  821. // }
  822. // }
  823. // }
  824. //设置中间带
  825. setMidDivide(roadId, dir) {
  826. const road = dataService.getRoad(roadId);
  827. const startPoint = dataService.getRoadPoint(road.startId);
  828. const endPoint = dataService.getRoadPoint(road.endId);
  829. const leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  830. const rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  831. //离中心最近的点才是中间带的起点和终点
  832. const mid = {
  833. x: (startPoint.x + endPoint.x) / 2,
  834. y: (startPoint.y + endPoint.y) / 2,
  835. };
  836. let line = this.getMidLine(road);
  837. const startJoin1 = mathUtil.getJoinLinePoint(leftEdge.start, line);
  838. const startJoin2 = mathUtil.getJoinLinePoint(rightEdge.start, line);
  839. const distance1 = mathUtil.getDistance(startJoin1, mid);
  840. const distance2 = mathUtil.getDistance(startJoin2, mid);
  841. let laneStart, laneEnd, join;
  842. if (!dir || dir == "start") {
  843. if (distance1 > distance2) {
  844. laneStart = {
  845. x: startJoin2.x,
  846. y: startJoin2.y,
  847. };
  848. } else {
  849. laneStart = {
  850. x: startJoin1.x,
  851. y: startJoin1.y,
  852. };
  853. }
  854. if (road.way == Constant.twoWay) {
  855. //更新车道的起点和终点,因为车道的起点和终点的位置与中间隔离栏一致
  856. for (let i = 0; i < road.leftLanes.length; ++i) {
  857. line = mathUtil.createLine1(
  858. road.leftLanes[i].start,
  859. road.leftLanes[i].end
  860. );
  861. join = mathUtil.getJoinLinePoint(laneStart, line);
  862. mathUtil.clonePoint(road.leftLanes[i].start, join);
  863. }
  864. for (let i = 0; i < road.rightLanes.length; ++i) {
  865. line = mathUtil.createLine1(
  866. road.rightLanes[i].start,
  867. road.rightLanes[i].end
  868. );
  869. join = mathUtil.getJoinLinePoint(laneStart, line);
  870. mathUtil.clonePoint(road.rightLanes[i].start, join);
  871. }
  872. line = mathUtil.createLine1(
  873. road.midDivide.leftMidDivide.start,
  874. road.midDivide.leftMidDivide.end
  875. );
  876. join = mathUtil.getJoinLinePoint(laneStart, line);
  877. mathUtil.clonePoint(road.midDivide.leftMidDivide.start, join);
  878. line = mathUtil.createLine1(
  879. road.midDivide.rightMidDivide.start,
  880. road.midDivide.rightMidDivide.end
  881. );
  882. join = mathUtil.getJoinLinePoint(laneStart, line);
  883. mathUtil.clonePoint(road.midDivide.rightMidDivide.start, join);
  884. } else if (road.way == Constant.oneWay) {
  885. for (let i = 0; i < road.singleLanes.length; ++i) {
  886. const line = mathUtil.createLine1(
  887. road.singleLanes[i].start,
  888. road.singleLanes[i].end
  889. );
  890. const join = mathUtil.getJoinLinePoint(laneStart, line);
  891. mathUtil.clonePoint(road.singleLanes[i].start, join);
  892. }
  893. }
  894. }
  895. const endJoin1 = mathUtil.getJoinLinePoint(leftEdge.end, line);
  896. const endJoin2 = mathUtil.getJoinLinePoint(rightEdge.end, line);
  897. const distance3 = mathUtil.getDistance(endJoin1, mid);
  898. const distance4 = mathUtil.getDistance(endJoin2, mid);
  899. if (!dir || dir == "end") {
  900. if (distance3 > distance4) {
  901. laneEnd = {
  902. x: endJoin2.x,
  903. y: endJoin2.y,
  904. };
  905. } else {
  906. laneEnd = {
  907. x: endJoin1.x,
  908. y: endJoin1.y,
  909. };
  910. }
  911. if (road.way == Constant.twoWay) {
  912. //更新车道的起点和终点,因为车道的起点和终点的位置与中间隔离栏一致
  913. for (let i = 0; i < road.leftLanes.length; ++i) {
  914. line = mathUtil.createLine1(
  915. road.leftLanes[i].start,
  916. road.leftLanes[i].end
  917. );
  918. join = mathUtil.getJoinLinePoint(laneEnd, line);
  919. mathUtil.clonePoint(road.leftLanes[i].end, join);
  920. }
  921. for (let i = 0; i < road.rightLanes.length; ++i) {
  922. line = mathUtil.createLine1(
  923. road.rightLanes[i].start,
  924. road.rightLanes[i].end
  925. );
  926. join = mathUtil.getJoinLinePoint(laneEnd, line);
  927. mathUtil.clonePoint(road.rightLanes[i].end, join);
  928. }
  929. line = mathUtil.createLine1(
  930. road.midDivide.leftMidDivide.start,
  931. road.midDivide.leftMidDivide.end
  932. );
  933. join = mathUtil.getJoinLinePoint(laneEnd, line);
  934. mathUtil.clonePoint(road.midDivide.leftMidDivide.end, join);
  935. line = mathUtil.createLine1(
  936. road.midDivide.rightMidDivide.start,
  937. road.midDivide.rightMidDivide.end
  938. );
  939. join = mathUtil.getJoinLinePoint(laneEnd, line);
  940. mathUtil.clonePoint(road.midDivide.rightMidDivide.end, join);
  941. } else if (road.way == Constant.oneWay) {
  942. for (let i = 0; i < road.singleLanes.length; ++i) {
  943. const line = mathUtil.createLine1(
  944. road.singleLanes[i].start,
  945. road.singleLanes[i].end
  946. );
  947. const join = mathUtil.getJoinLinePoint(laneEnd, line);
  948. mathUtil.clonePoint(road.singleLanes[i].end, join);
  949. }
  950. }
  951. }
  952. }
  953. //设置车道
  954. //dir1表示left或者right,dir2表示start或者end
  955. //单车道不考虑dir1
  956. setLanes(roadId, dir1, dir2) {
  957. let road = dataService.getRoad(roadId);
  958. if(!road){
  959. return
  960. }
  961. if (road.way == Constant.oneWay) {
  962. this.setOneWayLanes(road, dir1, dir2);
  963. } else if (road.way == Constant.twoWay) {
  964. this.setTwoWayLanes(road, dir1, dir2);
  965. }
  966. }
  967. //单向车道
  968. setOneWayLanes(road, dir1, dir2) {
  969. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  970. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  971. const drivewayCount = road.singleRoadDrivewayCount;
  972. let dx1 = (leftEdge.start.x - rightEdge.start.x) / drivewayCount;
  973. let dy1 = (leftEdge.start.y - rightEdge.start.y) / drivewayCount;
  974. let dx2 = (leftEdge.end.x - rightEdge.end.x) / drivewayCount;
  975. let dy2 = (leftEdge.end.y - rightEdge.end.y) / drivewayCount;
  976. road.singleLanes = [];
  977. for (let i = 0; i < drivewayCount - 1; ++i) {
  978. if (!road.singleLanes[i]) {
  979. road.singleLanes[i] = {};
  980. }
  981. if (dir2 == "start" || !dir2) {
  982. road.singleLanes[i].start = {};
  983. road.singleLanes[i].start.x = rightEdge.start.x + dx1 * (i + 1);
  984. road.singleLanes[i].start.y = rightEdge.start.y + dy1 * (i + 1);
  985. }
  986. if (dir2 == "end" || !dir2) {
  987. road.singleLanes[i].end = {};
  988. road.singleLanes[i].end.x = rightEdge.end.x + dx2 * (i + 1);
  989. road.singleLanes[i].end.y = rightEdge.end.y + dy2 * (i + 1);
  990. }
  991. }
  992. }
  993. //双向车道
  994. setTwoWayLanes(road, dir1, dir2) {
  995. let startPoint = dataService.getRoadPoint(road.startId);
  996. let endPoint = dataService.getRoadPoint(road.endId);
  997. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  998. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  999. if (!road.midDivide) {
  1000. road.midDivide = {
  1001. leftMidDivide: {},
  1002. rightMidDivide: {},
  1003. };
  1004. }
  1005. const leftCount = road.leftDrivewayCount;
  1006. const rightCount = road.rightDrivewayCount;
  1007. const leftRatio =
  1008. road.leftWidth / (road.leftWidth + road.midDivide.midDivideWidth / 2);
  1009. const rightRatio =
  1010. road.rightWidth / (road.rightWidth + road.midDivide.midDivideWidth / 2);
  1011. let leftdx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / leftCount;
  1012. let leftdy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / leftCount;
  1013. let leftdx2 = ((leftEdge.end.x - endPoint.x) * leftRatio) / leftCount;
  1014. let leftdy2 = ((leftEdge.end.y - endPoint.y) * leftRatio) / leftCount;
  1015. let rightdx1 =
  1016. ((rightEdge.start.x - startPoint.x) * rightRatio) / rightCount;
  1017. let rightdy1 =
  1018. ((rightEdge.start.y - startPoint.y) * rightRatio) / rightCount;
  1019. let rightdx2 = ((rightEdge.end.x - endPoint.x) * rightRatio) / rightCount;
  1020. let rightdy2 = ((rightEdge.end.y - endPoint.y) * rightRatio) / rightCount;
  1021. if (dir1 == "left" || !dir1) {
  1022. let middx1 = (leftEdge.start.x - startPoint.x) * (1 - leftRatio);
  1023. let middy1 = (leftEdge.start.y - startPoint.y) * (1 - leftRatio);
  1024. let middx2 = (leftEdge.end.x - endPoint.x) * (1 - leftRatio);
  1025. let middy2 = (leftEdge.end.y - endPoint.y) * (1 - leftRatio);
  1026. for (let i = 0; i < leftCount - 1; ++i) {
  1027. if (!road.leftLanes[i]) {
  1028. road.leftLanes[i] = {};
  1029. }
  1030. if (dir2 == "start" || !dir2) {
  1031. road.leftLanes[i].start = {};
  1032. road.leftLanes[i].start.x = startPoint.x + middx1 + leftdx1 * (i + 1);
  1033. road.leftLanes[i].start.y = startPoint.y + middy1 + leftdy1 * (i + 1);
  1034. road.midDivide.leftMidDivide.start = {};
  1035. road.midDivide.leftMidDivide.start.x = startPoint.x + middx1;
  1036. road.midDivide.leftMidDivide.start.y = startPoint.y + middy1;
  1037. }
  1038. if (dir2 == "end" || !dir2) {
  1039. road.leftLanes[i].end = {};
  1040. road.leftLanes[i].end.x = endPoint.x + middx2 + leftdx2 * (i + 1);
  1041. road.leftLanes[i].end.y = endPoint.y + middy2 + leftdy2 * (i + 1);
  1042. road.midDivide.leftMidDivide.end = {};
  1043. road.midDivide.leftMidDivide.end.x = endPoint.x + middx1;
  1044. road.midDivide.leftMidDivide.end.y = endPoint.y + middy2;
  1045. }
  1046. }
  1047. if (dir2 == "start" || !dir2) {
  1048. road.midDivide.leftMidDivide.start = {};
  1049. road.midDivide.leftMidDivide.start.x = startPoint.x + middx1;
  1050. road.midDivide.leftMidDivide.start.y = startPoint.y + middy1;
  1051. }
  1052. if (dir2 == "end" || !dir2) {
  1053. road.midDivide.leftMidDivide.end = {};
  1054. road.midDivide.leftMidDivide.end.x = endPoint.x + middx2;
  1055. road.midDivide.leftMidDivide.end.y = endPoint.y + middy2;
  1056. }
  1057. road.leftLanes.splice(leftCount - 1);
  1058. }
  1059. if (dir1 == "right" || !dir1) {
  1060. let middx1 = (rightEdge.start.x - startPoint.x) * (1 - rightRatio);
  1061. let middy1 = (rightEdge.start.y - startPoint.y) * (1 - rightRatio);
  1062. let middx2 = (rightEdge.end.x - endPoint.x) * (1 - rightRatio);
  1063. let middy2 = (rightEdge.end.y - endPoint.y) * (1 - rightRatio);
  1064. for (let i = 0; i < rightCount - 1; ++i) {
  1065. if (!road.rightLanes[i]) {
  1066. road.rightLanes[i] = {};
  1067. }
  1068. if (dir2 == "start" || !dir2) {
  1069. road.rightLanes[i].start = {};
  1070. road.rightLanes[i].start.x =
  1071. startPoint.x + middx1 + rightdx1 * (i + 1);
  1072. road.rightLanes[i].start.y =
  1073. startPoint.y + middy1 + rightdy1 * (i + 1);
  1074. road.midDivide.rightMidDivide.start = {};
  1075. road.midDivide.rightMidDivide.start.x = startPoint.x + middx1;
  1076. road.midDivide.rightMidDivide.start.y = startPoint.y + middy1;
  1077. }
  1078. if (dir2 == "end" || !dir2) {
  1079. road.rightLanes[i].end = {};
  1080. road.rightLanes[i].end.x = endPoint.x + middx2 + rightdx2 * (i + 1);
  1081. road.rightLanes[i].end.y = endPoint.y + middy2 + rightdy2 * (i + 1);
  1082. road.midDivide.rightMidDivide.end = {};
  1083. road.midDivide.rightMidDivide.end.x = endPoint.x + middx2;
  1084. road.midDivide.rightMidDivide.end.y = endPoint.y + middy2;
  1085. }
  1086. }
  1087. if (dir2 == "start" || !dir2) {
  1088. road.midDivide.rightMidDivide.start = {};
  1089. road.midDivide.rightMidDivide.start.x = startPoint.x + middx1;
  1090. road.midDivide.rightMidDivide.start.y = startPoint.y + middy1;
  1091. }
  1092. if (dir2 == "end" || !dir2) {
  1093. road.midDivide.rightMidDivide.end = {};
  1094. road.midDivide.rightMidDivide.end.x = endPoint.x + middx2;
  1095. road.midDivide.rightMidDivide.end.y = endPoint.y + middy2;
  1096. }
  1097. road.rightLanes.splice(rightCount - 1);
  1098. }
  1099. this.setMidDivide(road.vectorId);
  1100. }
  1101. // singleToMullane(road) {
  1102. // road.leftDrivewayCount = 1;
  1103. // road.rightDrivewayCount = 1;
  1104. // this.setMidDivide(road.vectorId);
  1105. // this.setLanes(road.vectorId);
  1106. // }
  1107. //多车道转单车道
  1108. mulToSinglelane(road) {
  1109. if (road.leftDrivewayCount > 0) {
  1110. this.updateForAddSubtractLanesCount(road.vectorId, 1, "left");
  1111. }
  1112. if (road.rightDrivewayCount > 0) {
  1113. this.updateForAddSubtractLanesCount(road.vectorId, 1, "right");
  1114. }
  1115. road.leftDrivewayCount = 0;
  1116. road.rightDrivewayCount = 0;
  1117. road.leftLanes = [];
  1118. road.rightLanes = [];
  1119. this.setMidDivide(road.vectorId);
  1120. }
  1121. //删除或者减少车道
  1122. //需要考虑车道个数是0(左或者右)的情况
  1123. //单向车道不考虑dir,即:均匀的增加或者删除车道
  1124. updateForAddSubtractLanesCount(roadId, newCount, dir) {
  1125. let dx1,
  1126. dy1,
  1127. dx2,
  1128. dy2,
  1129. oldCount,
  1130. edgeStartPosition,
  1131. edgeEndPosition,
  1132. leftRatio,
  1133. rightRatio,
  1134. middx1,
  1135. middy1,
  1136. middx2,
  1137. middy2;
  1138. let road = dataService.getRoad(roadId);
  1139. if (newCount < 1) {
  1140. return;
  1141. }
  1142. let startPoint = dataService.getRoadPoint(road.startId);
  1143. let endPoint = dataService.getRoadPoint(road.endId);
  1144. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1145. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1146. if (road.way == Constant.twoWay) {
  1147. leftRatio =
  1148. road.leftWidth / (road.leftWidth + road.midDivide.midDivideWidth / 2);
  1149. rightRatio =
  1150. road.rightWidth / (road.rightWidth + road.midDivide.midDivideWidth / 2);
  1151. if (dir == "left") {
  1152. oldCount = road.leftDrivewayCount;
  1153. if (oldCount != 0) {
  1154. dx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / oldCount;
  1155. dy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / oldCount;
  1156. dx2 = ((leftEdge.end.x - endPoint.x) * leftRatio) / oldCount;
  1157. dy2 = ((leftEdge.end.y - endPoint.y) * leftRatio) / oldCount;
  1158. }
  1159. middx1 = (leftEdge.start.x - startPoint.x) * (1 - leftRatio);
  1160. middy1 = (leftEdge.start.y - startPoint.y) * (1 - leftRatio);
  1161. middx2 = (leftEdge.end.x - endPoint.x) * (1 - leftRatio);
  1162. middy2 = (leftEdge.end.y - endPoint.y) * (1 - leftRatio);
  1163. road.leftDrivewayCount = newCount;
  1164. } else if (dir == "right") {
  1165. oldCount = road.rightDrivewayCount;
  1166. if (oldCount != 0) {
  1167. dx1 = ((rightEdge.start.x - startPoint.x) * rightRatio) / oldCount;
  1168. dy1 = ((rightEdge.start.y - startPoint.y) * rightRatio) / oldCount;
  1169. dx2 = ((rightEdge.end.x - endPoint.x) * rightRatio) / oldCount;
  1170. dy2 = ((rightEdge.end.y - endPoint.y) * rightRatio) / oldCount;
  1171. }
  1172. middx1 = (rightEdge.start.x - startPoint.x) * (1 - rightRatio);
  1173. middy1 = (rightEdge.start.y - startPoint.y) * (1 - rightRatio);
  1174. middx2 = (rightEdge.end.x - endPoint.x) * (1 - rightRatio);
  1175. middy2 = (rightEdge.end.y - endPoint.y) * (1 - rightRatio);
  1176. road.rightDrivewayCount = newCount;
  1177. }
  1178. }
  1179. if (newCount == oldCount) {
  1180. return;
  1181. } else if (newCount == 0) {
  1182. this.mulToSinglelane(road);
  1183. return;
  1184. } else if (oldCount == 0) {
  1185. this.singleToMullane(road);
  1186. return;
  1187. }
  1188. if (road.way == Constant.twoWay) {
  1189. edgeStartPosition = {
  1190. x: startPoint.x + middx1 + dx1 * newCount,
  1191. y: startPoint.y + middy1 + dy1 * newCount,
  1192. };
  1193. edgeEndPosition = {
  1194. x: endPoint.x + middx2 + dx2 * newCount,
  1195. y: endPoint.y + middy2 + dy2 * newCount,
  1196. };
  1197. if (dir == "left") {
  1198. mathUtil.clonePoint(leftEdge.start, edgeStartPosition);
  1199. mathUtil.clonePoint(leftEdge.end, edgeEndPosition);
  1200. } else if (dir == "right") {
  1201. mathUtil.clonePoint(rightEdge.start, edgeStartPosition);
  1202. mathUtil.clonePoint(rightEdge.end, edgeEndPosition);
  1203. }
  1204. let line = this.getMidLine(road);
  1205. if (dir == "left") {
  1206. let join = mathUtil.getJoinLinePoint(leftEdge.start, line);
  1207. road.setWidth(
  1208. mathUtil.getDistance(leftEdge.start, join) -
  1209. road.midDivide.midDivideWidth / 2,
  1210. dir
  1211. );
  1212. } else if (dir == "right") {
  1213. let join = mathUtil.getJoinLinePoint(rightEdge.start, line);
  1214. road.setWidth(
  1215. mathUtil.getDistance(rightEdge.start, join) -
  1216. road.midDivide.midDivideWidth / 2,
  1217. dir
  1218. );
  1219. }
  1220. } else if (road.way == Constant.oneWay) {
  1221. oldCount = road.singleRoadDrivewayCount;
  1222. //不能从leftEdge直接到rightEdge,因为不一定是线性的
  1223. dx1 = ((leftEdge.start.x - startPoint.x) / oldCount) * newCount;
  1224. dy1 = ((leftEdge.start.y - startPoint.y) / oldCount) * newCount;
  1225. dx2 = ((leftEdge.end.x - endPoint.x) / oldCount) * newCount;
  1226. dy2 = ((leftEdge.end.y - endPoint.y) / oldCount) * newCount;
  1227. edgeStartPosition = {
  1228. x: startPoint.x + dx1,
  1229. y: startPoint.y + dy1,
  1230. };
  1231. edgeEndPosition = {
  1232. x: endPoint.x + dx2,
  1233. y: endPoint.y + dy2,
  1234. };
  1235. mathUtil.clonePoint(leftEdge.start, edgeStartPosition);
  1236. mathUtil.clonePoint(leftEdge.end, edgeEndPosition);
  1237. dx1 = ((rightEdge.start.x - startPoint.x) / oldCount) * newCount;
  1238. dy1 = ((rightEdge.start.y - startPoint.y) / oldCount) * newCount;
  1239. dx2 = ((rightEdge.end.x - endPoint.x) / oldCount) * newCount;
  1240. dy2 = ((rightEdge.end.y - endPoint.y) / oldCount) * newCount;
  1241. edgeStartPosition = {
  1242. x: startPoint.x + dx1,
  1243. y: startPoint.y + dy1,
  1244. };
  1245. edgeEndPosition = {
  1246. x: endPoint.x + dx2,
  1247. y: endPoint.y + dy2,
  1248. };
  1249. mathUtil.clonePoint(rightEdge.start, edgeStartPosition);
  1250. mathUtil.clonePoint(rightEdge.end, edgeEndPosition);
  1251. const line = mathUtil.createLine1(leftEdge.start, leftEdge.end);
  1252. const singleRoadWidth = mathUtil.getDisForPoinLine(rightEdge.start, line);
  1253. road.setWidth(singleRoadWidth);
  1254. road.singleRoadDrivewayCount = newCount;
  1255. }
  1256. edgeService.updateEdgeForMulRoad(road.startId);
  1257. edgeService.updateEdgeForMulRoad(road.endId);
  1258. this.setLanes(roadId, dir);
  1259. }
  1260. //变宽或者变窄(车道个数不变)
  1261. //单向的情况下,左右两边同时变宽或者变窄,即:dir无效
  1262. updateForWidth(roadId, newWidth, dir) {
  1263. let road = dataService.getRoad(roadId);
  1264. let startPoint = dataService.getRoadPoint(road.startId);
  1265. let endPoint = dataService.getRoadPoint(road.endId);
  1266. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1267. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1268. let edgePoints;
  1269. if (road.way == Constant.oneWay) {
  1270. edgePoints = mathUtil.RectangleVertex(startPoint, endPoint, newWidth * 2);
  1271. mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
  1272. mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
  1273. mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
  1274. mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
  1275. road.setWidth(newWidth * 2);
  1276. } else if (road.way == Constant.twoWay) {
  1277. if (dir == "left") {
  1278. edgePoints = mathUtil.RectangleVertex(
  1279. startPoint,
  1280. endPoint,
  1281. newWidth + road.midDivide.midDivideWidth / 2
  1282. );
  1283. mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
  1284. mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
  1285. road.setWidth(newWidth, dir);
  1286. } else if (dir == "right") {
  1287. edgePoints = mathUtil.RectangleVertex(
  1288. startPoint,
  1289. endPoint,
  1290. newWidth + road.midDivide.midDivideWidth / 2
  1291. );
  1292. mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
  1293. mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
  1294. road.setWidth(newWidth, dir);
  1295. }
  1296. //左右两边的edge同时变宽或者变窄
  1297. else {
  1298. edgePoints = mathUtil.RectangleVertex(
  1299. startPoint,
  1300. endPoint,
  1301. (newWidth * road.leftWidth) / (road.leftWidth + road.rightWidth) +
  1302. road.midDivide.midDivideWidth / 2
  1303. );
  1304. mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
  1305. mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
  1306. road.setWidth(
  1307. (newWidth * road.leftWidth) / (road.leftWidth + road.rightWidth),
  1308. "left"
  1309. );
  1310. edgePoints = mathUtil.RectangleVertex(
  1311. startPoint,
  1312. endPoint,
  1313. (newWidth * road.rightWidth) / (road.leftWidth + road.rightWidth) +
  1314. road.midDivide.midDivideWidth / 2
  1315. );
  1316. mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
  1317. mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
  1318. road.setWidth(
  1319. (newWidth * road.rightWidth) / (road.leftWidth + road.rightWidth),
  1320. "right"
  1321. );
  1322. }
  1323. }
  1324. edgeService.updateEdgeForMovePoint(road.startId);
  1325. edgeService.updateEdgeForMovePoint(road.endId);
  1326. this.setLanes(roadId, dir);
  1327. }
  1328. //将道路转换成线条
  1329. convertToLines(roadId) {
  1330. let road = dataService.getRoad(roadId);
  1331. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1332. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1333. let leftLine = lineService.create(leftEdge.start, leftEdge.end);
  1334. leftLine.setStyle(leftEdge.getStyle());
  1335. leftLine.setWeight(leftEdge.getWeight());
  1336. let rightLine = lineService.create(rightEdge.start, rightEdge.end);
  1337. rightLine.setStyle(rightEdge.getStyle());
  1338. rightLine.setWeight(rightEdge.getWeight());
  1339. if (road.way == Constant.oneWay) {
  1340. for (let i = 0; i < road.singleLanes.length; ++i) {
  1341. let laneLine = lineService.create(
  1342. road.singleLanes[i].start,
  1343. road.singleLanes[i].end
  1344. );
  1345. laneLine.setStyle(VectorStyle.SingleDashedLine);
  1346. }
  1347. } else if (road.way == Constant.twoWay) {
  1348. for (let i = 0; i < road.leftLanes.length; ++i) {
  1349. let laneLine = lineService.create(
  1350. road.leftLanes[i].start,
  1351. road.leftLanes[i].end
  1352. );
  1353. laneLine.setStyle(VectorStyle.SingleDashedLine);
  1354. }
  1355. for (let i = 0; i < road.rightLanes.length; ++i) {
  1356. let laneLine = lineService.create(
  1357. road.rightLanes[i].start,
  1358. road.rightLanes[i].end
  1359. );
  1360. laneLine.setStyle(VectorStyle.SingleDashedLine);
  1361. }
  1362. lineService.create(
  1363. road.midDivide.leftMidDivide.start,
  1364. road.midDivide.leftMidDivide.end
  1365. );
  1366. lineService.create(
  1367. road.midDivide.rightMidDivide.start,
  1368. road.midDivide.rightMidDivide.end
  1369. );
  1370. }
  1371. }
  1372. // unlock(roadId) {
  1373. // let road = dataService.getRoad(roadId);
  1374. // let startPoint = dataService.getRoadPoint(road.startId);
  1375. // let endPoint = dataService.getRoadPoint(road.endId);
  1376. // let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1377. // let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1378. // let lanes = road.lanes;
  1379. // lineService.createLine(startPoint, endPoint);
  1380. // lineService.createLine(leftEdge.start, leftEdge.end);
  1381. // lineService.createLine(rightEdge.start, rightEdge.end);
  1382. // for (let i = 0; i < lanes.length; ++i) {
  1383. // lineService.createLine(lanes[i].start, lanes[i].end);
  1384. // }
  1385. // dataService.deleteRoad(roadId);
  1386. // }
  1387. /****************************************************************************************************************************************************************/
  1388. }
  1389. const roadService = new RoadService();
  1390. export { roadService };