Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 192 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
192
Dung lượng
7,29 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT LÊ ĐÌNH HIỂN NGHIÊN CỨU TỐI ƯU HĨA THUẬT TỐN TỰ ĐỘNG PHÂN LOẠI DỮ LIỆU ĐÁM MÂY ĐIỂM HỖ TRỢ XÂY DỰNG MƠ HÌNH 3D THÀNH PHỐ THÔNG MINH LUẬN ÁN TIẾN SĨ KỸ THUẬT HÀ NỘI - 2023 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT LÊ ĐÌNH HIỂN NGHIÊN CỨU TỐI ƯU HĨA THUẬT TỐN TỰ ĐỘNG PHÂN LOẠI DỮ LIỆU ĐÁM MÂY ĐIỂM HỖ TRỢ XÂY DỰNG MÔ HÌNH 3D THÀNH PHỐ THƠNG MINH Ngành: Kỹ thuật Trắc địa - Bản đồ Mã số: 9520503 LUẬN ÁN TIẾN SĨ KỸ THUẬT Người hướng dẫn khoa học: PGS TS Bùi Ngọc Quý HÀ NỘI - 2023 i LỜI CAM ĐOAN Tơi xin cam đoan cơng trình nghiên cứu riêng tơi Tồn q trình nghiên cứu tiến hành cách khoa học, số liệu, kết nêu luận án xác, trung thực chưa công bố cơng trình khác Tác giả luận án Lê Đình Hiển ii MỤC LỤC LỜI CAM ĐOAN i MỤC LỤC ii LỜI CẢM ƠN vi DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT vii DANH MỤC BẢNG BIỂU ix DANH MỤC CÁC HÌNH VẼ x MỞ ĐẦU 1 Tính cấp thiết đề tài Mục tiêu nghiên cứu 3 Đối tượng nghiên cứu Phạm vi nghiên cứu Nội dung nghiên cứu Phương pháp nghiên cứu Ý nghĩa khoa học thực tiễn đề tài Luận điểm bảo vệ Những điểm đề tài 10 Cấu trúc luận án CHƯƠNG 1: TỔNG QUAN CÁC VẤN ĐỀ NGHIÊN CỨU 1.1 Tổng quan thành phố thông minh 1.1.1 Trên giới 1.1.2 Ở Việt Nam 1.1.3 Các thành phần thành phố thông minh 11 1.1.4 Vai trò liệu không gian thành phố thông minh .12 1.1.5 Vai trị mơ hình 3D thành phố thơng minh 16 1.1.6 Mơ hình 3D thành phố thông minh 17 1.1.7 Mức độ chi tiết mơ hình 3D thành phố thông minh 19 1.2 Tổng quan phương pháp thuật toán phân loại liệu đám mây điểm 21 1.2.1 Tổng quan phương pháp phân loại liệu đám mây điểm .21 1.2.2 Tổng quan thuật toán phân loại liệu đám mây điểm 24 1.2.3 Tình hình nghiên cứu thuật toán phân loại đám mây điểm Việt Nam 30 1.3 Tổng quan thuật toán phân loại đám mây điểm sử dụng luận án .31 iii 1.3.1 Thuật toán lọc mặt đất 31 1.3.2 Thuật toán lọc mái nhà 32 1.3.3 Thuật toán phân loại theo độ cao 33 1.3.4 Thuật toán phân loại dựa theo cường độ tia quét 33 1.3.5 Thuật toán phân loại dựa theo số NDVI 35 1.4 Tiểu kết chương 37 1.5 Hướng nghiên cứu đề tài luận án 37 CHƯƠNG 2: TỐI ƯU HĨA THUẬT TỐN TỰ ĐỘNG PHÂN LOẠI DỮ LIỆU ĐÁM MÂY ĐIỂM 39 2.1 Nghiên cứu công nghệ thu nhận liệu cấu trúc hệ thống quét LiDAR hàng không City Mapper Leica 39 2.1.1 Các tính kĩ thuật hệ thống CityMapper (cơ bản) 40 2.1.2 Nghiên cứu đặc điểm, tính chất đám mây điểm thu nhận từ công nghệ quét LiDAR hàng không 43 2.2 Nghiên cứu xây dựng thuật toán tự động phân loại liệu đám mây điểm 54 2.2.1 Thuật toán lọc nhiễu 54 2.2.2 Thuật toán lọc mặt đất 55 2.2.3 Phân loại lớp đường nhựa ngưỡng cường độ phản xạ 62 2.2.4 Phương pháp phân loại thực vật ngưỡng độ cao số NDVI 64 2.2.5 Thuật toán phân loại nhà 65 2.3 Đề xuất xây dựng quy trình tối ưu hóa tự động phân loại liệu đám mây điểm 69 2.4 Đề xuất quy trình xây dựng mơ hình 3D thành phố thơng minh tự động từ liệu LiDar hàng không 72 2.5 Tiểu kết chương 74 CHƯƠNG 3: XÂY DỰNG MƠ HÌNH 3D THÀNH PHỐ THƠNG MINH KHU VỰC HỊN GAI, HẠ LONG 75 3.1 Giới thiệu khu vực nghiên cứu 75 3.2 Xây dựng chương trình máy tính phân loại liệu đám mây điểm 75 3.2.1 Mục đích u cầu xây dựng chương trình máy tính phân loại liệu đám mây điểm 76 3.2.2 Thiết kế tổng thể chương trình máy tính phân loại liệu đám mây điểm iv 76 3.2.3 Thiết kế chức chương trình máy tính phân loại liệu đám mây điểm .79 3.2.4 Lập trình xây dựng chương trình phân loại liệu đám mây điểm 81 3.2.5 Đóng gói chạy thử 83 3.3 Lựa chọn phần mềm xử lý liệu 84 3.3.1 Phần mềm MissionPro (Leica) 84 3.3.2 Phần mềm Flight Pro (Leica) 84 3.3.3 Phần mềm Inertial Explorer (NovAtel - Canada) 84 3.3.4 Hệ thống phần mềm HxMap 85 3.3.5 Phần mềm TerraSolid (Phần Lan) 86 3.4 Thực nghiệm thành lập mơ hình 3D thành phố từ liệu LiDAR hàng không .86 3.4.1 Công tác chuẩn bị liệu để xây dựng mơ hình 3D 87 3.4.2 Xử lý liệu ảnh đám mây điểm LiDAR .88 3.4.3 Công đoạn phân loại liệu đám mây điểm .91 3.4.4 Cơng đoạn xây dựng mơ hình 3D thành phố thơng minh 97 3.5 Đánh giá kết nghiên cứu 103 3.5.1 Phương pháp đánh giá kết 103 3.5.2 Lựa chọn khu vực đánh giá kết phân loại 104 3.5.3 Đánh giá độ xác thuật toán phân loại điểm mặt đất 106 3.5.4 Đánh giá độ xác q trình tự động phân loại đám mây điểm 108 3.5.6 Đánh giá khả ứng dụng quy trình cơng nghệ tự động phân loại liệu đám mây điểm 116 3.6 Đánh giá khả ứng dụng mơ hình 3D thành phố thông minh thực nghiệm 116 3.6.1 Quy hoạch đô thị 116 3.6.2 Hiển thị không gian 117 3.6.3 Phân tích tầm nhìn .118 3.6.4 Phòng chống thiên tai, ứng phó tình .120 3.6.5 Quản lý tài sản & phát thay đổi 121 v 3.6.6 Thăm vấn cộng đồng 122 3.6.7 Du lịch & bảo tồn di sản 123 3.6.8 Xác định vấn đề môi trường quản lý môi trường đô thị 124 KẾT LUẬN VÀ KIẾN NGHỊ 126 Kết luận 126 Kiến nghị .127 DANH MỤC CÁC CƠNG TRÌNH KHOA HỌC CỦA TÁC GIẢ 129 ĐÃ CÔNG BỘ CÓ LIÊN QUAN TỚI LUẬN ÁN 129 TÀI LIỆU THAM KHẢO 131 PHỤ LỤC 145 PHỤ LỤC 1: HƯỚNG DẪN SỬ DỤNG CHƯƠNG TRÌNH HUMG – POINT CLOUD CLASSIFIER 145 PHỤ LỤC – MÃ NGUỒN CHƯƠNG TRÌNH HUMG – POINT CLOUD CLASSIFIER .156 vi LỜI CẢM ƠN Trong trình thực luận án, NCS nhận giúp đỡ tận tình thầy hướng dẫn khoa học: PGS.TS Bùi Ngọc Quý cán bộ, giảng viên thuộc Bộ môn Bản đồ, Khoa Trắc địa – Bản đồ Quản lý đất đai thông qua đề tài, dự án với thầy hướng dẫn như: Đề tài Khoa học công nghệ cấp Bộ Giáo dục đào tạo, mã số B2021-MDA-01 Bên cạnh đó, NCS nhận hướng dẫn ngơn ngữ lập trình từ TS Trần Thùy Dương (Trường Đại học Mỏ - Địa chất) NCS xin bày tỏ lịng biết ơn sâu sắc tới dìu dắt q báu từ quý thầy cô Trong thời gian học tập nghiên cứu, NCS nhận ý kiến trao đổi thẳng thắn chuyên môn hỗ trợ tài liệu tham khảo quý báu từ Cơ quan công tác Công ty TNHH MTV Tài nguyên Môi trường Việt Nam, Bộ Tài nguyên Môi trường đồng nghiệp quan sản xuất nghiên cứu khoa học Cục Viễn thám Quốc gia, Nhà xuất Tài nguyên, môi trường đồ Việt Nam, Cục Đo đạc đồ thông tin địa lý Việt Nam, Viện Khoa học Đo đạc Bản đồ (Bộ Tài nguyên Môi trường), Trường Đại học Khoa học Tự nhiên (Đại học Quốc gia Hà Nội), NCS xin chân thành cảm ơn giúp đỡ quý báu NCS xin chân thành cảm ơn Trường Đại học Mỏ - Địa chất tạo điều kiện để NCS hồn thành luận án NCS xin trân trọng cảm ơn động viên, khích lệ gia đình, bạn bè, đồng nghiệp suốt trình học tập, nghiên cứu thực luận án vii DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT DEM Digital Elevation Model Mơ hình số độ cao DSM Digital Surface Model Mơ hình số độ cao bề mặt DTM Digital Terrain Model Mơ hình số địa hình EM Expectation Maximization Cực đại hóa kỳ vọng GIS Geographic Information Hệ thống thông tin địa lý System GNSS Global Navigation Satellite Hệ thống vệ tinh dẫn đường toàn cầu System GML Markup Ngôn ngữ đánh dấu địa lý Geography Language GPS Global Positioning System Lưới ô vuông GRID HUMG Hệ thống định vị toàn cầu Hanoi University of Minning Đại học Mỏ Địa Chất – Hà Nội and Geology IMU Inertial Measurement System Đơn vị đo lường quán tính INS Inertial Navigation System Hệ thống hàng hướng quán tính IoT Internet of Things Internet vạn vật LiDAR Light Detection And Công nghệ đo khoảng cách tia laser Ranging LoD Level of Detail Nghiên cứu sinh NCS NDVI Cấp độ chi tiết Normalized Difference Chỉ số thực vật Vegetation Index NIR Near Infrared MCC Multiscale Cận hồng ngoại Curvature Phân loại dựa nguyên lý lặp đa tỉ lệ Classification MP Mega Pixel Đơn vị pixel ảnh viii OGC Open Geospatial Consortium Tổ chức không gian địa lý mở PPP Precise Point Positioning Công nghệ định vị điểm xác PRF Pulse Rate per Frame Tần số phát xung (số xung/giây) RGB Red Green Blue Đỏ Lục Lam TIN Triangulation Irregular Lưới tam giác không đồng Network TPTM Smart city Thành phố thông minh UAV Umanned Aerial Vehicle Thiết bị bay không người lái WGS World Geodetic System Hệ thống trắc địa giới 164 418 CirclesCount = 419 ReDim DS_Triangles(0) 420 TrianglesCount = 421 ReDim DS_GndPoints(0) 422 GndPointsCount = 423 ReDim DS_NonGndPoints(0) 424 NonGnDPointsCount = 425 ReDim DS_Texts(0) 426 TextsCount = 427 ReDim DS_Grids(0) 428 GridsCount = 429 End Sub 430 431 Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripMenuItem.Click 432 433 End Sub 434 435 Private Sub PanToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PanToolStripMenuItem.Click 436 Command = "Pan" 437 End Sub 438 439 Private Sub WindowToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WindowToolStripMenuItem.Click 440 Command = "Zoom Window" 441 End Sub 442 443 Function GetZMin() 444 Dim rZmin As Double 445 rZmin = 1.0E+20 446 For i = To PointsCount 447 If rZmin > DS_Points(i).rZ1 Then rZmin = DS_Points(i).rZ1 448 Next 449 Return rZmin 450 End Function 451 Sub GetLasMinMax() 452 rLasXmin = 1.0E+20 453 rLasYmin = 1.0E+20 454 rLasXmax = -1.0E+20 455 rLasYmax = -1.0E+20 456 For i = To PointsCount 457 If rLasXmin > DS_Points(i).rX1 Then rLasXmin = DS_Points(i).rX1 458 If rLasYmin > DS_Points(i).rY1 Then rLasYmin = DS_Points(i).rY1 459 If rLasXmax < DS_Points(i).rX1 Then rLasXmax = DS_Points(i).rX1 460 If rLasYmax < DS_Points(i).rY1 Then rLasYmax = DS_Points(i).rY1 461 Next 462 End Sub 463 Function GetZGridMin(ByVal i As Integer) As Double 464 rZmin = 1.0E+20 465 For k = To DS_Grids(i).VertexsCount 466 If rZmin > DS_Grids(i).DS_Vertexs(k).rZ1 Then rZmin = DS_Grids(i).DS_Vertexs(k).rZ1 467 Next 468 Return rZmin 469 End Function 470 165 471 Function Get1stGndPoint(ByVal i As Integer) As Integer 472 rZmin = 1.0E+20 473 Dim j As Integer 474 For k = To DS_Grids(i).VertexsCount 475 If rZmin > DS_Grids(i).DS_Vertexs(k).rZ1 Then 476 rZmin = DS_Grids(i).DS_Vertexs(k).rZ1 477 j=k 478 End If 479 Next 480 Return (j) 481 End Function 482 483 Sub DeleteVertex(ByVal i As Integer, ByVal iVertex As Integer) 484 DS_Grids(i).DS_Vertexs(iVertex) = DS_Grids(i).DS_Vertexs(DS_Grids(i).VertexsCount) 485 DS_Grids(i).VertexsCount = DS_Grids(i).VertexsCount - 486 End Sub 487 488 Sub DeleteNonGndPoints(ByVal i As Integer) 489 DS_NonGndPoints(i) = DS_NonGndPoints(NonGnDPointsCount) 490 NonGnDPointsCount = NonGnDPointsCount - 491 End Sub 492 493 Sub GetMinMax() 494 rXmin = 1.0E+20 495 rYmin = 1.0E+20 496 rXmax = -1.0E+20 497 rYmax = -1.0E+20 498 For i = To PointsCount 499 If rXmin > DS_Points(i).rX1 Then rXmin = DS_Points(i).rX1 500 If rYmin > DS_Points(i).rY1 Then rYmin = DS_Points(i).rY1 501 If rXmax < DS_Points(i).rX1 Then rXmax = DS_Points(i).rX1 502 If rYmax < DS_Points(i).rY1 Then rYmax = DS_Points(i).rY1 503 Next 504 For i = To LasPointsCount 505 If rXmin > DS_LasPoints(i).rX1 Then rXmin = DS_LasPoints(i).rX1 506 If rYmin > DS_LasPoints(i).rY1 Then rYmin = DS_LasPoints(i).rY1 507 If rXmax < DS_LasPoints(i).rX1 Then rXmax = DS_LasPoints(i).rX1 508 If rYmax < DS_LasPoints(i).rY1 Then rYmax = DS_LasPoints(i).rY1 509 Next 510 For i = To NonGnDPointsCount 511 If rXmin > DS_NonGndPoints(i).rX1 Then rXmin = DS_NonGndPoints(i).rX1 512 If rYmin > DS_NonGndPoints(i).rY1 Then rYmin = DS_NonGndPoints(i).rY1 513 If rXmax < DS_NonGndPoints(i).rX1 Then rXmax = DS_NonGndPoints(i).rX1 514 If rYmax < DS_NonGndPoints(i).rY1 Then rYmax = DS_NonGndPoints(i).rY1 515 Next 516 For i = To TextsCount 517 If rXmin > DS_Texts(i).rX1 Then rXmin = DS_Texts(i).rX1 518 If rYmin > DS_Texts(i).rY1 Then rYmin = DS_Texts(i).rY1 519 If rXmax < DS_Texts(i).rX1 Then rXmax = DS_Texts(i).rX1 520 If rYmax < DS_Texts(i).rY1 Then rYmax = DS_Texts(i).rY1 521 Next 522 For i = To LinesCount 523 If rXmin > DS_Lines(i).rX1 Then rXmin = DS_Lines(i).rX1 524 If rXmin > DS_Lines(i).rX2 Then rXmin = DS_Lines(i).rX2 525 If rYmin > DS_Lines(i).rY1 Then rYmin = DS_Lines(i).rY1 526 If rYmin > DS_Lines(i).rY2 Then rYmin = DS_Lines(i).rY2 166 527 If rXmax < DS_Lines(i).rX1 Then rXmax = DS_Lines(i).rX1 528 If rXmax < DS_Lines(i).rX2 Then rXmax = DS_Lines(i).rX2 529 If rYmax < DS_Lines(i).rY1 Then rYmax = DS_Lines(i).rY1 530 If rYmax < DS_Lines(i).rY2 Then rYmax = DS_Lines(i).rY2 531 Next 532 For i = To CirclesCount 533 If rXmin > (DS_Circles(i).rX1 - DS_Circles(i).rR1) Then rXmin = (DS_Circles(i).rX1 - DS_Circles(i).rR1) 534 If rYmin > (DS_Circles(i).rY1 - DS_Circles(i).rR1) Then rYmin = (DS_Circles(i).rY1 - DS_Circles(i).rR1) 535 If rXmax < (DS_Circles(i).rX1 + DS_Circles(i).rR1) Then rXmax = (DS_Circles(i).rX1 + DS_Circles(i).rR1) 536 If rYmax < (DS_Circles(i).rY1 + DS_Circles(i).rR1) Then rYmax = (DS_Circles(i).rY1 + DS_Circles(i).rR1) 537 Next 538 For i = To PolylinesCount 539 For j = To DS_Polylines(i).VertexsCount 540 If rXmin > DS_Polylines(i).DS_Vertexs(j).rX1 Then rXmin = DS_Polylines(i).DS_Vertexs(j).rX1 541 If rYmin > DS_Polylines(i).DS_Vertexs(j).rY1 Then rYmin = DS_Polylines(i).DS_Vertexs(j).rY1 542 If rXmax < DS_Polylines(i).DS_Vertexs(j).rX1 Then rXmax = DS_Polylines(i).DS_Vertexs(j).rX1 543 If rYmax < DS_Polylines(i).DS_Vertexs(j).rY1 Then rYmax = DS_Polylines(i).DS_Vertexs(j).rY1 544 Next 545 Next 546 End Sub 547 548 Private Sub ZoomExtents() 549 GetMinMax() 550 rXo = (rXmin + rXmax) / 551 rYo = (rYmin + rYmax) / 552 m = PicView.Height / (rYmax - rYmin) 553 Redraw() 554 End Sub 555 556 Private Sub ExtentsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExtentsToolStripMenuItem.Click 557 ZoomExtents() 558 End Sub 559 'Click tool hình 560 Private Sub ToolStripButtonPoint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonPoint.Click 561 PointToolStripMenuItem_Click(sender, e) 562 End Sub 563 564 Private Sub ToolStripButtonLine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonLine.Click 565 LineToolStripMenuItem_Click(sender, e) 566 End Sub 567 568 Private Sub ToolStripButtonCircle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonCircle.Click 569 CircleToolStripMenuItem_Click(sender, e) 570 End Sub 571 167 572 Private Sub ToolStripButtonPolyline_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonPolyline.Click 573 PolylineToolStripMenuItem_Click(sender, e) 574 End Sub 575 576 Private Sub ToolStripButtonText_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonText.Click 577 TextToolStripMenuItem_Click(sender, e) 578 End Sub 579 580 Private Sub ToolStripButtonZoomExtents_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonZoomExtents.Click 581 ExtentsToolStripMenuItem_Click(sender, e) 582 End Sub 583 584 Private Sub ToolStripButtonPan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonPan.Click 585 PanToolStripMenuItem_Click(sender, e) 586 End Sub 587 588 Private Sub ToolStripButtonZoomIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonZoomIn.Click 589 InToolStripMenuItem_Click(sender, e) 590 End Sub 591 592 Private Sub ToolStripButtonZoomOut_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonZoomOut.Click 593 OutToolStripMenuItem_Click(sender, e) 594 End Sub 595 596 Private Sub ToolStripButtonOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonOpen.Click 597 OpenToolStripMenuItem_Click(sender, e) 598 End Sub 599 600 Private Sub ToolStripButtonNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonNew.Click 601 NewToolStripMenuItem_Click(sender, e) 602 End Sub 603 604 Private Sub ToolStripButtonSaveAs_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonSaveAs.Click 605 SaveAsToolStripMenuItem_Click(sender, e) 606 End Sub 607 608 Private Sub ToolStripButtonGround_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 609 Ground2ToolStripMenuItem_Click(sender, e) 610 End Sub 611 612 Private Sub ToolStripButtonRoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonRoad.Click 613 AsphaltToolStripMenuItem_Click(sender, e) 614 End Sub 615 616 Private Sub ToolStripButtonGrass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonGrass.Click 168 617 LowVegetationToolStripMenuItem_Click(sender, e) 618 End Sub 619 620 Private Sub ToolStripButtonBush_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonBush.Click 621 MedVegetationToolStripMenuItem_Click(sender, e) 622 End Sub 623 624 Private Sub ToolStripButtonTree_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonTree.Click 625 HighVegetationToolStripMenuItem_Click(sender, e) 626 End Sub 627 628 Function SplitChain(ByVal Text As String, ByVal Delimeter As String, ByRef Words() As String) As Integer 629 Dim n As Integer, i As Integer 630 i=0 631 Do 632 i=i+1 633 Text = Trim(Text) 634 n = InStr(Text, Delimeter) 635 ReDim Preserve Words(i) 636 If n > Then 637 Words(i) = Mid(Text, 1, n - 1) 638 Text = Mid(Text, n + 1) 639 Else 640 Words(i) = Text 641 Return i 642 Exit Do 643 End If 644 Loop 645 End Function 646 647 Private Sub ReadLas() 648 'Load file las, tao DS_Points 649 OpenFileDialogFrmView.ShowDialog() 650 FileOpen(1, OpenFileDialogFrmView.FileName, OpenMode.Input) 651 Dim Words() As String = Nothing, WordsCount As Integer 652 Dim Txtline As String = "" 653 Do While Not EOF(1) 654 Txtline = LineInput(1) & vbCrLf 655 WordsCount = SplitChain(Txtline, " ", Words) 656 'AddText(Val(Words(2)), Val(Words(3)), Words(4)) 657 AddLasPoint(Val(Words(2)), Val(Words(3)), Val(Words(4)), Val(Words(5)), Val(Words(6)), Val(Words(7)), Val(Words(8)), Val(Words(9)), Val(Words(10))) 658 Loop 659 FileClose(1) 660 End Sub 661 662 Private Sub ReadTriangles() 663 'Load file triangle, tao DS_Triangles 664 OpenFileDialogFrmView.ShowDialog() 665 FileOpen(1, OpenFileDialogFrmView.FileName, OpenMode.Input) 666 Dim Words() As String = Nothing, WordsCount As Integer 667 Dim Txtline As String = "" 668 Do While Not EOF(1) 669 Txtline = LineInput(1) & vbCrLf 169 670 WordsCount = SplitChain(Txtline, " ", Words) 671 AddTriangle(Val(Words(1)), Val(Words(2)), Words(3)) 672 Loop 673 FileClose(1) 674 End Sub 675 676 Private Sub OpenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripMenuItem.Click 677 ReadLas() 678 ExtentsToolStripMenuItem_Click(sender, e) 679 End Sub 680 681 Private Sub SaveAsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveAsToolStripMenuItem.Click 682 SaveFileDialogFrmView.ShowDialog() 683 FileOpen(1, SaveFileDialogFrmView.FileName, OpenMode.Output) 684 Dim t As String 685 t = "" 686 For i = To LasPointsCount 687 t = t & (DS_LasPoints(i).rX1 & " " & DS_LasPoints(i).rY1 & " " & DS_LasPoints(i).rZ1 & " " & DS_LasPoints(i).classification & " " & DS_LasPoints(i).Intensity & 688 " " & DS_LasPoints(i).Red & " " & DS_LasPoints(i).Green & " " & DS_LasPoints(i).Blue & " " & DS_LasPoints(i).NIR) & vbCrLf 689 Next 690 Print(1, t) 691 FileClose(1) 692 End Sub 693 694 Function Distance3D(ByVal rX1 As Double, ByVal rY1 As Double, ByVal rZ1 As Double, ByVal rX2 As Double, ByVal rY2 As Double, ByVal rZ2 As Double) As Double 695 Return Math.Sqrt((rX1 - rX2) ^ + (rY1 - rY2) ^ + (rZ1 - rZ2) ^ 2) 696 End Function 697 698 Private Sub PickGridToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PickGridToolStripMenuItem.Click 699 GetLasMinMax() 700 'Di tim Grid 701 Dim rWidth As Double 702 Dim rHeight As Double 703 Dim i, j As Integer 704 rWidth = 25 705 rHeight = 25 706 707 nRow = (rLasYmax - rLasYmin) / rHeight 708 nCol = (rLasXmax - rLasXmin) / rWidth 709 Dim font As Drawing.Font = New Font("Arial", 10) 710 Dim GridNumber As Integer 711 For j = To nRow - 712 For i = To nCol - 713 GridNumber = i + nCol * j 714 g.DrawString(GridNumber, font, Brushes.Yellow, vX(rLasXmin + rWidth / + i * rWidth), vY(rLasYmin + 50 + j * rHeight)) 715 Next 716 Next 717 'Vẽ ranh bao grid 718 For i = To nCol 170 719 g.DrawLine(Pens.White, vX(rLasXmin + i * rWidth), vY(rLasYmin), vX(rLasXmin + i * rWidth), vY(rLasYmax)) 720 Next 721 For j = To nRow 722 g.DrawLine(Pens.White, vX(rLasXmin), vY(rLasYmin + j * rHeight), vX(rLasXmax), vY(rLasYmin + j * rHeight)) 723 Next 724 'Nhat diem vao o 725 CreateAllGrids(rWidth, rHeight) 726 GetTheLowestPointOfGrids() 727 'Xoa bo DS_Points va DS_Texts 728 ReDim DS_Points(0) 729 PointsCount = 730 ReDim DS_Texts(0) 731 TextsCount = 732 ConvertPointsInGridToNonGndPoints() 733 End Sub 734 735 Sub CreateGridWithLasPoints(ByVal i As Integer, ByVal j As Integer, ByVal rWidth As Double, ByVal rHeight As Double) 736 Dim rX1, rY1 As Double 737 Dim rX2, rY2 As Double 738 rX1 = rLasXmin + i * rWidth 739 rY1 = rLasYmin + j * rHeight 740 rX2 = rX1 + rWidth 741 rY2 = rY1 + rHeight 742 For k = To PointsCount 743 If DS_Points(k).rX1 rX1 Then 744 If DS_Points(k).rY1 rY1 Then 745 AddVertex(DS_Points(k).rX1, DS_Points(k).rY1, DS_Points(k).rZ1) 746 End If 747 End If 748 Next 749 AddGrid(DS_Vertexs, VertexsCount) 750 End Sub 751 752 Private Sub CreateAllGrids(ByVal rWidth As Double, ByVal rHeight As Double) 753 For j = To nRow - 754 For i = To nCol - 755 VertexsCount = 756 CreateGridWithLasPoints(i, j, rWidth, rHeight) 757 Next 758 Next 759 End Sub 760 761 Private Sub GetTheLowestPointOfGrids() 762 Dim iZmin As Integer 763 For j = To GridsCount 764 If DS_Grids(j).VertexsCount > Then 765 GetZGridMin(j) 766 iZmin = Get1stGndPoint(j) 767 AddGndPoint(DS_Grids(j).DS_Vertexs(iZmin).rX1, DS_Grids(j).DS_Vertexs(iZmin).rY1, DS_Grids(j).DS_Vertexs(iZmin).rZ1) 768 DeleteVertex(j, iZmin) 769 End If 770 Next 771 End Sub 171 772 773 Private Sub ConvertPointsInGridToNonGndPoints() 774 For j = To GridsCount 775 For i = To DS_Grids(j).VertexsCount 776 If DS_Grids(j).VertexsCount > Then 777 AddNonGndPoint(DS_Grids(j).DS_Vertexs(i).rX1, DS_Grids(j).DS_Vertexs(i).rY1, DS_Grids(j).DS_Vertexs(i).rZ1) 778 End If 779 Next 780 Next 781 End Sub 782 783 Sub DrawTriangle(ByVal iD1 As Integer, ByVal iD2 As Integer, ByVal iD3 As Integer) 784 Dim vX1, vX2, vY1, vY2 As Integer 785 vX1 = vX(DS_GndPoints(iD1).rX1) 786 vY1 = vY(DS_GndPoints(iD1).rY1) 787 vX2 = vX(DS_GndPoints(iD2).rX1) 788 vY2 = vY(DS_GndPoints(iD2).rY1) 789 g.DrawLine(Pens.Magenta, vX1, vY1, vX2, vY2) 790 vX1 = vX(DS_GndPoints(iD2).rX1) 791 vY1 = vY(DS_GndPoints(iD2).rY1) 792 vX2 = vX(DS_GndPoints(iD3).rX1) 793 vY2 = vY(DS_GndPoints(iD3).rY1) 794 g.DrawLine(Pens.Magenta, vX1, vY1, vX2, vY2) 795 vX1 = vX(DS_GndPoints(iD3).rX1) 796 vY1 = vY(DS_GndPoints(iD3).rY1) 797 vX2 = vX(DS_GndPoints(iD1).rX1) 798 vY2 = vY(DS_GndPoints(iD1).rY1) 799 g.DrawLine(Pens.Magenta, vX1, vY1, vX2, vY2) 800 End Sub 801 802 Function IterationDistance(ByVal rX1 As Double, ByVal rY1 As Double, ByVal rZ1 As Double, 803 ByVal rX2 As Double, ByVal rY2 As Double, ByVal rZ2 As Double, 804 ByVal rX3 As Double, ByVal rY3 As Double, ByVal rZ3 As Double, 805 ByVal rXc As Double, ByVal rYc As Double, ByVal rZc As Double) As Double 806 Dim a, b, c, d As Double 807 a = (rY2 - rY1) * (rZ3 - rZ1) - (rY3 - rY1) * (rZ2 - rZ1) 808 b = (rZ2 - rZ1) * (rX3 - rX1) - (rZ3 - rZ1) * (rX2 - rX1) 809 c = (rX2 - rX1) * (rY3 - rY1) - (rX3 - rX1) * (rY2 - rY1) 810 d = -(a * rX1 + b * rY1 + c * rZ1) 811 Return (Math.Abs(a * rXc + b * rYc + c * rZc + d) / Math.Sqrt(a ^ + b ^ + c ^ 2)) 812 End Function 813 814 815 Private Sub CCWToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CCWToolStripMenuItem.Click 816 Dim rX1, rY1 As Double 817 Dim rX2, rY2 As Double 818 Dim rXc, rYc As Double 819 rX1 = DS_Lines(LinesCount).rX1 820 rY1 = DS_Lines(LinesCount).rY1 821 rX2 = DS_Lines(LinesCount).rX2 822 rY2 = DS_Lines(LinesCount).rY2 172 823 rXc = DS_Texts(TextsCount).rX1 824 rYc = DS_Texts(TextsCount).rY1 825 MsgBox("CCW = " & CCW(rX1, rY1, rX2, rY2, rXc, rYc)) 826 End Sub 827 828 Private Function CCW(ByVal rX1 As Double, ByVal rY1 As Double, ByVal rX2 As Double, ByVal rY2 As Double, ByVal rXc As Double, ByVal rYc As Double) As Integer 829 Dim dX12, dY12 As Double 830 Dim dX1c, dY1c As Double 831 dX12 = rX2 - rX1 832 dY12 = rY2 - rY1 833 dX1c = rXc - rX1 834 dY1c = rYc - rY1 835 Dim D As Double 836 D = dX12 * dY1c - dY12 * dX1c 837 If D > Then 838 Return 839 ElseIf D = Then 840 Return 841 Else 842 Return -1 843 End If 844 End Function 845 846 Function PtInTriangle(ByVal rX1 As Double, ByVal rY1 As Double, ByVal rX2 As Double, ByVal rY2 As Double, ByVal rX3 As Double, ByVal rY3 As Double, ByVal rXc As Double, ByVal rYc As Double) As Boolean 847 If CCW(rX1, rY1, rX2, rY2, rXc, rYc) = And 848 CCW(rX2, rY2, rX3, rY3, rXc, rYc) = And 849 CCW(rX3, rY3, rX1, rY1, rXc, rYc) = Then 850 Return True 851 ElseIf CCW(rX1, rY1, rX2, rY2, rXc, rYc) = -1 And 852 CCW(rX2, rY2, rX3, rY3, rXc, rYc) = -1 And 853 CCW(rX3, rY3, rX1, rY1, rXc, rYc) = -1 Then 854 Return True 855 Else 856 Return False 857 End If 858 End Function 859 860 Private Sub CheckInitTriangIeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckInitTriangIeToolStripMenuItem.Click 861 'Load file las, tao DS_Points 862 OpenFileDialogFrmView.ShowDialog() 863 FileOpen(1, OpenFileDialogFrmView.FileName, OpenMode.Input) 864 Dim Words() As String = Nothing, WordsCount As Integer 865 Dim Txtline As String = "" 866 Do While Not EOF(1) 867 Txtline = LineInput(1) & vbCrLf 868 WordsCount = SplitChain(Txtline, " ", Words) 869 AddPoint(Val(Words(2)), Val(Words(3)), Val(Words(4))) 870 Loop 871 FileClose(1) 872 ExtentsToolStripMenuItem_Click(sender, e) 873 End Sub 874 173 875 876 Private Sub LoadInitGnd2ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadInitGnd2ToolStripMenuItem.Click 877 OpenFileDialogFrmView.ShowDialog() 878 FileOpen(1, OpenFileDialogFrmView.FileName, OpenMode.Input) 879 Dim Words() As String = Nothing, WordsCount As Integer 880 Dim Txtline As String = "" 881 Do While Not EOF(1) 882 Txtline = LineInput(1) & vbCrLf 883 WordsCount = SplitChain(Txtline, " ", Words) 884 AddLasPoint(Val(Words(2)), Val(Words(3)), Val(Words(4)), Val(Words(5)), Val(Words(6)), Val(Words(7)), Val(Words(8)), Val(Words(9)), Val(Words(10))) 885 Loop 886 FileClose(1) 887 ZoomExtents() 888 End Sub 889 890 Dim DS_IDTs(TrianglesCount) As Integer 891 892 Private Sub Ground2ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ground2ToolStripMenuItem.Click 893 FrmGndClassification.ShowDialog() 894 Dim i, j As Integer 895 Triangulation2() 896 Dim rX1, rY1, rZ1 As Double 897 Dim k As Integer 898 k=0 899 Dim DS_IDTs(TrianglesCount) As Integer 900 DS_IDTs(TrianglesCount) = 901 For i = To LasPointsCount 902 If DS_LasPoints(i).classification = Then 903 rX1 = DS_LasPoints(i).rX1 904 rY1 = DS_LasPoints(i).rY1 905 rZ1 = DS_LasPoints(i).rZ1 906 j=1 907 Do 908 If DS_IDTs(j) = Then 909 If PtInTriangle(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, 910 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, 911 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, 912 rX1, rY1) = True Then 913 If FilterGndPointsByIteDistAndAngle2(DS_Triangles(j).iD1, DS_Triangles(j).iD2, DS_Triangles(j).iD3, i) = True Then 914 DS_IDTs(j) = 915 ReDim Preserve DS_IDTs(TrianglesCount) 916 DS_IDTs(TrianglesCount) = 917 Exit Do 918 End If 919 End If 920 Else 921 End If 922 j=j+1 923 If j - = TrianglesCount Then Exit Do 174 924 Loop 925 End If 926 Next 927 End Sub 928 929 Function FilterGndPointsByIteDistAndAngle2(ByVal iD1 As Integer, ByVal iD2 As Integer, ByVal iD3 As Integer, ByVal iDc As Integer) As Boolean 930 Dim rX1, rY1, rZ1 As Double 931 Dim rX2, rY2, rZ2 As Double 932 Dim rX3, rY3, rZ3 As Double 933 Dim rXc, rYc, rZc As Double 934 rXc = DS_LasPoints(iDc).rX1 935 rYc = DS_LasPoints(iDc).rY1 936 rZc = DS_LasPoints(iDc).rZ1 937 rX1 = DS_LasPoints(iD1).rX1 938 rY1 = DS_LasPoints(iD1).rY1 939 rZ1 = DS_LasPoints(iD1).rZ1 940 rX2 = DS_LasPoints(iD2).rX1 941 rY2 = DS_LasPoints(iD2).rY1 942 rZ2 = DS_LasPoints(iD2).rZ1 943 rX3 = DS_LasPoints(iD3).rX1 944 rY3 = DS_LasPoints(iD3).rY1 945 rZ3 = DS_LasPoints(iD3).rZ1 946 IteDist = IterationDistance(rX1, rY1, rZ1, rX2, rY2, rZ2, rX3, rY3, rZ3, rXc, rYc, rZc) 947 Dim Angle As Double 948 Angle = IterationAngle2(iD1, iD2, iD3, iDc, IteDist) 949 Dim AllowDist As Double 950 Dim AllowAngle As Double 951 AllowDist = Val(FrmGndClassification.IteDist1Val.Text) 952 AllowAngle = Val(FrmGndClassification.IteAngle1Val.Text) 953 If Angle < AllowAngle And IteDist < AllowDist Then 954 DS_LasPoints(iDc).classification = 955 AddTriangle(iD1, iD2, iDc) 956 AddTriangle(iD3, iD2, iDc) 957 AddTriangle(iD1, iD3, iDc) 958 DrawTriangle2(iD1, iD2, iDc) 959 DrawTriangle2(iD3, iD2, iDc) 960 DrawTriangle2(iD1, iD3, iDc) 961 Return True 962 Else 963 Return False 964 End If 965 End Function 966 967 Function IterationAngle2(ByVal iD1 As Integer, ByVal iD2 As Integer, ByVal iD3 As Integer, ByVal iDc As Integer, ByVal IteDist As Double) As Double 968 Dim rX1, rY1, rZ1 As Double 969 Dim rX2, rY2, rZ2 As Double 970 Dim Dist1, Dist2, Dist3 As Double 971 rX1 = DS_LasPoints(iDc).rX1 972 rY1 = DS_LasPoints(iDc).rY1 973 rZ1 = DS_LasPoints(iDc).rZ1 974 rX2 = DS_LasPoints(iD1).rX1 975 rY2 = DS_LasPoints(iD1).rY1 976 rZ2 = DS_LasPoints(iD1).rZ1 977 Dist1 = Math.Sqrt((rX2 - rX1) ^ + (rY2 - rY1) ^ + (rZ2 - rZ1) ^ 2) 175 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 Integer) 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 rX1 = DS_LasPoints(iDc).rX1 rY1 = DS_LasPoints(iDc).rY1 rZ1 = DS_LasPoints(iDc).rZ1 rX2 = DS_LasPoints(iD2).rX1 rY2 = DS_LasPoints(iD2).rY1 rZ2 = DS_LasPoints(iD2).rZ1 Dist2 = Math.Sqrt((rX2 - rX1) ^ + (rY2 - rY1) ^ + (rZ2 - rZ1) ^ 2) rX1 = DS_LasPoints(iDc).rX1 rY1 = DS_LasPoints(iDc).rY1 rZ1 = DS_LasPoints(iDc).rZ1 rX2 = DS_LasPoints(iD3).rX1 rY2 = DS_LasPoints(iD3).rY1 rZ2 = DS_LasPoints(iD3).rZ1 Dist3 = Math.Sqrt((rX2 - rX1) ^ + (rY2 - rY1) ^ + (rZ2 - rZ1) ^ 2) Dim DistMin As Double DistMin = 1.0E+20 If Dist1 < DistMin Then DistMin = Dist1 If Dist2 < DistMin Then DistMin = Dist2 If Dist3 < DistMin Then DistMin = Dist3 'Tim diem co Distmin Dim iDDistMin As Integer If Dist1 = DistMin Then iDDistMin = iD1 ElseIf Dist2 = DistMin Then iDDistMin = iD2 ElseIf Dist3 = DistMin Then iDDistMin = iD3 End If Dim SinAngle As Double SinAngle = IteDist / DistMin Return (Math.Asin(SinAngle) * 180 / 3.141592) End Function Sub DrawTriangle2(ByVal iD1 As Integer, ByVal iD2 As Integer, ByVal iD3 As Dim vX1, vX2, vY1, vY2 As Integer vX1 = vX(DS_LasPoints(iD1).rX1) vY1 = vY(DS_LasPoints(iD1).rY1) vX2 = vX(DS_LasPoints(iD2).rX1) vY2 = vY(DS_LasPoints(iD2).rY1) g.DrawLine(Pens.Magenta, vX1, vY1, vX2, vY2) vX1 = vX(DS_LasPoints(iD2).rX1) vY1 = vY(DS_LasPoints(iD2).rY1) vX2 = vX(DS_LasPoints(iD3).rX1) vY2 = vY(DS_LasPoints(iD3).rY1) g.DrawLine(Pens.Magenta, vX1, vY1, vX2, vY2) vX1 = vX(DS_LasPoints(iD3).rX1) vY1 = vY(DS_LasPoints(iD3).rY1) vX2 = vX(DS_LasPoints(iD1).rX1) vY2 = vY(DS_LasPoints(iD1).rY1) g.DrawLine(Pens.Magenta, vX1, vY1, vX2, vY2) End Sub Private Sub Triangulation2() ReadTriangles() For i = To TrianglesCount DrawTriangle2(DS_Triangles(i).iD1, DS_Triangles(i).iD2, DS_Triangles(i).iD3) 176 1034 Next 1035 End Sub 1036 1037 Private Sub ToolStripButtonGround_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButtonGround.Click 1038 Ground2ToolStripMenuItem_Click(sender, e) 1039 End Sub 1040 1041 Private Sub AsphaltToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AsphaltToolStripMenuItem.Click 1042 Dim Inten As Integer 1043 Dim i As Integer 1044 FrmAspClassification.ShowDialog() 1045 Inten = Val(FrmAspClassification.IntensityValue.Text) 1046 For i = To LasPointsCount 1047 If DS_LasPoints(i).classification = And DS_LasPoints(i).Intensity < Inten Then 1048 DS_LasPoints(i).classification = 1049 End If 1050 Next 1051 End Sub 1052 1053 Private Sub LowVegetationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LowVegetationToolStripMenuItem.Click 1054 Dim i, j As Integer 1055 Dim CompDist As Double 1056 Dim NDVI As Double 1057 1058 For i = To LasPointsCount 1059 NDVI = (DS_LasPoints(i).NIR - DS_LasPoints(i).Red) / (DS_LasPoints(i).NIR + DS_LasPoints(i).Red) 1060 If DS_LasPoints(i).classification = Then 1061 For j = 20 To TrianglesCount - 1062 If PtInTriangle(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, 1063 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, 1064 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, 1065 DS_LasPoints(i).rX1, DS_LasPoints(i).rY1) = True Then 1066 CompDist = IterationDistance(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, DS_LasPoints(DS_Triangles(j).iD1).rZ1, 1067 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, DS_LasPoints(DS_Triangles(j).iD2).rZ1, 1068 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, DS_LasPoints(DS_Triangles(j).iD3).rZ1, 1069 DS_LasPoints(i).rX1, DS_LasPoints(i).rY1, DS_LasPoints(i).rZ1) 1070 If CompDist < 0.3 And NDVI > 0.3 Then 1071 DS_LasPoints(i).classification = 1072 End If 1073 Exit For 1074 End If 1075 Next 1076 End If 1077 Next 177 1078 End Sub 1079 1080 Private Sub MedVegetationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MedVegetationToolStripMenuItem.Click 1081 Dim i, j As Integer 1082 Dim CompDist As Double 1083 Dim NDVI As Double 1084 For i = To LasPointsCount 1085 NDVI = (DS_LasPoints(i).NIR - DS_LasPoints(i).Red) / (DS_LasPoints(i).NIR + DS_LasPoints(i).Red) 1086 If DS_LasPoints(i).classification = Then 1087 For j = 20 To TrianglesCount - 1088 If PtInTriangle(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, 1089 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, 1090 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, 1091 DS_LasPoints(i).rX1, DS_LasPoints(i).rY1) = True Then 1092 CompDist = IterationDistance(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, DS_LasPoints(DS_Triangles(j).iD1).rZ1, 1093 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, DS_LasPoints(DS_Triangles(j).iD2).rZ1, 1094 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, DS_LasPoints(DS_Triangles(j).iD3).rZ1, 1095 DS_LasPoints(i).rX1, DS_LasPoints(i).rY1, DS_LasPoints(i).rZ1) 1096 If CompDist < 0.5 And NDVI > 0.3 Then 1097 DS_LasPoints(i).classification = 1098 End If 1099 Exit For 1100 End If 1101 Next 1102 End If 1103 Next 1104 End Sub 1105 1106 Private Sub HighVegetationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HighVegetationToolStripMenuItem.Click 1107 Dim i, j As Integer 1108 Dim CompDist As Double 1109 Dim NDVI As Double 1110 For i = To LasPointsCount 1111 NDVI = (DS_LasPoints(i).NIR - DS_LasPoints(i).Red) / (DS_LasPoints(i).NIR + DS_LasPoints(i).Red) 1112 If DS_LasPoints(i).classification = Then 1113 For j = 20 To TrianglesCount - 1114 If PtInTriangle(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, 1115 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, 1116 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, 1117 DS_LasPoints(i).rX1, DS_LasPoints(i).rY1) = True Then 178 1118 CompDist = IterationDistance(DS_LasPoints(DS_Triangles(j).iD1).rX1, DS_LasPoints(DS_Triangles(j).iD1).rY1, DS_LasPoints(DS_Triangles(j).iD1).rZ1, 1119 DS_LasPoints(DS_Triangles(j).iD2).rX1, DS_LasPoints(DS_Triangles(j).iD2).rY1, DS_LasPoints(DS_Triangles(j).iD2).rZ1, 1120 DS_LasPoints(DS_Triangles(j).iD3).rX1, DS_LasPoints(DS_Triangles(j).iD3).rY1, DS_LasPoints(DS_Triangles(j).iD3).rZ1, 1121 DS_LasPoints(i).rX1, DS_LasPoints(i).rY1, DS_LasPoints(i).rZ1) 1122 If CompDist >= 0.5 And NDVI > 0.3 Then 1123 DS_LasPoints(i).classification = 1124 End If 1125 Exit For 1126 End If 1127 Next 1128 End If 1129 Next 1130 End Sub 1131 1132 End Class