নেটওয়ার্কে লাইনে (লাইনরেস্টিং) লাইনে থাকা কোন পয়েন্টগুলি (বাস স্টপস) সংযোগ করছে?


9

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

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

প্রধানত আমি পরে দুটি জিনিস করতে চাই:

  1. সংক্ষিপ্ততম পথ বিশ্লেষণ ব্যবহার করে বাসের থামের মধ্য দিয়ে দূরত্ব পাওয়া।
  2. ওএসএম নেটওয়ার্ক ব্যবহার করে বাস স্টপ থেকে হাঁটার দূরত্বে আইসোক্রোন তৈরি করা।

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

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

উত্তর:


5

সমাধানের প্রথম অংশটি হ'ল:

SELECT a.id, ST_Closestpoint(ST_Collect(b.geom_way), a.geom) AS geom 
FROM point_table a, line_table b
GROUP BY a.id, a.geom;

আপনি ছবিতে দেখতে পাওয়ায় এটি রাস্তার নেটওয়ার্কের লাইনে বাসস্টপগুলি স্ন্যাপ করে এবং বেশ সহজ কাজ করে।

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

পরবর্তী আমি পয়েন্টগুলির অবস্থানগুলিতে লাইনগুলি বিভক্ত করার চেষ্টা করব। লাইনগুলি বিভক্ত করার পরে আমি আবার pgr_createTopology ব্যবহার করতে চাই। এর পরে বাসস্টপগুলির নিকটতম নোডগুলি সন্ধানের জন্য একটি কোয়েরি তৈরি করা উচিত, যা 'স্প্লিটপয়েন্টস' এ আমার নতুন উত্পন্ন নোডের চেয়ে বেশি হবে।

পোস্টগ্রিসে পয়েন্ট বৈশিষ্ট্যগুলির সাথে কীভাবে লাইনস্ট্রিং বিভক্ত করা যায় সে সম্পর্কে যদি আমার কাছে কোনও ইঙ্গিত থাকে তবে আমি কৃতজ্ঞ হব, যেহেতু আমি অনুরূপ প্রশ্নের দিকে তাকানোর পরে এই মুহুর্তে এর পক্ষে সহজ সমাধান বলে মনে হয় না।


এসT_স্প্লিট (কিছুছোকা, ফলক)
সিম্পলসিও

1
মন্তব্য যুক্ত করা কারণ আমি এটি একেবারেই পরীক্ষা করিনি, সিনট্যাক সম্ভবত ভুল ... ... থেকে বেছে নিন *, st_split (a.lg, a.pg) থেকে (সিলেক্ট *, লাইনস, এলজি হিসাবে পয়েন্টস, পয়েন্ট.জম পয়েন্ট থেকে পিজি হিসাবে ST_intersect (p.geom, l.geom) তে লাইনগুলিকে যোগ করুন তবে সেই বিভক্ত রিটার্ন সংগ্রহে যাতে আপনার এখনও সমস্ত লাইন বের করে নেওয়া দরকার ...
সিমপ্লেসিও

2

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

এটিতে সমস্যা রয়েছে যে এটি প্রতি পয়েন্টে প্রতিটি লাইনে দুটি বিভক্ত সৃষ্টি করে (কারণ বাফারিংয়ের কারণে)। আমার ব্যবহারের জন্য এটি ঠিক ছিল, পরে আমি মূল পয়েন্টগুলির নিকটবর্তী বিভাজক পয়েন্টগুলির মধ্যে ঘুরলাম, যা লাইনটির বাইরে ছিল এবং এটি লাইন-বাফার ছেদচিহ্নের দুটি বিভাজন বিন্দুর মধ্যে দুটিও হতে পারে।

আমি ওএসএম ডেটা ডাউনলোড করে পোস্টগ্রিসে চাপিয়ে দিয়ে শুরু করেছি:

CITY="MY_CITY"
BBOX="-46.6003,-23.7362,-46.4806,-23.5965"
wget --progress=dot:mega -O "$CITY.osm" "http://www.overpass-api.de/api/xapi?*[bbox=${BBOX}][@meta]"

# create database
createdb my_database
# add extensions
psql -d my_database -c "CREATE EXTENSION postgis;"
psql -d my_database -c "CREATE EXTENSION pgrouting;"

# import osm data to postgres database
osm2pgrouting \
    -f MY_CITY.osm \
    -d my_database \
    -U user

# load points into db
shp2pgsql -I -s 4326 points_to_split_ways.shp public.points_to_split_ways | psql -d my_database

একটি বাফার ব্যবহার করে উপায়গুলি বিভক্ত করা:

WITH pts_ways AS (
  -- get nearest way for each point we want to split the ways by
  SELECT s.gid AS pt_id, ws.gid AS way_gid, s.geom AS pt_geom, ws.the_geom AS way_geom FROM points_to_split_ways s
  CROSS JOIN LATERAL
  (
    SELECT w.gid, w.the_geom
    FROM ways w
    ORDER BY s.geom <-> w.the_geom LIMIT 1
  ) AS ws
), pts_on_ways AS (
  -- "move" these points to be on top of the ways
  SELECT pt_id, way_gid, ST_ClosestPoint(way_geom, pt_geom) as geom
  FROM pts_ways
), ways_without_pts AS (
  -- get the ways that don't have any points on them
  SELECT the_geom as the_geom, gid as way_gid FROM ways
  WHERE gid NOT IN (SELECT way_gid FROM pts_ways)
)
SELECT
  way_gid as old_id,
  -- we need to build a new unique ID, because split ways will share the old ID
  row_number() over(order by way_gid) as gid,
  -- this is the split way geometry
  the_geom
FROM (
  SELECT 
    way_gid,
    -- split the ways and dump into indiviudal segments
    (ST_Dump(ST_Split(line_geom, pt_geom))).geom AS the_geom
  FROM (
    (SELECT the_geom as line_geom, gid FROM ways) AS lines
    LEFT JOIN
    -- HACK: use a buffer to fix imprecisions / rounding errors
    -- this will generate one extra splitting per point (each buffer will intersect each way twice)
    -- but it's ok for our purposes
    -- also, collect them grouped by the way to handle cases where there are multiple points on the same way
    (SELECT ST_Collect(ST_Buffer(geom, 0.000001)) as pt_geom, way_gid FROM pts_on_ways GROUP BY way_gid) AS pts
    ON lines.gid = pts.way_gid
  ) AS tmp1
  -- union the ways without points, otherwise you'd get only the ones that were split
  UNION ALL
  SELECT way_gid, the_geom FROM ways_without_pts
) AS tmp2;

পিগ্রাউটিংয়ের সাথে রাউটিংয়ের জন্য প্রয়োজনীয় টপোলজি তৈরি করুন:

SELECT UpdateGeometrySRID('ways_split','the_geom', 4326);
SELECT find_srid('public','ways_split','the_geom');
ALTER TABLE ways_split ADD COLUMN "source" integer;
ALTER TABLE ways_split ADD COLUMN "target" integer;
ALTER TABLE ways_split ADD PRIMARY KEY (gid);
ALTER TABLE ways_split ADD CONSTRAINT ways_source_fkey FOREIGN KEY (source) REFERENCES ways_split_vertices_pgr (id) MATCH FULL;
ALTER TABLE ways_split ADD CONSTRAINT ways_target_fkey FOREIGN KEY (target) REFERENCES ways_split_vertices_pgr (id) MATCH FULL;
SELECT pgr_createTopology('ways_split', 0.00001, 'the_geom', 'gid', clean := TRUE);
SELECT pgr_analyzeGraph('ways_split', 0.000001, the_geom := 'the_geom', id := 'gid');

আমার প্রথম চিন্তাটি পাশাপাশি বাফার হয়েছিল। তবে আপনি যদি 'নিকটতম থেকে দূরত্ব' পেতে পারেন, সেই পরিমাণটি বাফার করতে পারেন তবে সেই ছেদটি স্থানে একটি বিন্দু তৈরি করতে পারেন ... তবে আপনি আপনার মূল পয়েন্ট এবং এটিতে 'নিকটতম' পয়েন্ট সমন্বিত প্রান্তগুলি সহ একটি লাইন তৈরি করতে পারেন।
Mox

1

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

আমি এখন v.netবিকল্পটি ব্যবহার করে গ্রাস জিআইএস ফাংশনটি ব্যবহার করেছি connect। শুধু চয়ন করুন input vector line layerএবং points layer। লাইনগুলির নিকটতম বিন্দুতে পয়েন্টগুলি স্ন্যাপ করার জন্য বা লাইনগুলির নিকটতম পয়েন্ট এবং নতুন পয়েন্টের মধ্যে নতুন সংযোগ তৈরি করার বিকল্প রয়েছে।

এখানে চিত্রের আগে এবং পরে রয়েছে। ডানদিকে, পয়েন্ট লেয়ারের প্রতিটি পয়েন্টের জন্য রোডনেটওয়ার্কের একটি নোড যুক্ত করা হয়েছিল: এখানে চিত্র বর্ণনা লিখুন

..._vertices_pgrপোস্টজিআইএস-এর পরে, রোডনেট ওয়ার্কের বাইরে আপনার টেবিল তৈরি করার পরে আপনার পয়েন্টগুলি কেবল নিকটবর্তী উল্লম্বে অর্পণ করুন যাতে আপনি সেগুলি আপনার রাটিংয়ের অনুরোধগুলিতে ব্যবহার করতে পারেন। এই কাজের জন্য আপনি ST_ClosestPoint@ উত্তরাঞ্চলীয় জবাব দিয়েছিলেন তার উত্তরে ফাংশনটি ব্যবহার করতে পারেন ।

এই পদ্ধতির অসুবিধাগুলি হ'ল:

  • লাইনের সাথে পয়েন্টগুলির সংযোগ গ্রাস জিআইএসে করতে হবে
  • গণনা করা রুটগুলিতে অনেকগুলি উপাদান থাকতে পারে (নতুন যুক্ত হওয়া পয়েন্টের পরিমাণের উপর নির্ভর করে)
  • নতুন পয়েন্টগুলির গতিশীল সংযোজন সম্ভব নয়

রোডনেট ওয়ার্কে যুক্ত করার জন্য আপনার কাছে সংজ্ঞায়িত সংখ্যক পয়েন্ট থাকলে (বাস স্টপসগুলির সাথে প্রশ্নের উদাহরণ হিসাবে) এই পদ্ধতিটি ঠিকঠাক কাজ করে।

যদি কেউ পোস্টজিআইএস ব্যবহার করে কোনও কাজের উদাহরণ সরবরাহ করতে পারে তবে আমি সে সম্পর্কে পড়তে চাই!


0

অনুরূপ সমস্যা নিয়ে আলোচনা করা একটি পোস্ট রয়েছে, আপনি নিম্নলিখিত পোস্টে পোস্টটি দেখতে পারেন: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html


এটি একটি সম্ভাব্য সমাধানের কেবল একটি অংশ, কারণ পয়েন্টগুলি লাইনগুলিতে ছড়িয়ে দেওয়ার পরে, পয়েন্টগুলি সরাসরি লাইনগুলিতে থাকে তবে সেগুলি এখনও নেটওয়ার্কের অংশ নয়।
সেটারওয়ার্কস 6'14

আপনি যদি এমন কোনও উত্তর পাওয়ার প্রত্যাশা করছেন যা আপনাকে আপনার সমস্ত প্রয়োজনীয়তা সরবরাহ করে, আপনি হতাশ হতে পারেন। এটি আপনাকে অর্ধেক পথ পেতে পারে, তারপরে আপনি যে অংশটি নিখোঁজ রয়েছেন তার উপর ফোকাস করতে পারেন।
রায়ান গারনেট

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

আমি সাহায্য করতে পেরে আনন্দিত. এমন সরঞ্জাম রয়েছে যা একটি বিন্দুর সাথে একটি লাইন বিভক্ত করবে, তবে আমি পোস্টজিআইএস-এ একটি বিকল্প খুঁজব। শুভকামনা
রায়ান গারনেট

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