পয়েন্ট দিয়ে কাটা লাইনস্ট্রিংস?


10

আমি পয়েন্ট দ্বারা লাইনস্ট্রিংস কাটানোর সেরা উপায়টি যাচাই করছিলাম।

দৃশ্যটি হ'ল: প্রচুর রাস্তা, ছেদ বিন্দু দ্বারা কাটা অংশগুলি প্রয়োজন, এ জাতীয়:

উদাহরণ

আমি পেয়েছি

  • লাইনস্ট্রিংস (পয়েন্ট অনুসারে সম্পূর্ণ নিযুক্ত) টেবিল

  • st_intersication পয়েন্ট টেবিল

ছেদ পয়েন্ট টেবিল দ্বারা কাটা স্বাধীন লাইনস্ট্রিং অংশগুলি আমার নেওয়া দরকার।

আমি পোস্টজিআইএস ফাংশনগুলি ব্যবহার করছি, এবং বেশ কয়েকটি পদ্ধতির সন্ধান পেয়েছি, তবে তাদের প্রত্যেকটিই আমাকে একধরণের সমস্যা দিচ্ছে।

আমি ইতিমধ্যে যা পরীক্ষা করেছি তা এখানে:

1

লাইন টেবিল: 1 সারি, 1200 লাইনের st_memunion পয়েন্ট টেবিল: 1700 সারি (পয়েন্ট)

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

CREATE TABLE lines_with_messy_result AS (
SELECT
((ST_DUMP(ST_SPLIT(a.geom,b.ix))).geom) as geom
FROM st_union_lines a
INNER JOIN lots_of_points b
ON ST_INTERSECTS(a.geom, b.ix)
);

--then need to clean this up
create table lines_segments_cleaned as (
SELECT DISTINCT ON (ST_AsBinary(geom)) 
geom 
FROM 
lines_with_messy_result
);

এই উপায় / পদ্ধতির উত্স: /programming/25753348/how-do-i-divide-city-states-by-intersication- using- postgis


2

একই লাইন / পয়েন্ট টেবিল। এখনও অগোছালো ফলাফল এবং এটি পরিষ্কার করা দরকার। কোয়েরি শেষ করতে এখনও প্রচুর সময়।

--messy table    
Create table messy_lines_segments as 
Select 
row_number() over() as id,
(st_dump(st_split(input.geom, blade.ix))).geom as geom
from st_union_lines input
inner join lots_of_points blade on st_intersects(input.geom, blade.ix);

--then cleaning the messy table
delete from messy_lines_segments a
where exists 
(
select 1 from messy_lines_segments b where a.id != b.id and st_coveredby(b.geom,a.geom)
);

এই উপায় / পদ্ধতির উত্স: ছেদ পয়েন্টগুলিতে লাইনগুলি বিভক্ত করুন


3

আমি এই ফাংশনটিও পেয়েছি: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_PPoint.sql

এতে ভাল জিনিস রয়েছে যে এটি কোনও অগোছালো ছাড়বে না যা এর পরে আমার এটি পরিষ্কার করা দরকার। তবে আপনার উভয় পক্ষের (লাইনের টেবিল এবং পয়েন্ট টেবিল) স্টেমেউনিয়ন প্রয়োজন

এটি এক ধরণের:

create table osm.calles_cortadas_03segmentos_sanluis as (
SELECT result.geom
FROM 
osm.calles_cortadas_01uniones_sanluis AS line, 
osm.calles_cortadas_00intersecciones_sanluis AS point,
rc_split_line_by_points(
input_line:=line.geom
,input_points:=point.ix
,tolerance:=4
) AS result
);

তবে ফলাফল পাওয়ার জন্য এটি অত্যন্ত দীর্ঘ সময় hours এবং আমি আরও দীর্ঘ সারণী (10 কে লাইন, 14 কে পয়েন্ট) দিয়ে চেষ্টা করেছি এবং আমি কেবল সমস্যাগুলি স্মরণ করি।

আমিও খারাপ ফলাফলের সাথে এসরির আর্কজিআইএস চেষ্টা করেছি ...

সুতরাং, পোস্টজিআইএস জিওম ফাংশনগুলি দিয়ে এটি করার সর্বোত্তম উপায় কী?

মানে টপোলজিতে পা রেখেই নয়।

বা আপনার সেরা সুপারিশ কি?


1
খুব ছোট সহনশীলতার সাথে বাফার পয়েন্টগুলি, বাফারগুলির মধ্যে পলিনগুলি মুছুন, নতুন প্রান্তগুলি একসাথে স্ন্যাপ করুন। ।
মাইকেল সিলিমসন

4
আপনার চূড়ান্ত আপডেটটি উত্তর হিসাবে দেওয়া উচিত, যেহেতু এটি প্রশ্নের উত্তর দেয়
রাফেল

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

উত্তর:


5

এটাই উপাই!

ঠিক আছে, আমি রেমি-সি থেকে দুর্দান্ত প্রতিক্রিয়া পেয়েছি এবং এখন এটি মনোযোগের মতো কাজ করে:

সর্বকালের সেরা নন-টপোলজি সমাধান .. এটি সত্যই দ্রুত এবং সহজভাবে কাজ করে (বিশ্বাস করুন আমি এটি করার জন্য প্রচুর উপায় পরীক্ষা করেছি):

--please add this function:
https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_split_multi.sql

-- please create a universal sequence for unique id multipurpose
CREATE SEQUENCE select_id
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1
  CYCLE;



-- lines (non st_unioned linestrings, with gist index) : linetable
-- points (non st_unioned points, with gist index) : pointtable

-- first, lines with cuts (pointtable)
create table segment_lines_00 as (
WITH points_intersecting_lines AS( 
   SELECT lines.id AS lines_id, lines.geom AS line_geom,  ST_Collect(points.ix) AS blade
   FROM 
   linetable as lines, 
   pointtable as points
   WHERE st_dwithin(lines.geom, points.ix, 4) = true
   GROUP BY lines.id, lines.geom
)
SELECT lines_id, rc_Split_multi(line_geom, blade, 4)
FROM points_intersecting_lines
);
CREATE INDEX ON segment_lines_00 USING gist(rc_split_multi);


-- then, segments cutted by points
create table segment_lines_01 as (
select 
(ST_Dump(rc_split_multi)).geom as geom,  nextval('SELECT_id'::regclass) AS gid  from segment_lines_00
);
CREATE INDEX ON segment_lines_01 USING gist(geom);

এটাই!.


1

আমি st_split () ব্যবহার না করে আমার নিজস্ব পদ্ধতিও যুক্ত করছি,

প্রতিটি লাইনের জন্য আমি পরীক্ষা করি যে সেখানে কিছু ছেদযুক্ত বিন্দু রয়েছে কিনা।

যদি হ্যাঁ আমার প্রলোভনসঙ্কুলটি দেখতে পাবেন:

[line_id, fraction]
[1      , 0       ]
[1      , 0.3     ]
[1      , 1       ]
[2      , 0       ]
[2      , 0.88    ]
[2      , 1       ]
...

একটি সারণী যাতে রেখার আইডি এবং রেখার দৈর্ঘ্যের ভগ্নাংশ রয়েছে যেখানে একটি বিন্দু রেখাটিকে ছেদ করে।

তারপরে আমি জোড় দিয়ে ভগ্নাংশটি একত্রিত করে নতুন কাটা লাইন তৈরি করব

Recquirement:

  • সারণি "পয়েন্টস" প্রতিটি লাইনের শেষ পয়েন্টগুলি অন্তর্ভুক্ত করে।
  • পয়েন্টগুলি পুরোপুরি লাইনগুলিকে ছেদ করে।

ক্যোয়ারী:

DROP TABLE IF EXISTS temptable;

CREATE TABLE temptable as 
(
    SELECT ST_LineLocatePoint(a.geom,b.geom) as fraction,a.id, a.geom as shape
    FROM lines a, points b
    WHERE st_intersects(a.geom,b.geom)
    UNION
    SELECT 1 as fraction ,a.id, a.geom as shape -- It avoid to get an incomplete line when the original line is circular
    FROM lines a
    ORDER BY a.id, fraction -- important to keep the same order
);

ALTER TABLE temptable  ADD COLUMN gid SERIAL PRIMARY KEY;

DROP TABLE IF EXISTS LINE_SPLIT;
CREATE TABLE LINE_SPLIT AS
(
SELECT b.fend,a.*, ST_LineSubstring(a.shape,a.fstart,b.fend) as geom
FROM
    (
    SELECT *, fraction as fstart FROM temptable
    LIMIT (SELECT COUNT(*) FROM temptable)-1
    ) a,
    (
    SELECT fraction as fend,gid-1 as gid FROM temptable
    OFFSET 1
    ) b
WHERE a.gid = b.gid
AND a.fstart < b.fend
);

ALTER TABLE LINE_SPLIT DROP COLUMN IF EXISTS shape;
DROP TABLE IF EXISTS temptable;

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