Daha çox

Şeffil və ya raster formatlarından LAS-a çevrilirsiniz?


ESRI shapefile formatından LAS-a və ya ümumi bir raster formatından LAS-a çevirmək üçün bir həll axtarıram. Aşağıdakı proqram təminatına girişim var:

  • Masaüstü üçün ArcGIS 10.2 (məkan analitiki və 3d analitik uzantıları olan arcinfo),
  • Qlobal Mapper,
  • LASTools (lisenziyasız),
  • QGIS 2.8,
  • Whitebox GAT.

LASTools-da funksionallığım varshp2las.exealətdir, amma lisenziyam olmadığına görə XYZ səs-küyü əlavə etmədən əvvəl yalnız 2 milyon bal idarə edə bilər. İşlədiyim böyük həcmli məlumatlara görə, 2 milyon balın altındakı plitələrlə işləmək üçün minlərlə xırda hissəyə bölmək praktik deyil.

İstifadə edərək həll yolu tapma potensialı var iditext2lasalət, lakin bir addımlama / konturlama təsiri səbəbiylə bu alətin çıxışı da qəbuledilməzdir. Transformasiya zamanı giriş məlumatlarının yuvarlaqlaşdırılmasının və ya kəsilməsinin baş verməməsini təmin etmək səylərinə baxmayaraq.

Bu formatlar arasında müvəffəqiyyətlə çevrilmək üçün açıq mənbə və ya pulsuz proqram vasitəsilə bir yol varmı?

Yoxsa FME və ya LASTools və ya başqa bir proqram üçün lisenziya almağa baxıram?


Xüsusiyyətləriniz nöqtələr olmalıdır, Raster-dən Noktaya istifadə edərək rasteri nöqtəyə çevirə bilərsiniz.

AddXY vasitəsi ilə X, Y (və varsa Z) koordinatlarını nöqtələrə əlavə edə bilərsiniz, əgər yoxsa onsuz da orada bir yüksəklik sahəsi olmalıdır və ya dərədə qalırsınız ...

ArcMap-ı başladın, ekranı söndürün (yeniləməyə ehtiyac yoxdur), nöqtələri əlavə edin, sahələri formatlayın və X, Y, Z-ni saxlayın, atribut cədvəlini açın (işarə: ArcGis 10+ süründürərək sahələri yenidən sıralaya bilərsiniz, lakin onlar olmalıdır ixracdan əvvəl düzgün qaydada olmalıdır). Cədvəli ixrac edin və Las sənədinə çevirmək üçün LAStools XYZ2las istifadə edin.

Göründüyü kimi Global Mapper bunu Raster və Elevation Data ixracı ilə edəcək, bu vasitənin Raster və ya Vector formatını gözlədiyini bilmirəm ... "kömək" də çox kömək yoxdur.

Əgər maraqlanırsınızsa (işləyən) C ++ kodu.

# "stdafx.h" # daxil edin  # daxil edin  # daxil edin  # daxil edin  # daxil edin  #pragma paketi (push, 1) // quruluş qablaşdırmasını 1 struct LAShdrFirst {char FileSig [4] olaraq qurun; imzasız __int16 FileSource; imzasız __int16 Reserve_Unused; imzasız __int32 Project_ID_Data1; imzasız __int16 Project_ID_Data2; imzasız __int16 Project_ID_Data3; char Project_ID_Data4 [8]; imzasız char Version_Major; imzasız char Version_Minor; char System_ID [32]; char Software [32]; imzasız __int16 FC_Day, FC_Year, Header_Size; imzasız __int32 Offset_to_Data; imzasız __int32 VarLenRecs; imzasız char Pt_DataFormat; }; struct LAShdrSecond {imzasız __int16 Pt_DataRecLen; imzasız __int32 PointCount; imzasız __int32 Point_by_Return_0; imzasız __int32 Point_by_Return_1; imzasız __int32 Point_by_Return_2; imzasız __int32 Point_by_Return_3; imzasız __int32 Point_by_Return_4; }; struct LAShdrSpatial {ikiqat Xscale; ikiqat ölçülü; ikiqat Zscale; ikiqat Xoffset; ikiqat Yoffset; ikiqat Zoffset; ikiqat MaxX; ikiqat MinX; ikiqat MaxY; ikiqat MinY; ikiqat MaxZ; ikiqat MinZ; }; struct LASrec0 {int X; int Y; int Z; imzasız qısa intensivlik; char DataByte; imzasız char Təsnifatı; char ScanAngle; char UserData; imzasız qısa PointSourceID; ; #pragma paketi (pop) // qablaşdırmanı konst olan hər şeyə qaytarın int int MaxTxtSize = 256; void Convert (char * Directory, char * InFileName) {printf ("% s \% s  n çevir", Directory, InFileName); char * nName = (char *) malloc (MaxTxtSize); üçün (int i = 0; iFileSig [0] = 'L'; Əvvəlcə>> FileSig [1] = 'A'; Əvvəlcə>> FileSig [2] = 'S'; Əvvəlcə>> FileSig [3] = 'F'; Birincisi -> Ofset_to_Data = 229; Birincisi-> Pt_DataFormat = 0; Birinci-> Version_Major = 1; Birincisi-> Version_Minor = 2; Second-> Pt_DataRecLen = 20; Mekansal-> Xscale = 0.01; Mekansal-> Yscale = 0.01; Mekansal-> Zscale = 0.01; char * InFilePath = (char *) malloc (MaxTxtSize); char * OutFilePath = (char *) malloc (MaxTxtSize); std :: string FileLine; char * FileData; sprintf (InFilePath, "% s \% s", Directory, InFileName); sprintf (OutFilePath, "% s \% s", Directory, nName); ikiqat pX, pY, pZ; imzasız __int32 PointCount = 0; imzasız __int16 intensivliyi = 0; char * TextValues ​​= (char *) malloc (32); bool ExtentStarted = yalan; for (int i = 0; i <32; i ++) {TextValues ​​[i] = ' 0'; } int vPnt = 0; int MaxLen; int pCnt, TVp; std :: ifstream InFile (InFilePath, std :: ios :: in); std :: ofstream OutLasFile (OutFilePath, std :: ios :: out | std :: ios :: ikili); OutLasFile.write ((char *) Əvvəlcə sizeof (LAShdrFirst)); OutLasFile.seekp (Birinci-> Offset_to_Data, std :: ios :: beg); // do {getline (InFile, FileLine) ilk qeydini axtarın; MaxLen = FileLine.size (); əgər (MaxLen> 0) {FileData = yeni char [MaxLen + 1]; std :: surəti (FileLine.begin (), FileLine.end (), FileData); FileData [MaxLen] = ' 0'; // sıfır sonlandırma ÇOX Vacib vPnt = 0; TVp = 0; for (pCnt = 0; pCnt <= MaxLen; pCnt ++) {if (FileData [pCnt] == ​​"|| FileData [pCnt] == ​​',' || FileData [pCnt] == ​​' t' || FileData [ pCnt] == ​​' 0') // virgül və ya son sətir. {if (vPnt == 0) pX = atof (TextValues); else if (vPnt == 1) pY = atof (TextValues); else if (vPnt) == 2) pZ = atof (TextValues); başqa halda (vPnt == 3) intensivlik = atoi (TextValues); TVp = 0; vPnt ++; for (int i = 0; i <32; i ++) {TextValues ​​[i] = ' 0';}} başqa {TextValues ​​[TVp] = FileData [pCnt]; TVp ++;}} if (ExtentStarted) {Spatial-> MinX = (pX  MinX)? PX: Spatial-> MinX; Mekansal-> MaxX = (pX> Mekansal-> MaxX)? PX: Mekansal-> MaxX; Mekansal-> MinY = (pY  MinY)? PY: Mekansal-> MinY; Mekansal-> MaxY = (pY> Mekansal-> MaxY)? PY: Mekansal-> MaxY; Mekansal-> MinZ = (pZ  MinZ)? PZ: Mekansal-> MinZ; Mekansal-> MaxZ = (pZ> Mekansal-> MaxZ)? PZ: Mekansal-> MaxZ;} başqa {Mekansal-> MinX = pX; Mekansal-> MaxX = pX; Mekansal-> MinY = pY; Mekansal-> MaxY = pY; Mekansal-> MinZ = pZ; Mekansal-> MaxZ = pZ; ExtentStarted = true;} Qeyd-> X = pX * 100; Qeyd-> Y = pY * 100; Qeyd-> Z = pZ * 100; Qeyd-> intensivlik = sıxlıq; OutLasFile.write ((char *) & Record-> X, 4); OutLasFile.write ((char *) & Record-> Y, 4); OutLasFile.write ((char *) & Record-> Z, 4); OutLasFile.write ((char *) & Record-> Intensive, 2); OutLasFile.write ((char *) & Record-> DataByte, 1); OutLasFile.write ((char *) & Record-> Classification, 1); OutLasFile.write (Boş4,4); PointCount ++; silmək [] FileData; }} while (! InFile.eof ()); OutLasFile.flush (); Second-> Point_by_Return_0 = PointCount; Second-> PointCount = PointCount; OutLasFile.seekp (105, std :: ios :: beg); OutLasFile.write ((char *) & Second-> Pt_DataRecLen, 2); OutLasFile.write ((char *) & Second-> PointCount, 4); OutLasFile.write ((char *) & Second-> Point_by_Return_0,4); OutLasFile.write (Empty4,4); // OutLasFile.write (Empty4,4) nöqtə-puan yazmamaq; OutLasFile.write (Boş4,4); OutLasFile.write (Boş4,4); OutLasFile.write ((char *) Mekansal, sizeof (LAShdrSpatial)); InFile.close (); OutLasFile.close (); pulsuz (TextValues); pulsuz (nName); pulsuz (InFilePath); pulsuz (OutFilePath); pulsuz (Birincisi); pulsuz (İkinci); pulsuz (Mekansal); pulsuz (Qeyd); pulsuz (Boş4); } int _tmain (int argc, _TCHAR * argv []) {if (argc == 1) {printf ("XYZI vergül və ya LAS çevirici versiyasına 1.1 ayrılmış format.  n"); printf (" n"); printf ("RPS Spatial-dan Michael Miles-Stimson tərəfindən C ++ dilində yazılan alət"); printf (" n"); printf ("X, Y, Z (, I) formatlı sənədi LAS versiya 1.2 formatına çevirir.  n"); printf ("XYZI sənədində başlıq sətri olmadığına əmin olun  n"); printf ("Bu aləti çalıştırmadan əvvəl.  n"); printf (" n"); printf ("Bu vasitə, giriş qovluğundakı  n olan hər faylı çevirir"); printf ("uzantısı .XYZI və ya .XYZ, əlavə tam adı ilə fayl adlandırılması  n"); printf (". las, yəni abcd.xyzi abcd_xyzi.las olur.  n"); printf (" nBütün nöqtələrin təsnifatı 0  n" olacaq); printf (" n"); printf ("İstifadəsi: XYZI_To_LAS  n "); return 0;} char * fName = (char *) malloc (MaxTxtSize); char * dName = (char *) malloc (MaxTxtSize); wcstombs (dName, argv [1], MaxTxtSize); wchar_t * wtf = yeni wchar_t [MaxTxtSize]; swprintf (wtf, MaxTxtSize, L "% s  *. XYZI", argv [1]); WIN32_FIND_DATA fData; HANDLE hFind; hFind = FindFirstFile (wtf, & fData); if (hFind! INVALID_HANDLE_VALUE) {wcstombs (fName, fData.cFileName, MaxTxtSize); // printf ("First File% s  n", fName); Convert (dName, fName); while (FindNextFile (hFind, & fData)! = 0) { wcstombs (fName, fData.cFileName, MaxTxtSize); Çevir (dName, fName); // printf (">% s  n", fName);}} swprintf (wtf, MaxTxtSize, L "% s  *. XYZ ", argv [1]); hFind = FindFirstFile (wtf, & fData); if (hFind! = INVALID_HANDLE_VALUE) {wcstombs (fName, fData.cFileName, MaxTxtSize); Convert (dName, fName); while (FindNataFile ( )! = 0) {wcstombs (fName, fData.cFileName, MaxTxtSize); Convert (dName, fName); // printf (">% s  n", fName);}} delete [] wtf; free (fName) ; pulsuz (dName); qayıt 0;}

Bu, XYZI sənədlərinin bir qovluğunu nöqtə qeyd növü 0 ilə ASPRS LAS 1.2-ə çevirir. Genişləndirmə XYZI olmalıdır, lakin vergül, boşluq və ya nişanla ayrılmış ola bilər. Çox şərh yoxdur və olduqca təmkinli deyil, ancaq mənim ikinci C ++ proqramım idi. Kodu kopyalayın və yeni bir Visual C ++ layihəsinə (konsol tətbiqi) yerləşdirin, qurun və sonra komanda xəttində çalışın.

Qeyd: LASheader.h-in yalnız bir hissəsini (bu başlıqdakı 2266 sətir) fiziki olaraq bu koda yerləşdirmişəm, belə ki, bir strukturun əskik olması mümkündür, tez bir yoxlama verdim və açıq bir şey görə bilmirəm.


PDAL GDAL oxuyucusu, GDAL tərəfindən oxunan hər hansı bir raster mənbəsini oxuyacaq və nöqtə buluduna çevirəcəkdir. Daha sonra digər PDAL imkanlarını lazımi filtr kimi istifadə edə və məlumatları işləyə bilərsiniz.


Videoya baxın: From LAZ to raster with Lastools and ArcMap (Oktyabr 2021).