উচ্চতার প্রোফাইল একটি লাইনের প্রতিটি পাশে 10 কিমি


15

ভূখণ্ডের ব্যান্ডের জন্য আমি কীভাবে একটি উন্নত প্রোফাইল পেতে পারি?

10 কিলোমিটারের মধ্যে সর্বাধিক উচ্চতা (সংজ্ঞায়িত লাইনের প্রতিটি পাশে) আমলে নেওয়া উচিত।

আমি আশা করি আমার প্রশ্নটি পরিষ্কার হয়ে গেছে। আগাম অনেক ধন্যবাদ।


লাইনটি কি আপনার প্রোফাইলটিকে একটি সরল সরলরেখা সংজ্ঞায়িত করছে, বা এটি কোণার সাথে বেশ কয়েকটি অংশ নিয়ে গঠিত?
জেক

লাইনটি বিভিন্ন বিভাগ নিয়ে গঠিত। তবে সমস্ত বিভাগ সরলরেখা। :) মানে কোন বাঁকানো নেই।
কারা

ঠিক ... তারা যেমন বলে..স্পিটবলিং ... তবে আপনি 10 কিমি বাফার দিয়ে লাইনটি বাফার করতে পারবেন। তারপরে বাফারের মধ্যে সমস্ত বৈশিষ্ট্য নির্বাচন করুন ... তারপরে সর্বোচ্চ মানগুলি নির্বাচন করুন?
জের

1
আপনি যা অর্জন করতে চান তার একটি চিত্র সরবরাহ করতে পারেন?
আলেকজান্দ্রে নেট

@ অ্যালেক্স: আমি যে ফলাফলটি চাই তা হ'ল নিয়মিত এলিভেশন গ্রাফ। তবে একটি 10 ​​কিলোমিটার বাফার দিয়ে যাতে নির্বাচিত পাথের প্রতিটি পাশের সর্বোচ্চ মান 10 কিলোমিটার গ্রাফটিতে প্রদর্শিত হয়।
কারা

উত্তর:


14

মন্তব্যগুলি অনুসরণ করে, এখানে একটি সংস্করণ রয়েছে যা লম্ব লাইন বিভাগগুলির সাথে কাজ করে। আমি এটির পুরোপুরি পরীক্ষা না করায় সতর্কতার সাথে ব্যবহার করুন!

এই পদ্ধতিটি @ হুইবারের উত্তরের চেয়ে অনেক বেশি ছোঁয়াচে - আংশিক কারণ আমি খুব ভাল প্রোগ্রামার নই, এবং আংশিক কারণ ভেক্টর প্রসেসিংটি কিছুটা ত্রুটিপূর্ণ। আমি আশা করি কমপক্ষে লাইন বিভাগগুলি আপনার প্রয়োজন অনুসারে এটি কমপক্ষে আপনার শুরু করবে started

আপনার কাছে করতে হবে সুষম , Fiona, এবং Numpy এই চালানোর জন্য (তাদের নির্ভরতা সহ) পাইথন প্যাকেজ ইনস্টল করা নেই।

#-------------------------------------------------------------------------------
# Name:        perp_lines.py
# Purpose:     Generates multiple profile lines perpendicular to an input line
#
# Author:      JamesS
#
# Created:     13/02/2013
#-------------------------------------------------------------------------------
""" Takes a shapefile containing a single line as input. Generates lines
    perpendicular to the original with the specified length and spacing and
    writes them to a new shapefile.

    The data should be in a projected co-ordinate system.
"""

import numpy as np
from fiona import collection
from shapely.geometry import LineString, MultiLineString

# ##############################################################################
# User input

# Input shapefile. Must be a single, simple line, in projected co-ordinates
in_shp = r'D:\Perp_Lines\Centre_Line.shp'

# The shapefile to which the perpendicular lines will be written
out_shp = r'D:\Perp_Lines\Output.shp'

# Profile spacing. The distance at which to space the perpendicular profiles
# In the same units as the original shapefile (e.g. metres)
spc = 100

# Length of cross-sections to calculate either side of central line
# i.e. the total length will be twice the value entered here.
# In the same co-ordinates as the original shapefile
sect_len = 1000
# ##############################################################################

# Open the shapefile and get the data
source = collection(in_shp, "r")
data = source.next()['geometry']
line = LineString(data['coordinates'])

# Define a schema for the output features. Add a new field called 'Dist'
# to uniquely identify each profile
schema = source.schema.copy()
schema['properties']['Dist'] = 'float'

# Open a new sink for the output features, using the same format driver
# and coordinate reference system as the source.
sink = collection(out_shp, "w", driver=source.driver, schema=schema,
                  crs=source.crs)

# Calculate the number of profiles to generate
n_prof = int(line.length/spc)

# Start iterating along the line
for prof in range(1, n_prof+1):
    # Get the start, mid and end points for this segment
    seg_st = line.interpolate((prof-1)*spc)
    seg_mid = line.interpolate((prof-0.5)*spc)
    seg_end = line.interpolate(prof*spc)

    # Get a displacement vector for this segment
    vec = np.array([[seg_end.x - seg_st.x,], [seg_end.y - seg_st.y,]])

    # Rotate the vector 90 deg clockwise and 90 deg counter clockwise
    rot_anti = np.array([[0, -1], [1, 0]])
    rot_clock = np.array([[0, 1], [-1, 0]])
    vec_anti = np.dot(rot_anti, vec)
    vec_clock = np.dot(rot_clock, vec)

    # Normalise the perpendicular vectors
    len_anti = ((vec_anti**2).sum())**0.5
    vec_anti = vec_anti/len_anti
    len_clock = ((vec_clock**2).sum())**0.5
    vec_clock = vec_clock/len_clock

    # Scale them up to the profile length
    vec_anti = vec_anti*sect_len
    vec_clock = vec_clock*sect_len

    # Calculate displacements from midpoint
    prof_st = (seg_mid.x + float(vec_anti[0]), seg_mid.y + float(vec_anti[1]))
    prof_end = (seg_mid.x + float(vec_clock[0]), seg_mid.y + float(vec_clock[1]))

    # Write to output
    rec = {'geometry':{'type':'LineString', 'coordinates':(prof_st, prof_end)},
           'properties':{'Id':0, 'Dist':(prof-0.5)*spc}}
    sink.write(rec)

# Tidy up
source.close()
sink.close()

নীচের চিত্রটি স্ক্রিপ্ট থেকে আউটপুট একটি উদাহরণ দেখায়। আপনি আপনার কেন্দ্র-লাইনটি উপস্থাপন করে এমন একটি শেফফাইলে খাওয়াবেন এবং লম্ব লাইনগুলির দৈর্ঘ্য এবং তাদের ব্যবধান উল্লেখ করুন। আউটপুটটি এই চিত্রটিতে লাল রেখাগুলি সহ একটি নতুন শেফফিল, যার প্রত্যেকটির একটি সম্পর্কিত বৈশিষ্ট্য রয়েছে যা প্রোফাইলের শুরু থেকে তার দূরত্ব নির্দিষ্ট করে।

স্ক্রিপ্ট আউটপুট উদাহরণ

@ হুবার মন্তব্যগুলিতে যেমন বলেছেন, একবার আপনি এই পর্যায়ে পৌঁছেছেন তখন তা মোটামুটি সহজ। আর্কম্যাপে আউটপুট যুক্ত করে নীচের চিত্রটি আরও একটি উদাহরণ দেখায়।

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

লম্ব লাইনগুলিকে শ্রেণিবদ্ধ রাস্টারে রূপান্তর করতে বৈশিষ্ট্য থেকে রাস্টার সরঞ্জামটি ব্যবহার করুন । আউটপুট শেফফাইলে রাস্টারটিকে ক্ষেত্র VALUEহিসাবে সেট করুন Dist। এছাড়াও টুল সেট মনে রাখবেন Environments, যাতে Extent, Cell sizeএবং Snap rasterআপনার অন্তর্নিহিত DEM এর জন্য একই। আপনার লাইনগুলির রাস্টার উপস্থাপনা দিয়ে শেষ করা উচিত, এরকম কিছু:

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

অবশেষে, এই রাস্টারটিকে একটি পূর্ণসংখ্যার গ্রিডে রূপান্তর করুন ( ইন্ট সরঞ্জাম বা রাস্টার ক্যালকুলেটর ব্যবহার করে) এবং এটিকে জোনাল পরিসংখ্যানের জন্য ইনপুট অঞ্চল হিসাবে সারণী সরঞ্জাম হিসাবে ব্যবহার করুন । আপনার এভাবে আউটপুট টেবিলটি শেষ করা উচিত:

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

VALUEএই টেবিলের ক্ষেত্র মূল প্রফাইল লাইন শুরু থেকে দূরত্ব দেয়। অন্যান্য কলামগুলি প্রতিটি সংক্রামকের মানগুলির জন্য বিভিন্ন পরিসংখ্যান (সর্বোচ্চ, গড় ইত্যাদি) দেয়। আপনি আপনার सारांश প্রোফাইল প্লট করতে এই টেবিলটি ব্যবহার করতে পারেন।

এনবি: এই পদ্ধতির সাথে একটি স্পষ্ট সমস্যা হ'ল, যদি আপনার মূল লাইনটি খুব কপিলভাবে হয় তবে ট্রান্সেকট লাইনগুলির কয়েকটি ওভারল্যাপ হতে পারে। আর্কজিআইএসের জোনাল পরিসংখ্যান সরঞ্জামগুলি ওভারল্যাপিং অঞ্চলগুলি নিয়ে কাজ করতে পারে না, সুতরাং যখন এটি ঘটে তখন আপনার ট্রান্সেকট লাইনগুলির মধ্যে একটি অপরটির চেয়ে বেশি অগ্রাধিকার গ্রহণ করবে। আপনি যা করছেন তার জন্য এটি সমস্যা হতে পারে বা নাও হতে পারে।

শুভকামনা!


3
+1 এটি একটি দুর্দান্ত অবদানের জন্য একটি দুর্দান্ত শুরু! আপনি যদি দ্বিতীয় চিত্রটি ঘুরে দেখেন তবে আপনি কিছু সংক্ষিপ্ত ট্রানসেক্ট দেখতে পাবেন: এগুলি হ'ল বাঁকগুলির কাছাকাছি crossing এর কারণ আপনার ট্রান্সসেটগুলি ভুলভাবে গণনা করার অ্যালগরিদমটি প্রতিটি বিভাগের স্থানচ্যুতি সমান হবে বলে ধরে নিয়েছে spc, তবে স্থানান্তরগুলি ছোট করে। পরিবর্তে, আপনার ট্রান্সভার্স ডাইরেক্ট ভেক্টরকে স্বাভাবিক করতে হবে (এর উপাদানগুলিকে ভেক্টরের দৈর্ঘ্য অনুসারে ভাগ করুন) এবং তারপরে ট্রান্সেক্টের কাঙ্ক্ষিত ব্যাসার্ধের দ্বারা এটি গুণিত করুন।
হোবার

আপনি বেশ সঠিক - প্রতিক্রিয়া জন্য ধন্যবাদ শুভ! আশা করি এখনই ঠিক হয়ে গেছে ...
জেমস

প্রিয় জেমস, আমি চেষ্টা করব যে আপনাকে অনেক ধন্যবাদ। এই সমাধান পুরোপুরি মামলা।
কারা

11

10 কিলোমিটারের মধ্যে সর্বাধিক উচ্চতা হ'ল প্রতিবেশী সর্বাধিক মানটি একটি বৃত্তাকার 10 কিলোমিটার ব্যাসার্ধের সাথে গণনা করা হয়, সুতরাং ট্র্যাজেক্টোরির সাথে এই পাড়ার সর্বাধিক গ্রিডের একটি প্রোফাইল বের করুন।

উদাহরণ

এখানে একটি ট্রাজেক্টোরির সাথে একটি পাহাড়ধারী ডিইএম রয়েছে (নীচে থেকে উপরের দিকে কালো রেখা চলছে):

DEM এর

এই চিত্রটি প্রায় 17 বাই 10 কিলোমিটার। পদ্ধতিটি বর্ণনা করার জন্য আমি 10 কিলোমিটারের পরিবর্তে মাত্র 1 কিমি ব্যাসার্ধ বেছে নিয়েছি। এর 1 কিলোমিটার বাফারটি হলদে বর্ণিত দেখানো হয়েছে।

একটি ডিইএমের সর্বাধিক পাড়াটি সর্বদা কিছুটা অদ্ভুত দেখায়, কারণ এটি এমন একটি স্থানে মানের ঝাঁপিয়ে পড়বে যেখানে একটি সর্বাধিক (একটি পাহাড়ের শীর্ষ, সম্ভবত) মাত্র 10 কিলোমিটারের বাইরে এবং অন্য একটি সর্বোচ্চ উচ্চতায় 10 কিলোমিটারের মধ্যে আসে comes । বিশেষত, পাহাড়ের চূড়াগুলি যা তাদের চারপাশে আধিপত্য বিস্তার করে স্থানীয় সর্বাধিক উচ্চতার বিন্দুতে কেন্দ্র করে মানগুলির নিখুঁত বৃত্তগুলিকে অবদান রাখবে:

প্রতিবেশী সর্বাধিক

এই মানচিত্রে গাark় রঙ বেশি।

মূল ডিইএম (নীল) এবং পার্শ্ববর্তী সর্বাধিক (লাল) এর প্রোফাইলগুলির একটি প্লট এখানে রয়েছে:

প্রোফাইল

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


এটি যদিও পুরোপুরি সঠিক নয়, তাই না? প্রতিটি পয়েন্টের চারপাশে একটি বৃত্তাকার বাফারের পরিবর্তে, অন্তর্নিহিত রাস্টারকে নমুনা হিসাবে 20 কিমি দৈর্ঘ্যের একটি অর্থোগোনাল লাইন ব্যবহার করা উচিত নয়? কমপক্ষে এটিই আমি কারাকে "লাইনের প্রতিটি পাশের 10 কিলোমিটারের মধ্যে সর্বাধিক মান" এর প্রয়োজনীয়তাটি বিবেচনা করা হবে বলে বিবেচনা করব।
জেক

4
@ জেক আমি "ভুল" বলব না: আপনি কেবল একটি বিকল্প ব্যাখ্যা দিচ্ছেন। "প্রতিটি পক্ষের" একটি অস্পষ্ট শব্দ যা আরও ভাল যোগ্যতা ব্যবহার করতে পারে। আমি আপনার মত ব্যাখ্যার জন্য সমাধান প্রস্তাব করতে পারি; একটি পদ্ধতিতে জোনাল সর্বাধিক ব্যবহৃত হয়। যাইহোক, এটি আরও জটিল এবং কার্যকর করার ক্ষেত্রে অনেক ধীর। আমরা কেন প্রথম দেখি না যে এই সহজ সমাধান সম্পর্কে ওপি কী চিন্তা করে?
whuber

শব্দের খারাপ পছন্দ, আমার "নির্ভুল" ব্যবহার করা উচিত ছিল না - সে সম্পর্কে দুঃখিত
জ্যাক

1
আপনি কীভাবে প্রোফাইল সরঞ্জামটি ব্যবহার করতে জানেন তা আপনি প্রায় সম্পন্ন করেছেন। কিউজিআইএসের জিআরএসএস-এর ইন্টারফেস রয়েছে যাতে প্রতিবেশী কাজগুলি অন্তর্ভুক্ত থাকে। R.neighbors ব্যবহার করে পাড়ার সর্বাধিক অপারেশন প্রয়োগ করুন এবং এর ফলাফলটি প্রোফাইল করুন।
হোবার

1
@ জেমস আপনি কোনও সমান্তরাল শিফট করতে চান না, আপনি প্রতিটি লাইনটি লাইনকে লাইনকে লম্বা করতে চান। (প্রতিবেশী সর্বাধিক গণনার জন্য একটি উপযুক্ত দীর্ঘ এবং চর্মসার পাড়া ব্যবহার করে আমি এখানে বর্ণিত হিসাবে সমান্তরাল শিফট পদ্ধতির ঠিক একইভাবে প্রয়োগ করা যেতে পারে)) আমি নিশ্চিত যে সমান-ব্যবধানে লম্ব লম্বা রেখাংশগুলির সেট তৈরির জন্য আপনি এই সাইটে কোড খুঁজে পেতে পারেন pretty একটি পললাইন বরাবর; এটা কঠিন অংশ। বাকি সমস্ত কিছুই সেই বিভাগগুলি বরাবর ডেম মানগুলি আহরণের এবং তাদের সংক্ষিপ্তসার করার বিষয়।
whuber

6

আমার একই সমস্যা ছিল এবং জেমস এস এর সমাধান চেষ্টা করেছিলাম, তবে জিওএলএল ফিয়োনার সাথে কাজ করতে পারিনি।

তারপরে আমি কিজিআইএস ২.৪-এ সাগা অ্যালগরিদম "ক্রস প্রোফাইলগুলি" আবিষ্কার করেছিলাম এবং ঠিক আমার যে ফলাফলটি চেয়েছিল তা পেয়েছি এবং আমি মনে করি যে আপনিও খুব সন্ধান করছেন (নীচে দেখুন)।

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


হাই, আমি এই পোস্টটি জুড়ে এসেছি কয়েক বছর আগে। আমি থ্রেড স্টার্টার হিসাবে একই সমস্যার মুখোমুখি হয়েছি এবং (কিউ) জিআইএস-এ খুব নতুন হওয়ায় আমি উপরের ছবিটি যতটা পেয়েছি তাতে আমি একরকম খুশি। যদিও আমি ডেটা দিয়ে কাজ করব? ক্রস প্রোফাইল স্তর প্রতিটি নমুনা বিন্দুর জন্য উচ্চতা দেখায়, তবে আমি দয়া করে 1 তে সাহায্যের জন্য অনুরোধ করব) প্রতিটি ক্রস লাইনের সর্বাধিক উচ্চতা সন্ধান করতে 2) মূল পথের সাথে ছেদের স্থানাঙ্কগুলি সন্ধান করুন 3) 1 থেকে সর্বোচ্চ উচ্চতা সংযুক্ত করে 2 থেকে স্থানাঙ্ক সহ 2 দয়া করে, কেউ সাহায্য করতে পারেন? অগ্রিম ধন্যবাদ! মাল
সিপিটি রেনল্ডস

6

আগ্রহী যে কারও জন্য, এখানে জেমস কোডের একটি সংশোধিত সংস্করণ রয়েছে কেবলমাত্র নম্পি এবং অসজিও লাইব্রেরি ব্যবহার করে লম্ব লাইন তৈরি করা। জেমসকে ধন্যবাদ, তার উত্তর আমাকে আজ অনেক সাহায্য করেছে!

import osgeo
from osgeo import ogr
import numpy as np

# ##############################################################################
# User input

# Input shapefile. Must be a single, simple line, in projected co-ordinates
in_shp = r'S:\line_utm_new.shp'

# The shapefile to which the perpendicular lines will be written
out_shp = r'S:\line_utm_neu_perp.shp'

# Profile spacing. The distance at which to space the perpendicular profiles
# In the same units as the original shapefile (e.g. metres)
spc = 100

# Length of cross-sections to calculate either side of central line
# i.e. the total length will be twice the value entered here.
# In the same co-ordinates as the original shapefile
sect_len = 1000
# ##############################################################################

# Open the shapefile and get the data
driverShp = ogr.GetDriverByName('ESRI Shapefile')
sourceShp = driverShp.Open(in_shp, 0)
layerIn = sourceShp.GetLayer()
layerRef = layerIn.GetSpatialRef()

# Go to first (and only) feature
layerIn.ResetReading()
featureIn = layerIn.GetNextFeature()
geomIn = featureIn.GetGeometryRef()

# Define a shp for the output features. Add a new field called 'M100' where the z-value 
# of the line is stored to uniquely identify each profile
outShp = driverShp.CreateDataSource(out_shp)
layerOut = outShp.CreateLayer('line_utm_neu_perp', layerRef, osgeo.ogr.wkbLineString)
layerDefn = layerOut.GetLayerDefn() # gets parameters of the current shapefile
layerOut.CreateField(ogr.FieldDefn('M100', ogr.OFTReal))

# Calculate the number of profiles/perpendicular lines to generate
n_prof = int(geomIn.Length()/spc)

# Define rotation vectors
rot_anti = np.array([[0, -1], [1, 0]])
rot_clock = np.array([[0, 1], [-1, 0]])

# Start iterating along the line
for prof in range(1, n_prof):
    # Get the start, mid and end points for this segment
    seg_st = geomIn.GetPoint(prof-1) # (x, y, z)
    seg_mid = geomIn.GetPoint(prof)
    seg_end = geomIn.GetPoint(prof+1)

    # Get a displacement vector for this segment
    vec = np.array([[seg_end[0] - seg_st[0],], [seg_end[1] - seg_st[1],]])    

    # Rotate the vector 90 deg clockwise and 90 deg counter clockwise
    vec_anti = np.dot(rot_anti, vec)
    vec_clock = np.dot(rot_clock, vec)

    # Normalise the perpendicular vectors
    len_anti = ((vec_anti**2).sum())**0.5
    vec_anti = vec_anti/len_anti
    len_clock = ((vec_clock**2).sum())**0.5
    vec_clock = vec_clock/len_clock

    # Scale them up to the profile length
    vec_anti = vec_anti*sect_len
    vec_clock = vec_clock*sect_len

    # Calculate displacements from midpoint
    prof_st = (seg_mid[0] + float(vec_anti[0]), seg_mid[1] + float(vec_anti[1]))
    prof_end = (seg_mid[0] + float(vec_clock[0]), seg_mid[1] + float(vec_clock[1]))

    # Write to output
    geomLine = ogr.Geometry(ogr.wkbLineString)
    geomLine.AddPoint(prof_st[0],prof_st[1])
    geomLine.AddPoint(prof_end[0],prof_end[1])
    featureLine = ogr.Feature(layerDefn)
    featureLine.SetGeometry(geomLine)
    featureLine.SetFID(prof)
    featureLine.SetField('M100',round(seg_mid[2],1))
    layerOut.CreateFeature(featureLine)

# Tidy up
outShp.Destroy()
sourceShp.Destroy()

ধন্যবাদ কেট - আমি এটি চেষ্টা করেছি তবে দুর্ভাগ্যক্রমে এটি আমার জন্য পুরোপুরি কাজ করছে না। আমি স্ক্রিপ্টটিকে একটি একক পললাইন বৈশিষ্ট্য সহ একটি শেফফিল দিয়েছি তবে আমার আউটপুটটি কেবলমাত্র "এম 100" মানটির জন্য প্রচুর শূন্যের সাথে বিশিষ্ট টেবিল - মানচিত্রে কোনও বৈশিষ্ট্য প্রদর্শন করা হচ্ছে না। ধারনা?
davehughes87

কিছু মনে করবেন না - এখন বুঝতে পেরেছি যে আপনার স্ক্রিপ্টটি প্রতিটি "এসসিপি" মিটার নয়, পললাইনটির প্রতিটি বিভাগের সমাপ্তিতে লম্ব লাইন গণনা করছে। এর মানে হল যে এন_প্রোফটি লুপে পৌঁছানোর আগেই আমি পললাইনটি নিয়ে কাজ করতে চলেছিলাম এবং "ন্যান" মান তৈরি হচ্ছে।
davehughes87
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.