জিওটিফ ইমেজ থেকে লিজডের ডেটাতে আরজিবি ব্যবহার করে আর


10

আমি একটি জিওটিফ চিত্র এবং এর সাথে সম্পর্কিত লিডার ডেটা (এক্স, ওয়াই, জেড) ইউটিএম স্থানাঙ্কগুলিতে দিয়েছি। আমাকে ইমেজ থেকে আরজিবি মানগুলির সাথে লিডার ডেটা মার্জ করতে হবে।

তার মানে, শেষে, আমাকে জিওডিফ চিত্র থেকে সম্পর্কিত আরজিবি মান দিয়ে কোডড লিডার মেঘের প্রতিটি পয়েন্ট প্লট করতে হবে (3 ডি)।

আমি কিউজিআইএস ব্যবহার করে লিডার ডেটাটিকে শেফফাইলে রূপান্তর করেছি। এরপর আমার কি করা উচিৎ?

আর-তে, আমি plot3Dফাংশনটি চেষ্টা করেছিলাম , কিন্তু, এটি কার্যকর হয়নি। আমি পাঠ্য ডক , শেফফিল এবং টিফ চিত্রটি সংযুক্ত করছি

সম্পাদনা:

আমি নীচে প্রদর্শিত হিসাবে নিম্নলিখিত প্রোগ্রামটি সম্পন্ন করেছি:

require(raster) 
require(maptools)  # to take shape files
#require(car) # for scatter3D 
require(plot3Drgl)

##setwd("C:\\Users\\Bibin Wilson\\Documents\\R")
##source('Lidar.r')

data = read.csv("C:\\Users\\Bibin Wilson\\Desktop\\Lidar\\lidardata.csv")
#nr = nrow(data)
nc = ncol(data)

nr = 500

require(rgdal)
X = readGDAL("C:\\Users\\Bibin Wilson\\Desktop\\Lidar\\image.tif")

topx = 4.968622208855732e+05;
topy = 5.419739403811632e+06;

final = matrix(nrow = nr, ncol = nc+2)

for(i in 1:nr) {
 x = data[i,1]
 y = data[i,2]
 rr = round((topy-y)/0.0833)
 cc = abs(round((x-topx)/0.0833))
 if(rr == 0) {
  rr = 1
 }
 if(cc == 0) {
  cc = 1
 }
 final[i,1] = x
 final[i,2] = y
 final[i,3] = data[i,3]
 final[i,4] = rr
 final[i,5] = cc
}

for(i in 1:nr) {
 x = final[i,1]
 y = final[i,2]
 z = final[i,3]     
 rr = final[i,4]
 cc = final[i,5]
 if(rr <= 5086 && cc<=3265) {
  r = X[rr,cc,1]/255
  g = X[rr,cc,2]/255
  b = X[rr,cc,3]/255
  c = cbind(r,g,b)
  scatter3D(x,y,z,2,c)
 }
}

গ্রাফটি প্লট করার চেষ্টা করার সময় এটি নিম্নলিখিত ত্রুটিটি দেখায়:

[.data.frame(X @ ডেটা, আই, জে, ..., ড্রপ = ফলস) এ ত্রুটি : অব্যবহৃত যুক্তি (1)

সম্পাদনা:

আরজিবি ছাড়াই আমি 3D মডেলটি পেয়েছি যেমনটি নীচে দেখানো হয়েছে:

এখানে চিত্র বর্ণনা লিখুন



1
আপনি এমন প্রশ্নে বিভ্রান্তিকর শর্তাদি তৈরি করছেন যা প্রশ্ন করছে এবং আপনার কোডটি অযৌক্তিক। বহুভুজগুলি বিচ্ছিন্ন অঞ্চলে প্রতিনিধিত্ব করে যেখানে পয়েন্টগুলি স্পষ্টত এক্স, ওয়াই অবস্থানের হয়। দেখে মনে হচ্ছে আপনি বহুভুজ নয় একটি পয়েন্ট বৈশিষ্ট্য বর্গ পড়ছেন। যদি এটি হয় তবে আপনি নিষ্কাশন ফাংশনে "মজা = গড়" চান না। আমি আরও উল্লেখ করব যে আর লার্জ পয়েন্ট মেঘের 3 ডি প্লটের জন্য আদর্শ সফ্টওয়্যার নয়। অতিরিক্ত, আপনার উদ্দেশ্যটি ভিজ্যুয়ালাইজেশনের জন্য ঠিক আছে তবে 3 ডি ডেটাতে প্রজেক্ট করা 2 ডি প্যারালাক্স ইস্যুগুলির কারণে, আপনি এটিকে বিশ্লেষণাত্মকভাবে ব্যবহার করতে পারবেন না।
জেফ্রি ইভান্স

শেফফাইল এবং টিআইএফএফ ফাইলগুলিকে একীভূত করার কোনও উপায় আছে কি না, যাতে আমি সেগুলি আউট করতে কিছু অন্যান্য সফ্টওয়্যার সরঞ্জাম ব্যবহার করতে পারি।
বাইবিনউইলসন

কুনশন সহজ। আমার একটি আরজিবি জিওটিফফ চিত্র + এক্সওয়াইজেড মান থেকে একটি 3D প্লট দরকার 3D
বাইবিনউলসন

2
যদি আপনাকে আর ব্যবহার করতে না হয়, আপনি PDAL এর রঙিন ফিল্টারটি ব্যবহার করতে পারেন: pdal.io/stages/filters.colorization.html
পিট

উত্তর:


11

আপনার প্রশ্নটি পরিষ্কার করার জন্য ধন্যবাদ কারণ এটি ইতিপূর্বে অস্পষ্ট ছিল। আপনি রাস্টার প্যাকেজে স্ট্যাক বা ইট ফাংশন ব্যবহার করে কোনও মাল্টিব্যান্ড রাস্টার পড়তে পারেন এবং রাস্টার থেকেও এক্সট্র্যাক্ট ব্যবহার করে কোনও স্পাটিয়ালপয়েন্টস ডেটা ফ্রেম অবজেক্টকে সম্পর্কিত আরজিবি মানগুলি নির্ধারণ করতে পারেন। ডেটা.ফ্রেম অবজেক্টের জবরদস্তি (যা রিড সিএসভি থেকে ফলাফল) এসপি পয়েন্ট অবজেক্টে, যা এক্সট্রাক্ট করার জন্য পাস করা যায়, এসপি প্যাকেজটি ব্যবহার করে অর্জন করা হয়।

3D প্লটটি আরজিএল প্যাকেজ থেকে আসে। যেহেতু প্লটটি ইন্টারেক্টিভ এবং কোনও ফাইলে পাস করা হয়নি, আপনি rgl.snapshot ব্যবহার করে একটি ফাইল তৈরি করতে পারেন। বেস আরজিবি ফাংশনটি তিনটি আরজিবি মান নেয় এবং এটি একটি একক-মান আর রঙের তৈরি করে। ডেটা অনুসারে একটি ভেক্টর তৈরি করে, আপনি একটি সত্য মাত্রা হিসাবে বর্ণ নির্ধারণ না করে (যা আপনার প্রাথমিক বিভ্রান্তি বলে মনে হয়েছিল) কোল আর্গুমেন্ট ব্যবহার করে একটি প্লট রঙ করতে পারেন।

এখানে একটি দ্রুত ডামি উদাহরণ রয়েছে।

require(rgl)
require(sp)

n=100

# Create a dummy datafame object with x,y,z values
lidar <- data.frame(x=runif(n,1,10), y=runif(n,1,10), z=runif(n,0,50))
  coordinates(lidar) <- ~x+y

# Add dummy RGB values 
lidar@data <- data.frame(lidar@data, red=round(runif(n,0,255),0), green=round(runif(n,0,255),0), 
                         blue=round(runif(n,0,255),0)) 

# Create color vector using rgb values
cols <- rgb(lidar@data[,2:4], maxColorValue = 255)

# Interactive 3D plot
plot3d(coordinates(lidar)[,1],coordinates(lidar)[,2],lidar@data[,"z"], col=cols,
       pch=18, size=0.75, type="s", xlab="x", ylab="x", zlab="elevation")

এবং, আপনার সরবরাহিত ডেটা সহ একটি কাজের উদাহরণ।

require(raster)
require(rgl)

setwd("D:/TMP")

# read flat file and assign names
lidar <- read.table("lidar.txt")
  names(lidar) <- c("x","y","z")

# remove the scatter outlier(s)  
lidar <- lidar[lidar$z >= 255 ,]

# Coerce to sp spatialPointsDataFrame object
coordinates(lidar) <- ~x+y  

# subsample data (makes more tractable but not necessary)  
n=10000 
lidar <- lidar[sample(1:nrow(lidar),n),]

# Read RGB tiff file  
img <- stack("image.tif")
  names(img) <- c("r","g","b")

# Assign RGB values from raster to points
lidar@data <- data.frame(lidar@data, extract(img, lidar))

# Remove NA values so rgb function will not fail
na.idx <- unique(as.data.frame(which(is.na(lidar@data), arr.ind = TRUE))[,1])
  lidar <- lidar[-na.idx,]

# Create color vector using rgb values
cols <- rgb(lidar@data[,2:4], maxColorValue = 255)

# Interactive 3D plot
plot3d(coordinates(lidar)[,1],coordinates(lidar)[,2],lidar@data[,"z"], col=cols,
       pch=18, size=0.35, type="s", xlab="x", ylab="x", zlab="elevation")

পোস্টারের দ্বারা সরবরাহিত নমুনা ডেটা দিয়ে আমি উপরের কোডটি চেষ্টা করেছি। এটি কাজ করে তবে আরজিবি রঙগুলি কিছুটা অগোছালো। আমার রাস্তার রাস্তাগুলি এবং বিপরীতে রঙের মতো রঙিন ছাদ রয়েছে। নমুনা txt লিডারডাটের অঙ্কগুলিতে খুব কম নির্ভুলতার কারণে এটি সম্ভবত?
umbe1987

3

3 ডি-তে LiDAR ডেটা এবং আরজিবি মানগুলি রেন্ডারের বিকল্প হ'ল ফুগ্রোভিউয়ার

নীচে, তারা সরবরাহ করে এমন নমুনা তথ্য সহ একটি উদাহরণ রয়েছে। আমি এই ফাইলটি এনটাইটেল করা ফাইলটি ব্যবহার করেছি Bmore_XYZIRGB.xyz:

এখানে চিত্র বর্ণনা লিখুন

ফুগ্রো ভিউয়ারে খোলার সময় ফাইলের মধ্যে উপলব্ধ সংশ্লিষ্ট ক্ষেত্রগুলি নির্বাচন করুন (এই ক্ষেত্রে, একটি .xyz ফাইল):

এখানে চিত্র বর্ণনা লিখুন

তারপরে, আরবিজি ডেটা ব্যবহার করে পয়েন্টগুলি রঙ করুন, সরঞ্জামটি নির্বাচন করে Color Points by Encoding RGB Image Values(নীচের স্ক্রিনশটে লাল তীরটি দেখুন)। 3D3 ডি ভিজুয়ালাইজেশনের জন্য বোতামটি চালু করুন ।

এখানে চিত্র বর্ণনা লিখুন


3

সম্পাদনা করুন: ম্যাথিয়াসকোপো দ্বারা উল্লিখিত হিসাবে, লাসটুলের নতুন সংস্করণগুলিতে লস্কোর ( README ) ব্যবহার করা হয়েছে ।

lascolor -i LiDAR.las -image image.tif -odix _rgb -olas

আর একটি বিকল্প নিম্নরূপে Las2las ব্যবহার করা হবে :

las2las -i input.las --color-source RGB_photo.tif -o output.las --file-format 1.2 --point-format 3 -v    

সর্বশেষতম সংস্করণটি লাস্কলর ব্যবহার করছে: লাস্কলোর -আই লিজার.লাস-চিত্র চিত্র.টিফ -ডিক্স _আরজিবি-আলাস
ম্যাথিয়াস্কোপো

2

এই কোডটি রাস্টার থেকে x, y, z মানগুলি বের করার জন্য এবং এর একটি 3 ডি মডেল পাওয়ার জন্য gdal, numpy এবং matplotlib ব্যবহার করে।

#!/usr/bin/env python
# -*- coding: utf-8

#Libraries
from osgeo import gdal
from os import system
import struct
import time

import numpy as np
from matplotlib.mlab import griddata
from mpl_toolkits.mplot3d.axes3d import *
from matplotlib import cm
import matplotlib.pyplot as plt

#Function to extract x,y,z values
def getCoorXYZ(band):

    # fmttypes: Byte, UInt16, Int16, UInt32, Int32, Float32 y Float64
    fmttypes = {'Byte':'B', 'UInt16':'H', 'Int16':'h', 'UInt32':'I', 'Int32':'i', 'Float32':'f', 'Float64':'d'}

    print "rows = %d columns = %d" % (band.YSize, band.XSize)

    BandType = gdal.GetDataTypeName(band.DataType)

    print "Data type = ", BandType

    x = []
    y_ = []
    z = []

    inc_x = 0

    for y in range(band.YSize):

        scanline = band.ReadRaster(0, y, band.XSize, 1, band.XSize, 1, band.DataType)
        values = struct.unpack(fmttypes[BandType] * band.XSize, scanline)

        for value in values:
            z.append(value)
            inc_x += 1
            y_.append(inc_x)
            x.append(y+1)           

        inc_x = 0

    return x, y_, z

#Program start here!

system("clear")

nameraster = str(raw_input("raster name = ? "))

start = time.time()

dataset = gdal.Open(nameraster)
band = dataset.GetRasterBand(1)

print "Processing %s" % nameraster

x,y,z = getCoorXYZ(band)

# grid 2D construction
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
X, Y = np.meshgrid(xi, yi)

# interpolation
Z = griddata(x, y, z, xi, yi)

#Visualization with Matplotlib
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,linewidth=1, antialiased=True)
plt.plot

end = time.time()

time_tot = end - start

print "Total time = %.4f s" % time_tot     

plt.show() #necessary for having a static window

আমি উপরের কোডটি একটি slাল দৈর্ঘ্য রাস্টার (জিটিফ, 50 টি সারি x 50 কলাম) দিয়ে ব্যবহার করেছি এবং আমি নিম্নলিখিত ফলাফলটি পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন


1
আসলে আমি 3D মডেল পাচ্ছি। তবে আমার প্রতিটি পিক্সেলের জন্য সংশ্লিষ্ট আরজিবি থাকা দরকার, জিওটিফ চিত্র থেকে আমার এটি বের করতে হবে এবং থ্রিডি মডেলটি স্থাপন করা দরকার
বিবিনউইলসন

আমার কোডটি আপনার 3D মডেলটি পেতে কার্যকর ছিল?
xunilk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.