আরটিরির সাথে স্থানিক সূচকের ব্যবহার বোঝা?


13

আরটিরির সাথে স্থানিক সূচীর ব্যবহার বুঝতে আমার সমস্যা হচ্ছে।

উদাহরণ: আমার 300 টি বাফার পয়েন্ট রয়েছে এবং একটি বহুভুজ শেফফাইলের সাথে প্রতিটি বাফারের ছেদ ক্ষেত্রটি আমার জানতে হবে। বহুভুজ আকৃতির ফাইলটিতে> 20,000 বহুভুজ রয়েছে। প্রক্রিয়াটি গতিতে স্থানিক সূচকগুলি ব্যবহার করার পরামর্শ দেওয়া হয়েছিল।

সুতরাং ... আমি যদি আমার বহুভুজ শেফফিলের জন্য একটি স্থানিক সূচক তৈরি করি তবে এটি কোনও উপায়ে ফাইলের সাথে "সংযুক্ত" হবে, বা সূচিটি কি একা দাঁড়িয়ে থাকবে? এটি হ'ল, এটি তৈরি করার পরে আমি কী কেবল বহু ছেঁড়া ফাইলটিতে আমার ছেদ ফাংশনটি চালাতে পারি এবং দ্রুত ফলাফল পেতে পারি? চৌরাস্তাটি "দেখবে" যে স্থানিক সূচকগুলি রয়েছে এবং কী করতে হবে তা জানেন? বা, আমাকে সূচীতে এটি চালানো দরকার, তারপরে এফআইডি বা এই জাতীয় কিছুগুলির মাধ্যমে ফলাফলগুলি আমার মূল বহুভুজ ফাইলের সাথে আবার যুক্ত করতে পারি?

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

আমি ভাবছি এটি অবশ্যই এরকম কিছু হবে:

  1. আমার বহুভুজ শেফফাইল থেকে প্রতিটি বহুভুজ বৈশিষ্ট্যের জন্য বাক্সগুলি টানুন এবং একটি স্থানিক সূচীতে এগুলি রাখুন, তাদের একটি আইডি প্রদান করুন যা শেফফাইলে তাদের আইডি হিসাবে একই।
  2. ছেদকৃত আইডিগুলি পেতে সূচকটি অনুসন্ধান করুন।
  3. তারপরে আমার ছেদটি কেবল আমার মূল শেফফিলের বৈশিষ্ট্যগুলিতে পুনরায় চালনা করুন যা আমার সূচককে জিজ্ঞাসা করে চিহ্নিত করা হয়েছিল (আমি নিশ্চিত না যে আমি এই শেষ অংশটি কীভাবে করব)।

আমার কি সঠিক ধারণা আছে? আমি কি কিছু মিস করছি?


এই মুহুর্তে আমি এই কোডটি এক পয়েন্টের শেফফিলের সাথে কাজ করার চেষ্টা করছি যা কেবলমাত্র একটি পয়েন্ট বৈশিষ্ট্য এবং> 20,000 বহুভুজন বৈশিষ্ট্যযুক্ত একটি বহুভুজ আকৃতি ফাইল রয়েছে।

আমি ফিওনা ব্যবহার করে শেফফিলগুলি আমদানি করছি, আরটি্রি ব্যবহার করে স্থানিক সূচক যুক্ত করছি এবং শ্যাপলি ব্যবহার করে ছেদটি করার চেষ্টা করছি।

আমার পরীক্ষার কোডটি দেখতে এমন দেখাচ্ছে:

#point shapefile representing location of desired focal statistic
traps = fiona.open('single_pt_speed_test.shp', 'r') 

#polygon shapefile representing land cover of interest 
gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')]) 

#search area
areaKM2 = 20

#create empty spatial index
idx = index.Index()

#set initial search radius for buffer
areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))

#create spatial index from gl
for i, shape in enumerate(gl):
    idx.insert(i, shape.bounds)

#query index for ids that intersect with buffer (will eventually have multiple points)
for point in traps:
        pt_buffer = shape(point['geometry']).buffer(r)
        intersect_ids = pt_buffer.intersection(idx)

তবে আমি টাইপ এরির পেতে থাকি: 'বহুভুজ' অবজেক্ট কল করা যায় না


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

4
.shx কোনও স্থানিক সূচক নয়। এটি কেবল পরিবর্তনশীল প্রস্থের রেকর্ড গতিশীল অ্যাক্সেস অফসেট ফাইল। .sbn / .sbx হল আর্কজিআইএস শেফফাইল স্থানিক সূচক জুটি, যদিও তাদের স্পেসিফিকেশন প্রকাশ করা হয়নি।
ভিনস

1
এছাড়াও .qixম্যাপসার্ভার / জিডিএল / ওজিআর / স্পাটিএলাইট চতুর্ভুজ সূচক
মাইক টি

আপনার ধারণা স্পেসিটালাইটের জন্য যথাযথভাবে সঠিক, যার আসল স্থানিক সূচক নেই। বেশিরভাগ অন্যান্য ফর্ম্যাটগুলি, যদি তারা মোটে স্থানিক সূচকগুলিকে সমর্থন করে তবে স্বচ্ছভাবে এটি করুন।
ব্যবহারকারী 30184

2
আপনি TypeError: 'Polygon' object is not callableআপনার আপডেটের উদাহরণটি পেয়ে shapefor i, shape in enumerate(gl):
যাচ্ছেন

উত্তর:


12

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


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

আপনার পদক্ষেপ 2 এবং 3 এর মতো আর-ট্রি ইনডেক্স ব্যবহার করার জন্য একটি ম্যানুয়াল পদ্ধতি শেখার পক্ষে মূল্যবান হতে পারে ওজিসি জিওপ্যাকেজ সম্পর্কে এই ব্লগটি আর-ট্রিটিকে পৃথক ডাটাবেস সারণী হিসাবেও সমর্থন করে যা কিছু এসকিউএল এবং স্ক্রিনটি ওপেনজ্যাম্প.ব্লগস্পট.ফি / 2014/02 /…
ব্যবহারকারী 30184

9

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

import fiona
from shapely.geometry import mapping
import rtree
import math

areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))

# open both layers
with fiona.open('single_pt_speed_test.shp', 'r') as layer_pnt:
    with fiona.open('class3_aa.shp', 'r') as layer_land:

        # create an empty spatial index object
        index = rtree.index.Index()

        # populate the spatial index
        for fid, feature in layer_land.items():
            geometry = shape(feature['geometry'])
            idx.insert(fid, geometry.bounds)

        for feature in layer_pnt:
            # buffer the point
            geometry = shape(feature['geometry'])
            geometry_buffered = geometry.buffer(r)

            # get list of fids where bounding boxes intersect
            fids = [int(i) for i in index.intersection(geometry_buffered.bounds)]

            # access the features that those fids reference
            for fid in fids:
                feature_land = layer_land[fid]
                geometry_land = shape(feature_land['geometry'])

                # check the geometries intersect, not just their bboxs
                if geometry.intersects(geometry_land):
                    print('Found an intersection!')  # do something useful here

আপনি যদি আপনার স্থল শ্রেণির সর্বনিম্ন দূরত্বে থাকা পয়েন্টগুলি সন্ধান করতে আগ্রহী হন তবে আপনি তার distanceপরিবর্তে পদ্ধতিটি ব্যবহার করতে পারেন (আগের থেকে উপযুক্ত বিভাগটি সরিয়ে নিতে পারেন )।

for feature in layer_pnt:
    geometry = shape(feature['geometry'])

    # expand bounds by r in all directions
    bounds = [a+b*r for a,b in zip(geometry.bounds, [-1, -1, 1, 1])]

    # get list of fids where bounding boxes intersect
    fids = [int(i) for i in index.intersection(geometry_buffered.bounds)]

    for fid in fids:
        feature_land = layer_land[fid]
        geometry_land = shape(feature_land['geometry'])

        # check the geometries are within r metres
        if geometry.distance(geometry_land) <= r:
            print('Found a match!')

যদি আপনার স্থানিক সূচকটি তৈরি করতে যদি এটি দীর্ঘ সময় নিয়ে থাকে এবং আপনি এটি কয়েকবারের বেশি করতে চলেছেন তবে আপনাকে কোনও ফাইলের সূচকে সিরিয়ালে দেখানো উচিত। ডকুমেন্টেশন এটি কীভাবে করবেন তা বর্ণনা করে: http://toblerity.org/rtree/tutorial.html#serializing- আপনার- index- to- a-file

আপনি জেনারেটর ব্যবহার করে rtree এ সীমাবদ্ধ বাক্সগুলি বাল্ক-লোডিংয়ের দিকে নজর দিতে পারেন:

def gen(collection):
    for fid, feature in collection.items():
        geometry = shape(feature['geometry'])
        yield((fid, geometry.bounds, None))
index = rtree.index.Index(gen(layer_land))

2

হ্যাঁ এই ধারণা। পাইথনে আর-ট্রি স্পেসিয়াল ইনডেক্স ব্যবহার করে সুদৃশ্য, ফিয়োনা এবং জিওপ্যান্ডাস ব্যবহার করার বিষয়ে এই টিউটোরিয়ালটির একটি অংশ এখানে দেওয়া হয়েছে:

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

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