অ্যাক্সেসযোগ্য অঞ্চলে বহুভুজ তৈরি করা


10

আমি বর্তমানে আইসোক্রোনস এবং অন্তর্নিহিত অ্যালগরিদমের ক্ষেত্রে কাজ করছি। এখন যে সমস্যাগুলি সৃষ্টি করে তা হ'ল আইসোক্রোন নিজেই গণনা নয়, তবে ফলাফলগুলির দৃশ্যায়ন।
আমার আইসোক্রোন অ্যালগরিদমের ফলাফল পয়েন্ট এবং প্রান্তগুলি। আসলে আমার কাছে একটি কার্যক্ষম সমাধান রয়েছে তবে 3873 প্রান্তের জন্য এবং 1529 নোডের জন্য জিনিসগুলি চিরতরে নেবে বলে মনে হচ্ছে (আমার লেনোভো T440s ল্যাপটপে প্রায় ২.০ সেকেন্ডের মধ্যে একটি 2015 কোর আই 7 সিপিইউ এবং একটি দুর্দান্ত দ্রুত এসএসডি রয়েছে)। সেকেন্ডের পরিবর্তে আমি আরও কিছু এমসিকে :-) এর মতো চাই।

সম্ভবত কেউ আমাকে বহুভুজ তৈরির জন্য প্রয়োজনীয় গণনার সময় হ্রাস করতে সহায়তা করতে পারে যা পৌঁছনীয় অঞ্চলগুলিকে কল্পনা করতে পারে।

তবে অপেক্ষা করুন ... প্রথম জিনিস!
এখানে প্রান্তগুলির একটি দৃশ্যায়ন যা আমি আমার আইসোক্রোন গণনার ফলাফল: আইসোক্রোন গণনার ফলাফল (লাইনস্ট্রিংগুলির বিদ্যমান কঙ্কাল) এই প্রান্তগুলি একটি পোস্টজিআইএস ডাটাবেস সারণীতে সংরক্ষণ করা হয় এবং সাধারণ লিনস্ট্রিংগুলি।

আমি ব্যবহারকারীকে যা দেখতে চাই তা দেখতে এটির মতো: এখানে চিত্র বর্ণনা লিখুন ছবির খুব দক্ষিণ এবং খুব পূর্বভাগে সংযোগ বিচ্ছিন্ন অঞ্চলগুলি নোট করুন। এগুলি পৃথক অঞ্চল হিসাবে আঁকা উচিত (সুতরাং এখানে কোনও মার্জ করার অনুমতি নেই :-))

বর্তমানে আমি এই ক্যোয়ারীটি ব্যবহার করছি:

SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
    SELECT ST_MakePolygon(ST_ExteriorRing(ST_GeometryN(segments, generate_series(1, ST_NumGeometries(segments))))) AS polygons FROM (
        SELECT ST_Union(ST_Buffer("GEOMETRY", 20, 'quad_segs=2')) AS segments FROM my_edges AS a
    ) AS b
) AS c

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

SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
    SELECT ST_Buffer(ST_Collect(ST_LineMerge("GEOMETRY")), 20, 'quad_segs=2') AS polygons FROM my_edges AS a
) AS b

এটি আমার সিস্টেমে প্রায় 3.8 সেকেন্ড সময় নেয় (প্রায় প্রায় দ্বিগুণ)। এই ছোট্ট মানদণ্ডের বাইরে আমার প্রথম উপসংহারটি হ'ল মাল্টিলাইনস্ট্রিংয়ের ক্ষেত্রে এসT_Buffer অপ্রত্যাশিতভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়)

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

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


আপনি কি কেবল এস এসএক্সটারিয়েরিং ব্যবহার করতে পারবেন না (এসT_ ডাম্প (এসT_ ইউনিয়ন (এসT_ বুফার (জিম, ....))) জিম জিম কোনওভাবেই একটি বহুভুজ হবে এবং এস এস ইউনিয়ন সমস্ত ছেদকৃত জ্যামিতিকে সংযুক্ত করবে, তাই মেকপলিগন বা জ্যামিত্রিনের কোনও প্রয়োজন নেই। আপনার লাইনস্ট্রিংসের জন্য পরীক্ষা করার প্রয়োজন হতে পারে যা কখনও কখনও বাফার পরে এসT_ ইউনিয়ন থেকে আসে তবে এস এস জিমিটারি টাইপ (জিওম) এর মাধ্যমে এটি সহজ Java জাভা বা জঙ্গল ব্যবহারের ক্ষেত্রে আপনি যতটা সম্ভব উদ্বিগ্ন, সম্ভবত এটি দ্রুত হওয়ার সম্ভাবনা নেই given পোস্টগিসের (জিইওএস) ফাংশনগুলির বড় অংশটি সি / সি ++ জেটিএসের বন্দর প্রথম স্থানে রয়েছে
জন পাওয়েল

আপনি ঠিক বলেছেন, এটি কাজ করে তবে বাস্তবে এটি দ্রুত নয় (জ্যামিত্রিএন ব্যবহারের সময় 2 সেকেন্ড লাগে) ~ 3.1 সেকস লাগে। এখানে আমি যা ব্যবহার করেছি তা নির্বাচন করুন: এস ইলেক্ট এস এস এএসজিওজসন (এস এস ট্রান্সফর্ম (এস এস এক্সটারিরিং (এস এসডাম্প (এস এস ইউনিয়ন (এস এস বুফার ("জিওওমেট্রি", ২০%)))। জিওম), ৪26২26)) মাই_জেডস থেকে;
নিকোলাস ক্রিসমার

@ জন-বারিয়া: ওহ .. আমি যখন আপনার পদ্ধতির চেষ্টা করার সময় এস এস বাফারটিতে কোয়াড_সেজ = 2 অংশটি ভুল করে দেখি ... সেই পরিবর্তনের সাথে ক্যোয়ারগুলি সমান হয় (উভয় প্রায় 2 সেকসে)। তবে এটি এখনও খুব ধীর (আমার চোখে), এটি চেষ্টা করার অন্য কোনও উপায় আছে কি?
নিকোলাস ক্রিশমার

আকর্ষণীয় সমস্যা .... আপনি কি কিছু পরীক্ষার ডেটা ভাগ করতে চান?
dbaston

এটি যদি সহায়তা করে তবে আমি কিছু ডেটা ভাগ করে খুশি। আমি এখানে যা করি তার সবগুলিই ওপেন সোর্স, সুতরাং এটি কোনও বড় সমস্যা হওয়া উচিত নয়। প্রথম বিষয় লক্ষ্য করুন: পরীক্ষার জন্য একটি ওয়েব অ্যাপ্লিকেশনটি dbis-isochrone.uibk.ac.at:8080/testing এ অবস্থিত । আমি যে বিষয়গুলিতে কাজ করি সে সম্পর্কে আরও তথ্য dbis-isochrone.uibk.ac.at থেকে পাওয়া যাবে । ওয়েবসাইটের "লিঙ্কগুলি" বিভাগে আরও কিছু রেফারেন্স রয়েছে (কিছু পরীক্ষার ডেটা সহ)
নিকোলাস ক্রিসমার

উত্তর:


5

জিওজেএসএন সিরিয়ালাইজেশনটি আলাদা করে রেখে, নিম্নলিখিতটি আমার ল্যাপটপে প্রায় 6.3 সেকেন্ড সময় নেয়:

SELECT
  ST_MakePolygon(
    ST_ExteriorRing(
      (ST_Dump(
        ST_Union(
          ST_Buffer(geom, 20, 2)))).geom))
FROM bz_edges

ওপেনজ্যাম্পে ডেটা দেখে, আউটপুটটিতে কাঙ্ক্ষিত স্তরের বিবরণের তুলনায় রাস্তার অংশগুলিতে আমি বেশ কিছুটা বিশদ লক্ষ্য করেছি। দেখে মনে হচ্ছে যে এই লাইনের একটি অন ফ্লাইট সরলকরণ পোস্টজিআইএস-এ একটি বড় স্পিডআপ তৈরি করতে পারে:

SELECT
  ST_MakePolygon(
    ST_ExteriorRing(
      (ST_Dump(
        ST_Union(
          ST_Buffer(ST_Simplify(geom, 10), 20, 2)))).geom))
FROM bz_edges

যা জিনিসগুলিকে ২.৩ সেকেন্ডে নামিয়ে আনে। আমি ভেবেছিলাম যে সাধারণ জ্যামিতিটি উড়ে গিয়ে হিসাব না করে আলাদা কলামে সঞ্চয় করে আমি আরও ভাল করতে পারব তবে বাস্তবে এটি কোনও বাড়তি সুবিধা দেয় নি।

আপনি কতটা কোড লিখতে ইচ্ছুক তার নিজের উপর নির্ভর করে আপনি প্রায় অবশ্যই জাভাতে আরও ভাল করতে পারবেন, অন্য কোনও কিছু না কারণ আপনি একাধিক কোরের সুবিধা নিতে পারেন। (এটির মূল্য কীসের জন্য, জেটিএস উপরের অপারেশনটি ২.৮ সেকেন্ডে সম্পাদন করে) একটি পদ্ধতির CascadedPolygonUnionইউনিয়ন পরিচালনা কিছু সমান্তরাল ঘটতে প্রসারিত হতে পারে । (আপডেট - এখানে একটি সমান্তরাল ক্যাসকেডপলিজোন ইউনিয়ন )

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

  1. গ্রাফের সংযুক্ত উপাদানগুলি চিহ্নিত করুন
  2. প্রতিটি সংযুক্ত উপাদানগুলির জন্য, ন্যূনতম এক্স স্থানাঙ্কের নোডটি সন্ধান করুন (উপাদানটির বাইরের দিকে গ্যারান্টিযুক্ত)
  3. কম্পোনেন্টের প্রান্তগুলি হাঁটাচলা করুন, সর্বদা বাম দিকে (বা ডানদিকে) যখন সম্ভব সম্ভব হয়। এটি আপনাকে প্রতিটি উপাদানগুলির বহিরাগত রিংটি দেবে।
  4. বহির্মুখী রিং এবং যথাযথভাবে বাফারকে বহুভুজ করুন।

ধন্যবাদ ... সরলীকরণ একটি দুর্দান্ত এবং এমনকি "সাধারণ" উন্নতি। এটি আমার ল্যাপটপে প্রয়োজনীয় সময়টি 1.5 সেকেন্ডে নেমেছিল। আমি যেখানে থাকতে চাই তা নয়, তবে এটি আরও ভাল।
নিকোলাস ক্রিসমার

আপনার প্রস্তাবিত সমাধান সম্পর্কে (পয়েন্ট 1-4)। খুব সহজ লাগছে এবং এটি চেষ্টা করার মতো is আমি অনুরূপ কিছু ভেবেছিলাম, তবে আমি পয়েন্ট 1 এ আটকে আছি (এত তাড়াতাড়ি :-))। কেউ কীভাবে সংযুক্ত উপাদানগুলি সনাক্ত করতে পারে (কেবলমাত্র আমি যা ভাবতে পারি তা একটি পুনরাবৃত্ত ক্যোয়ারী যা খুব ধীর হতে পারে)।
নিকোলাস ক্রিসমার

@ নিকোলাসক্রিসমার এই জাতীয় কাজের জন্য আমি জেগ্রাফটি এবং তাঁত উভয়ই ব্যবহার করি । আপনি যদি তার পরিবর্তে নিজের গ্রাফ পদ্ধতিগুলি লিখেন (সেরা পারফরম্যান্সের জন্য খারাপ ধারণা নয়) তবে গভীরতার প্রথম অনুসন্ধান আপনাকে উপাদানগুলি সন্ধান করবে। (আপনি এগুলি আসন্ন পোস্টজিআইএস ২.২ এ খুঁজে পেতে পারেন ST_ClusterIntersectingতবে আমি মনে করি যে আপনি যে কোনও উপায়ে ডাটাবেসের বাইরে গ্রাফ প্রসেসিং ঘটতে চান তাই সম্ভবত এটি কার্যকর নয়)।
ডাবস্টন

এই কিছু দুর্দান্ত ইঙ্গিত। আমি জেগ্রাফটির দিকে চেয়েছিলাম এবং এটি অবশ্যই আমার সমস্যা সমাধানে সহায়তা করতে পারে। যাইহোক, আমি পোস্টগিস ২.২ এবং ST_ClusterIntersecting ফাংশন -> এও দেখেছি উপরের ক্ষেত্রে বিভিন্ন ক্লাস্টার সনাক্ত করতে এটি 200-250msec লাগে। এটা আমার কাছে ঠিক আছে (জেগ্রাফ্ট অবশ্যই আরও ভাল করতে পারে)। এখন আমাকে বহির্মুখী রিং তৈরি করার সাথে মোকাবিলা করতে হবে (এসT_ এক্সটারিরিং রিং ব্যর্থ হয়েছে, যেহেতু এসT_ মেকপলিগন বলেছেন যে আমার লিঙ্কগুলি কোনও শেল নয়)
নিকোলাস ক্রিশমার

আমি দুটি জটিলতা দেখতে পাচ্ছি: (ক) আপনার কেবল বাহ্যিক রিংই নয়, সেই আংটিটি থেকে বাহ্যিক প্রসারিত কোনও বিভাগও প্রয়োজন এবং (খ) দেখে মনে হচ্ছে আপনার রেখাগুলি কিছু ছেদে আসলে ছেদ করে না। আপনি যদি কোনও গ্রাফ ওয়াকের ফলাফল থেকে জ্যামিতি নির্মাণের চেষ্টা করতে যাচ্ছেন তবে আপনাকে (খ) ঠিক করতে হবে।
ডাবিস্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.