মাধ্যাকর্ষণ / হাফ মডেল সরঞ্জামগুলি


26

আমি একটি পয়েন্ট-ভিত্তিক স্তর ব্যবহার করে মাধ্যাকর্ষণ মডেল অনুকরণ করার উপায় খুঁজছি।

আমার সমস্ত পয়েন্টগুলিতে একটি জেড-মান নির্ধারিত এবং এই মানটি যত বেশি হবে তত বড় হ'ল তাদের "প্রভাবের ক্ষেত্র"। এই প্রভাবটি কেন্দ্রের দূরত্বের সাথে বিপরীতভাবে আনুপাতিক।

এটি একটি আদর্শ হাফ মডেল, প্রতিটি বিন্দু স্থানীয় সর্বাধিক এবং এর মধ্যে উপত্যকাগুলি তাদের মধ্যে প্রভাবের অঞ্চলটির সীমা নির্দেশ করে।

আমি আর্কগিস (আইডিডাব্লু, ব্যয় বরাদ্দ, বহুপদী ইন্টারপোলেশন) এবং কিউজিআইএস (হিটম্যাপ প্লাগইন) থেকে বেশ কয়েকটি অ্যালগরিদম চেষ্টা করেছি, তবে এমন কোনও কিছুই খুঁজে পেল না যা আমাকে সাহায্য করতে পারে। আমি এই থ্রেডটিও পেয়েছি , তবে এটি আমার পক্ষে খুব সহায়ক নয়।

বিকল্প হিসাবে, আমি সংশ্লিষ্ট পয়েন্টের জেড-ভ্যালু দ্বারা প্রতিটি ঘরের আকারকে প্রভাবিত করার উপায় থাকলে ভোরোনাই চিত্রটি উত্পন্ন করার উপায় দ্বারাও আমি সন্তুষ্ট হতে পারি।

উত্তর:


13

এখানে একটি অল্প কিউজিআইএস পাইথন ফাংশন যা এটি প্রয়োগ করে। এর জন্য রাস্টারল্যাং প্লাগইন প্রয়োজন (কিউজিআইএসে ম্যানুয়ালি ভান্ডার যুক্ত করতে হবে)।

এটি তিনটি বাধ্যতামূলক পরামিতি প্রত্যাশা করে: পয়েন্ট স্তর, একটি রাস্টার স্তর (আউটপুটটির আকার এবং রেজোলিউশন নির্ধারণ করতে), এবং আউটপুট স্তরের ফাইল নাম। দূরত্ব ক্ষয় ফাংশনের ব্যয় নির্ধারণের জন্য আপনি একটি alচ্ছিক যুক্তিও সরবরাহ করতে পারেন।

পয়েন্টগুলির জন্য ওজনগুলি পয়েন্ট স্তরটির প্রথম অ্যাট্রিবিউট কলামে থাকা দরকার।

ফলস্বরূপ রাস্টার স্বয়ংক্রিয়ভাবে ক্যানভাসে যুক্ত হয়।

স্ক্রিপ্টটি কীভাবে চালানো যায় তার একটি উদাহরণ এখানে। পয়েন্টগুলির ওজন 20 এবং 90 এর মধ্যে থাকে এবং গ্রিডটি 60 বাই 50 ম্যাপ ইউনিট আকারে থাকে।

points = qgis.utils.iface.mapCanvas().layer(0)
raster = qgis.utils.iface.mapCanvas().layer(1)
huff(points,raster,"output.tiff",2)

from rasterlang.layers import layerAsArray
from rasterlang.layers import writeGeoTiff
import numpy as np

def huff(points, raster, outputfile, decay=1):
    if points.type() != QgsMapLayer.VectorLayer:
        print "Error: First argument is not a vector layer (but it has to be)"
        return
    if raster.type() != QgsMapLayer.RasterLayer:
        print "Error: Second argument is not a raster layer (but it has to be)"
        return
    b = layerAsArray(raster)
    e = raster.extent()
    provider = points.dataProvider()
    extent = [e.xMinimum(),e.yMinimum(),e.xMaximum(),e.yMaximum()]
    xcols = np.size(layerAsArray(raster),1)
    ycols = np.size(layerAsArray(raster),0)
    xvec = np.linspace(extent[0], extent[2], xcols, endpoint=False)
    xvec = xvec + (xvec[1]-xvec[0])/2
    yvec = np.linspace(extent[3], extent[1], ycols, endpoint=False)
    yvec = yvec + (yvec[1]-yvec[0])/2
    coordArray = np.meshgrid(xvec,yvec)
    gravity = b
    point = QgsFeature()
    provider.select( provider.attributeIndexes() )
    while provider.nextFeature(point):
      coord = point.geometry().asPoint()
      weight = point.attributeMap()[0].toFloat()[0]
      curGravity = weight * ( (coordArray[0]-coord[0])**2 + (coordArray[1]-coord[1])**2)**(-decay/2)
      gravity = np.dstack((gravity, curGravity))
    gravitySum = np.sum(gravity,2)
    huff = np.max(gravity,2)/gravitySum
    np.shape(huff) 
    writeGeoTiff(huff,extent,outputfile)
    rlayer = QgsRasterLayer(outputfile)
    QgsMapLayerRegistry.instance().addMapLayer(rlayer)

3
(+1) পদ্ধতিরটি দেখতে দুর্দান্ত looks তবে আপনি কেন বর্গক্ষেত্রটি গ্রহণ করবেন এবং তারপরে এটি কম্পিউটিংয়ে পুনরায় বর্গাকার করবেন curGravity? এটি গণনার সময় নষ্ট। গণনার আরেকটি নষ্ট সেটটিতে সর্বাধিক সন্ধানের আগে সমস্ত "মাধ্যাকর্ষণ" গ্রিডকে সাধারণকরণের সাথে জড়িত: পরিবর্তে, তাদের সর্বাধিকটি সন্ধান করুন এবং সমষ্টি অনুসারে এটি স্বাভাবিক করুন।
whuber

বর্গাকার পুরো ভগ্নাংশ না?
lynxlynxlynx

1
জ্যাক, আপনার এখনও বর্গমূলের দরকার নেই: কেবল এটি পুরোপুরি ভুলে যান এবং অর্ধেক উদ্দেশ্যে লক্ষ্যমাত্রা ব্যবহার করুন। অন্য কথায়, যদি z গণনা (স্কয়ার্ট (জেড)) ^ পি এর পরিবর্তে স্থানাঙ্ক পার্থক্যের স্কোয়ারের যোগফল হয়, যা দুটি মাঝারি ব্যয়বহুল ক্রিয়াকলাপ, কেবল গণনা জেড ^ (পি / 2), যা (কারণ পি / 2 একটি প্রাক্পম্পিউটেড নম্বর ) কেবলমাত্র একটি রাস্টার অপারেশন - এবং এটি আরও পরিষ্কার কোডের দিকে নিয়ে যায়। এই ধারণাটি তখনই সামনে আসে যখন আপনি মহাকর্ষীয় মডেলগুলি যেমনটি মূলত তৈরি করেছিলেন: ভ্রমণের সময়গুলি হিসাবে প্রয়োগ করেন আর কোনও বর্গমূলের সূত্র আর নেই, সুতরাং আপনি ভ্রমণের সময়কে -p / 2 পাওয়ারে বাড়িয়ে তোলেন।
whuber

অনেক অনেক ধন্যবাদ, এটি আমার যা প্রয়োজন তা দেখে মনে হচ্ছে। কেবল একটি সমস্যা, আমি অজগরটি তেমন অভ্যস্ত নই এবং আমি কখনই রাস্টারং এক্সটেনশন ব্যবহার করি না। আমি এটি আমার কিউজিআইএস সংস্করণে ইনস্টল করেছি, তবে আমি একটি "সিনট্যাক্স ত্রুটি" এ আটকে আছি। আপনার ফাংশন ইতিমধ্যে রাস্টারং এক্সটেনশনে প্রয়োগ করা হয়েছে? যদি না হয় তবে কীভাবে করব? আপনার সহযোগিতার জন্য ধন্যবাদ! http://i.imgur.com/NhiAe9p.png
দামিয়েন

1
@ জ্যাক: ঠিক আছে, আমি মনে করি কনসোলটি কীভাবে কাজ করে তা বুঝতে শুরু করি। আপনি যেমন বলেছিলেন আমি তা করেছি এবং কোডটি সঠিকভাবে বোঝা যাচ্ছে বলে মনে হচ্ছে। এখন আমার আর একটি ত্রুটি রয়েছে যা পাইথন প্যাকেজ "শেপ_বেস.পি" সম্পর্কিত। আমার কিউজিআইএস ইনস্টলটিতে কি কিছু বৈশিষ্ট্যের অভাব রয়েছে? http://i.imgur.com/TT0i2Cl.png
দামিয়েন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.