PostGIS/PostgreSQL ST_StartPoint 和 ST_EndPoint 无法按预期工作

问题描述 投票:0回答:1

我这里有一个示例网络:

-- Create a table for the network
DROP TABLE IF EXISTS network;
CREATE TABLE network (
    gid serial PRIMARY KEY,
    geom geometry(MULTILINESTRING, 32750)
);

-- Insert data into the network table
INSERT INTO network (geom)
VALUES
 (ST_GeomFromText('MULTILINESTRING((236965.12797652138 9099825.720580515,236910.49060292653 9099809.63070992,236820.6127271211 9099784.52507155,236728.52930485632 9099757.624746459,236719.59348621656 9099754.717225986,236619.99908259162 9099735.694759984,236558.9879603834 9099727.223656265,236467.56687385618 9099715.131500328))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((234647.01709960966 9098407.195759641,234697.63853957626 9098401.21254988,234780.68174228835 9098392.313202396,234849.62632712646 9098382.864993922,234952.2044143706 9098368.814751014,235039.6046316626 9098353.998972997))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((242393.037073751 9099182.115078162,242392.1797409018 9099132.087512776,242388.85030601468 9099038.639609419,242387.73261411145 9099024.105454369,242385.9152835188 9099008.538253693,242385.5356943055 9099001.731389461,242384.42803756715 9098983.55707031,242383.47623877076 9098968.935357481,242381.3398282701 9098938.00877982,242378.30834712027 9098890.281107333,242373.5326267624 9098806.738606464,242370.43815740643 9098745.135672398,242367.69906183524 9098671.66257623))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((235968.2491839893 9099428.471053222,235968.18537995603 9099394.578680359,235971.1798874914 9099337.656101538,235977.58146428206 9099258.391413797,235982.51470152574 9099214.802546846,235981.84312571347 9099186.726744689,235981.54663333145 9099162.337799048,235982.99080228916 9099143.768277261,235991.13802505092 9099102.97576774))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((235431.00938103284 9098362.191736124,235522.51810232096 9098368.389801638,235627.7739198404 9098365.607093718,235669.3595457627 9098371.663203288,235691.0044790366 9098375.089109635,235753.50154032494 9098383.692539245,235778.60963302158 9098386.928724453,235839.64770270255 9098392.42516764))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((236906.37470792822 9098087.409948874,236911.18453461514 9098085.08156372,236916.59242927545 9098084.161957258,236923.17175964022 9098084.643454272,236930.70379174495 9098086.226008428,236942.57678028307 9098090.191049587,236995.03172487405 9098109.52169508,237049.6874975437 9098131.443391275,237102.3702192016 9098147.688123614,237177.98197264277 9098164.588262618,237208.9955456404 9098170.348126808,237283.5797555765 9098182.019373326))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((237889.54850588707 9099416.10135823,237861.03560479853 9099403.065240948,237776.83984798827 9099364.340857405,237718.07387273753 9099339.840444924,237717.03037786623 9099339.170412187,237716.30720262392 9099338.402681392,237715.93677157053 9099337.648091817,237715.68703256233 9099336.993796233,237715.6589717067 9099336.141638432,237715.80627341627 9099335.467550317))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((230999.10853103863 9099481.985200254,230994.52807089145 9099480.917410662,230987.94560418883 9099484.54030442,230983.81200804858 9099489.815649724,230973.9831866637 9099486.901461642,230964.606607351 9099476.65368108,230951.1333066541 9099465.573394874,230950.03983937157 9099443.96724853))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((237669.78740513662 9099750.924865516,237644.00446772482 9099807.923042681,237632.58417056204 9099831.86654262,237614.19311912986 9099867.464558827,237589.19076078094 9099921.081492916,237580.9519397476 9099938.371617133,237575.96085318585 9099948.997688973,237564.91248136858 9099971.5602745,237554.1519551514 9099995.79534651,237540.66525729682 9100026.122169761,237536.3201462762 9100035.645559616,237534.21264582098 9100041.53071963,237533.70492695988 9100045.367233828,237534.53708708956 9100048.226862732,237536.15889430005 9100049.929330125,237539.1710191819 9100051.451877935,237571.26052095956 9100063.845258921,237590.99289888737 9100072.005518464))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((238290.10924862354 9100449.528488996,238300.78050381184 9100440.440505585,238307.77895070062 9100433.433286749,238313.29070293054 9100426.11859745,238366.38926230292 9100345.646029849,238394.456739956 9100299.393871235,238397.6089417815 9100293.957419671,238402.24375390558 9100285.763467262,238409.2690330285 9100272.29456766,238428.88327115815 9100229.179490758,238437.35171992722 9100210.275182357,238447.57030557032 9100186.236014534))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((235991.13802505092 9099102.97576774,235999.94729761285 9099063.957578834,236012.52962111152 9098987.351933783,236047.32521962933 9098779.260198733,236050.21851470845 9098765.468272861,236057.94435507065 9098734.377258327))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((240583.5670156748 9098708.858795594,240575.81271711361 9098745.415426271,240559.72629942783 9098821.19190337,240551.27561926315 9098865.622502502,240548.67084152455 9098879.349604245,240545.99804420926 9098893.397184366,240545.0074845222 9098902.563996287,240544.90265178998 9098903.526008833,240546.87432948416 9098911.415515788,240560.22408957023 9098940.139624037,240591.00701363786 9099006.374783214,240599.3044518184 9099024.215034304,240614.52115427845 9099058.006513122,240616.8287555418 9099063.12074499,240618.37439938626 9099066.548715966,240625.50009605 9099079.237079807,240626.9979046591 9099083.30652002,240630.44968059298 9099092.631971326,240633.77691543254 9099106.30509554))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((235121.90665869263 9098041.66919899,235305.0825467948 9098025.398288175,235309.22016573843 9098026.739641404,235311.1289295192 9098028.36649023,235312.231936727 9098030.143455785,235312.73843372677 9098037.670684632,235313.6760311217 9098041.305589896,235315.8495966731 9098042.900818488,235318.49967888638 9098044.089475797,235401.4814509754 9098056.455803134,235511.31282504188 9098070.26511372))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((240633.77691543254 9099106.30509554,240646.2179658594 9099103.655633751,240664.79374722677 9099098.319986928,240667.17830813417 9099097.79170282,240698.04490493453 9099090.989614611,240731.04208313048 9099083.724130152,240754.22519607825 9099078.603366809,240758.21044055643 9099077.73032659,240776.9958678923 9099074.25471601,240800.85852253652 9099069.823892232,240808.81637098 9099068.354345977,240824.46720753572 9099065.457967041,240836.57508855965 9099063.215910958,240863.35403255408 9099055.925225893,240901.97080614345 9099045.42826387,240948.78199145632 9099032.588977695,240975.65075330896 9099025.011078596,241035.4788070868 9099010.963917548,241046.78742021509 9099007.75454469,241077.85375297684 9099000.698904326,241111.6178141923 9098992.34223924,241121.43347606776 9098989.909758648,241132.88799708532 9098988.150676996,241136.89372331445 9098987.543276723,241140.4602514472 9098986.623514963,241213.07146126698 9098967.925861549,241232.28797971358 9098962.33925214,241238.5824205955 9098960.616553605,241279.60198683885 9098950.199661981,241316.88944005535 9098940.73474418,241322.77459925957 9098939.242014533,241325.25893694145 9098938.614698313,241338.01374933054 9098935.070660792,241351.61895634056 9098931.277073666,241359.21522505322 9098929.407017093,241376.47244089842 9098925.158855308,241393.4568553218 9098920.422262475,241399.4591552649 9098915.84318841,241401.9732738232 9098911.985186102,241403.0239647283 9098888.633972548))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((235511.31282504188 9098070.26511372,235495.28337892442 9098140.465830375,235453.41823472705 9098281.616740992,235431.00938103284 9098362.191736124,235429.5563481925 9098367.361524975,235389.8659413595 9098526.572449826,235368.69602721214 9098647.254455596))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((232271.3954185926 9099757.403247178,232271.57125379448 9099750.15657101,232272.3912364529 9099742.139196599,232274.09276087547 9099730.541978814,232280.27994824166 9099708.260549024,232280.82646316575 9099705.386868985,232280.77087996452 9099701.790332317,232279.6044128745 9099699.570278818,232277.68633265764 9099697.655537866,232258.21750078653 9099689.748676134,232252.3279573646 9099686.338402191,232249.9662558239 9099684.852539314,232247.6115994712 9099682.193802917,232245.78531638236 9099679.682088254,232244.69019048155 9099676.599372745,232244.41190222214 9099673.366650349,232245.02763182425 9099669.98438474,232250.02144661907 9099651.800992912,232253.02839259704 9099643.154970575))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((236541.6853189299 9099218.588523043,236536.1373498288 9099248.762963729,236516.46504776948 9099323.744291645,236510.00906081748 9099350.848382225,236502.97189918696 9099379.276828539,236487.27143441408 9099492.975712858,236479.25930373446 9099546.438334005,236477.5441480074 9099579.180382425,236467.56687385618 9099715.131500328,236464.71365342377 9099759.47393259,236454.57469185145 9099850.046829805,236445.93035544956 9099898.548641084))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((238506.166264851 9098937.642536037,238668.235023198 9098927.429446789,238796.4285428939 9098923.655984545,238884.70282412812 9098921.053357461,238946.7921767336 9098918.341340493,238955.09647549762 9098917.980620272,238997.12530939167 9098916.14677561,239013.6236482723 9098915.4246693,239099.02138117948 9098908.843593031,239304.8266065211 9098904.383632412))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((237352.09645828453 9099991.319390725,237327.58242411207 9099975.075613085,237288.1660383977 9099950.567079255,237240.65208115755 9099919.36079055,237224.61397617665 9099909.24149758,237216.28803891875 9099903.87022294,237202.07475770538 9099894.680058397,237197.06292824616 9099891.972817626,237193.41114798922 9099890.479664225,237189.93362307316 9099889.35267848,237187.6559172955 9099888.564711135,237186.136816332 9099888.146356236,237149.68622525077 9099876.778081475,237114.91888720513 9099867.909294685,237107.9785202465 9099866.905726554,237101.84079397068 9099866.283096138,237093.9244443649 9099866.247480216,237079.00248768373 9099865.052996902,237072.42680901726 9099863.90773003,237066.89091745001 9099862.193220252,237064.16358374758 9099860.993193157,237062.25291773555 9099859.665203627,237060.48623543058 9099858.2274143,237059.1593320354 9099857.00245136,237054.88341160293 9099854.775321005,237051.0560769671 9099853.137274746,237046.7449272088 9099851.275076825,237044.30360395345 9099850.187383905,237041.55539502884 9099848.788063956))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((237764.59138145112 9100237.638189647,237858.8062411053 9100025.902289767,237904.3281753374 9099923.366612582,237913.7170392239 9099903.604706632,237931.17784713238 9099864.903016193,237936.02384691627 9099856.433719175,237940.79338278738 9099847.842259664,237944.99945120394 9099839.446654873,237951.28271149332 9099826.559878143,237956.37331014048 9099815.867990224,237967.21735616474 9099792.38579521,237970.92067149235 9099783.23482803,237973.86531993683 9099777.476300841,237975.71816477177 9099773.636634681,238026.42070522267 9099663.784392236,238080.83881557864 9099535.15488132,238089.23664825913 9099515.15479659,238129.99598085703 9099418.035067467))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((237611.48191605933 9099060.179552203,237621.43159329315 9099065.018174764,237629.83995575458 9099069.471511165,237642.06776527507 9099076.89059053,237654.7339809849 9099084.7548411,237698.266892521 9099112.197521482,237716.36819183448 9099122.030098418,237810.96250078158 9099173.540510532,237831.8831775153 9099183.920730405,237845.81433314615 9099190.431377262,237858.5859305079 9099195.38611942,237866.05937669045 9099197.587735374,237919.5709165333 9099209.996417508,237971.17844748058 9099223.69947729,238063.6890844357 9099250.865420613))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((234671.8792478842 9098312.992125815,234486.24342483998 9098380.853727018,234441.94831677026 9098396.467872424,234344.50068383105 9098432.002844324,234273.6935490832 9098457.870878741,234156.98530805885 9098500.504994262,234120.36478812282 9098514.106609235,233966.34609592793 9098565.778975176,233876.0567746134 9098598.866265701,233827.31861734716 9098616.168465665,233778.14730817924 9098633.988094904,233590.76219962677 9098704.281707767,233496.7460839086 9098739.094393728,233403.4986006769 9098776.246275848))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((234944.69279451016 9097105.694348248,234911.9858745262 9097095.57393254,234899.44457078737 9097090.951391833,234889.99481099454 9097089.279528206,234880.3732119283 9097090.538878266,234874.74349743896 9097091.678192955,234869.99624197243 9097094.59318084,234861.22119255073 9097103.647380397,234855.7405440103 9097105.672787497,234850.85213768168 9097106.37391967,234843.47506261937 9097104.714411369,234830.48529938213 9097099.49166107,234818.83965706883 9097094.431836525,234761.64648851118 9097076.75160059,234755.00194768503 9097076.125498235,234749.59840481618 9097076.314551305,234743.98274633748 9097076.944940602,234684.0390958913 9097085.992459254,234658.6852615312 9097088.939324629,234615.08126031182 9097097.962588593,234601.15573725017 9097099.893282723,234584.88077162544 9097101.998049414,234575.6948540585 9097104.145145407,234559.54919861548 9097108.59647364,234547.11486601672 9097111.9081286,234503.01319818443 9097123.01962569))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((236887.90297561622 9098412.597889923,236890.31542251504 9098427.881718632,236890.9637867249 9098443.166184321,236888.62729564763 9098461.663959125,236885.45022983052 9098475.0115851,236863.01742433925 9098543.326494535,236861.0445962808 9098550.661931189,236851.92164406244 9098594.380777253,236847.96660491877 9098612.503847182,236845.01117149036 9098623.794713378))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((239755.5341968047 9099363.161539864,239759.07698240184 9099336.117999446,239781.32934514765 9099158.183920873,239785.0736893258 9099130.61045738,239786.0991300659 9099123.048199862,239789.40103307544 9099101.380696757,239794.21667430986 9099069.719557803,239804.87976813928 9098999.63172106,239808.13106062164 9098973.416337978,239813.64965640905 9098929.001723986,239814.00823865572 9098926.126999872,239815.17037053534 9098883.844550068,239818.83104543673 9098855.496075943,239820.87523635328 9098839.630191257,239823.43580851966 9098793.881600635,239828.47201581814 9098758.437635483,239831.69121842974 9098735.829157671,239833.28930991926 9098724.607836852,239836.55500462124 9098701.590237955,239839.0501535021 9098684.02302826,239848.66256362415 9098616.385436542,239849.99628431123 9098607.01037496))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((238454.8389757539 9100168.862675535,238461.55544661087 9100157.284043508,238466.9101960959 9100150.411022266,238473.97557357512 9100143.2603479,238479.55504119227 9100137.550445747,238482.82992815058 9100133.752300883,238485.5020491662 9100129.330993757,238497.03048061626 9100107.545657767,238516.27627151224 9100070.834930586,238528.28272910084 9100048.377446497,238537.40051148192 9100031.546060476,238542.4858335292 9100021.728227688,238554.84605885716 9099997.225834776,238566.10555725155 9099968.645151708,238573.67126997322 9099949.49212876,238579.21562832373 9099936.600981066,238583.57086304665 9099925.307253657,238587.78010675812 9099914.466326125,238592.12684319136 9099902.741023097,238594.83546140997 9099895.852486039,238599.17687344662 9099886.915474558,238605.48294154232 9099875.743833184,238611.8758476676 9099864.8050611,238621.56241713383 9099850.621491626,238632.1557192637 9099835.989582019,238636.92088021574 9099829.998283446,238641.3832313757 9099824.879326263,238644.3569640527 9099821.665847046,238647.03541055895 9099819.922250899,238653.15175302225 9099818.541816337,238684.26105125132 9099817.562374877,238689.5545915786 9099719.548513465,238693.45253302465 9099656.4800681))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((236010.18836339784 9097935.723376941,236109.8007677046 9097967.74992961,236226.38754276675 9098006.183881145,236237.59860311117 9098010.211600311,236244.6747394753 9098014.303323187,236234.31204576057 9098066.169723665,236225.87721298373 9098092.26621005,236207.1680769206 9098155.314068375,236182.0993310564 9098244.039193736,236178.5309389523 9098247.10516316,236173.6508781786 9098248.249118784,236167.45592977817 9098246.154310843,236110.1227632219 9098212.76333516,236105.69328656513 9098212.294470016,236102.43477188144 9098213.304188509,236099.60328626778 9098216.67327648,236065.28389126598 9098318.411279341,236037.4096849346 9098432.093423758,236028.794254396 9098462.592709363,236021.2166326497 9098494.71363598,236019.68958613754 9098503.080761595,236016.4942623551 9098517.601181885,236012.84395387658 9098534.475742755,235993.04166620347 9098633.068908248,235977.44698086916 9098719.349593274))', 32750)),
 (ST_GeomFromText('MULTILINESTRING((233556.38297095476 9099323.724290801,233562.3269738232 9099216.616022807,233573.87362852105 9098978.386082903,233585.5033884102 9098794.49758481,233588.38089737872 9098741.092270087,233590.76219962677 9098704.281707767,233589.87557580415 9098690.30112194,233573.90472558874 9098488.54321991,233566.96590998577 9098415.460633583,233546.77737175772 9098281.075229272,233522.22333766392 9098109.79453063,233512.40899396746 9098047.449989371,233499.51029516128 9097964.39511532,233491.43041641725 9097918.061156034,233488.25983349985 9097904.37669058,233472.3838150241 9097814.056258356,233448.75432345952 9097735.208166515,233422.98736057477 9097659.810618926,233406.61868772324 9097611.269203601,233381.43343427835 9097530.829354959,233366.35044374428 9097470.157111062,233351.4494085245 9097404.893892834,233319.81734025932 9097279.877940439,233307.6631182427 9097223.593933519,233291.28300118278 9097156.816898309))', 32750));

-- Add id column to the existing network table
ALTER TABLE network ADD COLUMN id serial;

-- Update id column with row numbers
WITH numbered_network AS (
    SELECT gid, ROW_NUMBER() OVER () AS id
    FROM network
)
UPDATE network
SET id = numbered_network.id
FROM numbered_network
WHERE network.gid = numbered_network.gid;

-- Display the updated network data
SELECT * FROM network;

根据导入网络的几何形状,我需要提取遵循以下规则的节点:

  • 每条边的起点或终点
  • 链接的交叉点

如下图所示,我需要提取红色圆圈强调的节点。黑色节点表示不需要生成的链接的中间起点/终点。孤立的链接也应该被删除(此时它不包含在查询中)。

这是我当前使用的查询。

-- Drop output table if it is already exists
DROP TABLE IF EXISTS split_points;


---- Master nodes
-- Drop the existing temporary table if it already exists
DROP TABLE IF EXISTS master_nodes_temp;

-- Create a temporary master table to store unique intersection and endpoint nodes
CREATE TEMPORARY TABLE master_nodes_temp (
    id SERIAL PRIMARY KEY,
    geom geometry(Point)
);


-- Update the SRID for the network table
UPDATE network
SET geom = ST_SetSRID(geom, 32750);
-- Update the SRID for master node table
UPDATE master_nodes_temp
SET geom = ST_SetSRID(geom, 32750);

-- Insert unique intersection points (crossings and T-shape intersections)
INSERT INTO master_nodes_temp (geom)
SELECT DISTINCT (ST_Dump(ST_Intersection(a.geom, b.geom))).geom AS geom
FROM network a, network b
WHERE ST_Intersects(a.geom, b.geom)
    AND a.gid <> b.gid;

-- Insert unique endpoints as vertices
INSERT INTO master_nodes_temp (geom)
SELECT DISTINCT ST_StartPoint(geom) AS geom
FROM network
UNION
SELECT DISTINCT ST_EndPoint(geom) AS geom
FROM network;

-- Optional: Index the geometry column for better performance
CREATE INDEX idx_master_nodes_temp_geom ON master_nodes_temp USING GIST(geom);


---- Intersections
-- Drop the existing temporary table if it already exists
DROP TABLE IF EXISTS intersection_nodes_temp;

-- Create a temporary table to store intersection nodes
CREATE TEMPORARY TABLE intersection_nodes_temp AS
SELECT *
FROM master_nodes_temp
WHERE ST_Intersection(geom, geom) IS NOT NULL
  AND geom NOT IN (
    SELECT DISTINCT ON (ST_StartPoint(b.geom), ST_EndPoint(b.geom))
        ST_StartPoint(b.geom) AS geom
    FROM master_nodes_temp a, master_nodes_temp b
    WHERE ST_Intersects(a.geom, b.geom)
      AND ST_StartPoint(b.geom) IS NOT NULL
      AND ST_EndPoint(b.geom) IS NOT NULL
    ORDER BY ST_StartPoint(b.geom), ST_EndPoint(b.geom), ST_Distance(a.geom, b.geom)
  );

-- Optional: Index the geometry column for better performance
CREATE INDEX idx_intersection_nodes_temp_geom ON intersection_nodes_temp USING GIST(geom);


---- Endpoints
-- Drop the existing temporary table if it already exists
DROP TABLE IF EXISTS endpoint_nodes_temp;

-- Create a temporary table to store endpoint nodes without duplication
CREATE TEMPORARY TABLE endpoint_nodes_temp AS
SELECT DISTINCT ON (ST_StartPoint(geom), ST_EndPoint(geom))
    id,
    ST_StartPoint(geom) AS geom
FROM master_nodes_temp
UNION
SELECT DISTINCT ON (ST_StartPoint(geom), ST_EndPoint(geom))
    id,
    ST_EndPoint(geom) AS geom
FROM master_nodes_temp;

-- Optional: Index the geometry column for better performance
CREATE INDEX idx_endpoint_nodes_temp_geom ON endpoint_nodes_temp USING GIST(geom);

---- Final output
-- Create a final table by integrating tables 2 and 3
CREATE TABLE split_points AS
SELECT * FROM intersection_nodes_temp
UNION
SELECT * FROM endpoint_nodes_temp;

-- Optional: Index the geometry column for better performance
CREATE INDEX idx_split_points_geom ON split_points USING GIST(geom);

它不会从某些悬空链接(cul-de-sak)中提取起点/终点。我测试了几个查询并检查了几个死胡同之间的差异,但找不到任何差异。

目前我正在采取3个步骤来达到预期的结果,1.提取所有节点,包括不需要的节点(例如交叉点之间的中间节点),2.提取交叉点,3.提取起点/终点和4个合并节点从 2 到 3。

我一一检查了输出,发现步骤1中生成的

master_nodes_temp
不包含这些节点。

另外,虽然示例数据中没有包含,但也有一些从自环链路中提取的节点,如上图蓝色圆圈所示(实际示例如下)。该链接似乎是从/到同一点绘制的,因此它被识别为起点/终点,但这不是必需的。

我希望有人可以提供建议。

postgresql networkx postgis
1个回答
0
投票

Postgis 函数

ST_Node
ST_LineMerge
可用于解决该问题,其中
ST_Node
完全节点一组线串(预先聚合成单个 MultiLineString),如有必要,在交叉点处创建额外的节点,并在交叉点。这可能会留下线串的破碎部分,这些部分在其连接处没有有用的节点:“ST_LineMerge”将这些部分组合成连续的线串。

以下查询演示了如何查找相关的端节点:

WITH network AS (
  SELECT row_number() OVER () AS id, geom 
  FROM (VALUES
    (ST_GeomFromText('MULTILINESTRING((236965.12797652138 9099825.720580515,236910.49060292653 9099809.63070992,236820.6127271211 9099784.52507155,236728.52930485632 9099757.624746459,236719.59348621656 9099754.717225986,236619.99908259162 9099735.694759984,236558.9879603834 9099727.223656265,236467.56687385618 9099715.131500328))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((234647.01709960966 9098407.195759641,234697.63853957626 9098401.21254988,234780.68174228835 9098392.313202396,234849.62632712646 9098382.864993922,234952.2044143706 9098368.814751014,235039.6046316626 9098353.998972997))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((242393.037073751 9099182.115078162,242392.1797409018 9099132.087512776,242388.85030601468 9099038.639609419,242387.73261411145 9099024.105454369,242385.9152835188 9099008.538253693,242385.5356943055 9099001.731389461,242384.42803756715 9098983.55707031,242383.47623877076 9098968.935357481,242381.3398282701 9098938.00877982,242378.30834712027 9098890.281107333,242373.5326267624 9098806.738606464,242370.43815740643 9098745.135672398,242367.69906183524 9098671.66257623))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((235968.2491839893 9099428.471053222,235968.18537995603 9099394.578680359,235971.1798874914 9099337.656101538,235977.58146428206 9099258.391413797,235982.51470152574 9099214.802546846,235981.84312571347 9099186.726744689,235981.54663333145 9099162.337799048,235982.99080228916 9099143.768277261,235991.13802505092 9099102.97576774))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((235431.00938103284 9098362.191736124,235522.51810232096 9098368.389801638,235627.7739198404 9098365.607093718,235669.3595457627 9098371.663203288,235691.0044790366 9098375.089109635,235753.50154032494 9098383.692539245,235778.60963302158 9098386.928724453,235839.64770270255 9098392.42516764))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((236906.37470792822 9098087.409948874,236911.18453461514 9098085.08156372,236916.59242927545 9098084.161957258,236923.17175964022 9098084.643454272,236930.70379174495 9098086.226008428,236942.57678028307 9098090.191049587,236995.03172487405 9098109.52169508,237049.6874975437 9098131.443391275,237102.3702192016 9098147.688123614,237177.98197264277 9098164.588262618,237208.9955456404 9098170.348126808,237283.5797555765 9098182.019373326))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((237889.54850588707 9099416.10135823,237861.03560479853 9099403.065240948,237776.83984798827 9099364.340857405,237718.07387273753 9099339.840444924,237717.03037786623 9099339.170412187,237716.30720262392 9099338.402681392,237715.93677157053 9099337.648091817,237715.68703256233 9099336.993796233,237715.6589717067 9099336.141638432,237715.80627341627 9099335.467550317))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((230999.10853103863 9099481.985200254,230994.52807089145 9099480.917410662,230987.94560418883 9099484.54030442,230983.81200804858 9099489.815649724,230973.9831866637 9099486.901461642,230964.606607351 9099476.65368108,230951.1333066541 9099465.573394874,230950.03983937157 9099443.96724853))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((237669.78740513662 9099750.924865516,237644.00446772482 9099807.923042681,237632.58417056204 9099831.86654262,237614.19311912986 9099867.464558827,237589.19076078094 9099921.081492916,237580.9519397476 9099938.371617133,237575.96085318585 9099948.997688973,237564.91248136858 9099971.5602745,237554.1519551514 9099995.79534651,237540.66525729682 9100026.122169761,237536.3201462762 9100035.645559616,237534.21264582098 9100041.53071963,237533.70492695988 9100045.367233828,237534.53708708956 9100048.226862732,237536.15889430005 9100049.929330125,237539.1710191819 9100051.451877935,237571.26052095956 9100063.845258921,237590.99289888737 9100072.005518464))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((238290.10924862354 9100449.528488996,238300.78050381184 9100440.440505585,238307.77895070062 9100433.433286749,238313.29070293054 9100426.11859745,238366.38926230292 9100345.646029849,238394.456739956 9100299.393871235,238397.6089417815 9100293.957419671,238402.24375390558 9100285.763467262,238409.2690330285 9100272.29456766,238428.88327115815 9100229.179490758,238437.35171992722 9100210.275182357,238447.57030557032 9100186.236014534))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((235991.13802505092 9099102.97576774,235999.94729761285 9099063.957578834,236012.52962111152 9098987.351933783,236047.32521962933 9098779.260198733,236050.21851470845 9098765.468272861,236057.94435507065 9098734.377258327))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((240583.5670156748 9098708.858795594,240575.81271711361 9098745.415426271,240559.72629942783 9098821.19190337,240551.27561926315 9098865.622502502,240548.67084152455 9098879.349604245,240545.99804420926 9098893.397184366,240545.0074845222 9098902.563996287,240544.90265178998 9098903.526008833,240546.87432948416 9098911.415515788,240560.22408957023 9098940.139624037,240591.00701363786 9099006.374783214,240599.3044518184 9099024.215034304,240614.52115427845 9099058.006513122,240616.8287555418 9099063.12074499,240618.37439938626 9099066.548715966,240625.50009605 9099079.237079807,240626.9979046591 9099083.30652002,240630.44968059298 9099092.631971326,240633.77691543254 9099106.30509554))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((235121.90665869263 9098041.66919899,235305.0825467948 9098025.398288175,235309.22016573843 9098026.739641404,235311.1289295192 9098028.36649023,235312.231936727 9098030.143455785,235312.73843372677 9098037.670684632,235313.6760311217 9098041.305589896,235315.8495966731 9098042.900818488,235318.49967888638 9098044.089475797,235401.4814509754 9098056.455803134,235511.31282504188 9098070.26511372))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((240633.77691543254 9099106.30509554,240646.2179658594 9099103.655633751,240664.79374722677 9099098.319986928,240667.17830813417 9099097.79170282,240698.04490493453 9099090.989614611,240731.04208313048 9099083.724130152,240754.22519607825 9099078.603366809,240758.21044055643 9099077.73032659,240776.9958678923 9099074.25471601,240800.85852253652 9099069.823892232,240808.81637098 9099068.354345977,240824.46720753572 9099065.457967041,240836.57508855965 9099063.215910958,240863.35403255408 9099055.925225893,240901.97080614345 9099045.42826387,240948.78199145632 9099032.588977695,240975.65075330896 9099025.011078596,241035.4788070868 9099010.963917548,241046.78742021509 9099007.75454469,241077.85375297684 9099000.698904326,241111.6178141923 9098992.34223924,241121.43347606776 9098989.909758648,241132.88799708532 9098988.150676996,241136.89372331445 9098987.543276723,241140.4602514472 9098986.623514963,241213.07146126698 9098967.925861549,241232.28797971358 9098962.33925214,241238.5824205955 9098960.616553605,241279.60198683885 9098950.199661981,241316.88944005535 9098940.73474418,241322.77459925957 9098939.242014533,241325.25893694145 9098938.614698313,241338.01374933054 9098935.070660792,241351.61895634056 9098931.277073666,241359.21522505322 9098929.407017093,241376.47244089842 9098925.158855308,241393.4568553218 9098920.422262475,241399.4591552649 9098915.84318841,241401.9732738232 9098911.985186102,241403.0239647283 9098888.633972548))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((235511.31282504188 9098070.26511372,235495.28337892442 9098140.465830375,235453.41823472705 9098281.616740992,235431.00938103284 9098362.191736124,235429.5563481925 9098367.361524975,235389.8659413595 9098526.572449826,235368.69602721214 9098647.254455596))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((232271.3954185926 9099757.403247178,232271.57125379448 9099750.15657101,232272.3912364529 9099742.139196599,232274.09276087547 9099730.541978814,232280.27994824166 9099708.260549024,232280.82646316575 9099705.386868985,232280.77087996452 9099701.790332317,232279.6044128745 9099699.570278818,232277.68633265764 9099697.655537866,232258.21750078653 9099689.748676134,232252.3279573646 9099686.338402191,232249.9662558239 9099684.852539314,232247.6115994712 9099682.193802917,232245.78531638236 9099679.682088254,232244.69019048155 9099676.599372745,232244.41190222214 9099673.366650349,232245.02763182425 9099669.98438474,232250.02144661907 9099651.800992912,232253.02839259704 9099643.154970575))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((236541.6853189299 9099218.588523043,236536.1373498288 9099248.762963729,236516.46504776948 9099323.744291645,236510.00906081748 9099350.848382225,236502.97189918696 9099379.276828539,236487.27143441408 9099492.975712858,236479.25930373446 9099546.438334005,236477.5441480074 9099579.180382425,236467.56687385618 9099715.131500328,236464.71365342377 9099759.47393259,236454.57469185145 9099850.046829805,236445.93035544956 9099898.548641084))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((238506.166264851 9098937.642536037,238668.235023198 9098927.429446789,238796.4285428939 9098923.655984545,238884.70282412812 9098921.053357461,238946.7921767336 9098918.341340493,238955.09647549762 9098917.980620272,238997.12530939167 9098916.14677561,239013.6236482723 9098915.4246693,239099.02138117948 9098908.843593031,239304.8266065211 9098904.383632412))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((237352.09645828453 9099991.319390725,237327.58242411207 9099975.075613085,237288.1660383977 9099950.567079255,237240.65208115755 9099919.36079055,237224.61397617665 9099909.24149758,237216.28803891875 9099903.87022294,237202.07475770538 9099894.680058397,237197.06292824616 9099891.972817626,237193.41114798922 9099890.479664225,237189.93362307316 9099889.35267848,237187.6559172955 9099888.564711135,237186.136816332 9099888.146356236,237149.68622525077 9099876.778081475,237114.91888720513 9099867.909294685,237107.9785202465 9099866.905726554,237101.84079397068 9099866.283096138,237093.9244443649 9099866.247480216,237079.00248768373 9099865.052996902,237072.42680901726 9099863.90773003,237066.89091745001 9099862.193220252,237064.16358374758 9099860.993193157,237062.25291773555 9099859.665203627,237060.48623543058 9099858.2274143,237059.1593320354 9099857.00245136,237054.88341160293 9099854.775321005,237051.0560769671 9099853.137274746,237046.7449272088 9099851.275076825,237044.30360395345 9099850.187383905,237041.55539502884 9099848.788063956))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((237764.59138145112 9100237.638189647,237858.8062411053 9100025.902289767,237904.3281753374 9099923.366612582,237913.7170392239 9099903.604706632,237931.17784713238 9099864.903016193,237936.02384691627 9099856.433719175,237940.79338278738 9099847.842259664,237944.99945120394 9099839.446654873,237951.28271149332 9099826.559878143,237956.37331014048 9099815.867990224,237967.21735616474 9099792.38579521,237970.92067149235 9099783.23482803,237973.86531993683 9099777.476300841,237975.71816477177 9099773.636634681,238026.42070522267 9099663.784392236,238080.83881557864 9099535.15488132,238089.23664825913 9099515.15479659,238129.99598085703 9099418.035067467))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((237611.48191605933 9099060.179552203,237621.43159329315 9099065.018174764,237629.83995575458 9099069.471511165,237642.06776527507 9099076.89059053,237654.7339809849 9099084.7548411,237698.266892521 9099112.197521482,237716.36819183448 9099122.030098418,237810.96250078158 9099173.540510532,237831.8831775153 9099183.920730405,237845.81433314615 9099190.431377262,237858.5859305079 9099195.38611942,237866.05937669045 9099197.587735374,237919.5709165333 9099209.996417508,237971.17844748058 9099223.69947729,238063.6890844357 9099250.865420613))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((234671.8792478842 9098312.992125815,234486.24342483998 9098380.853727018,234441.94831677026 9098396.467872424,234344.50068383105 9098432.002844324,234273.6935490832 9098457.870878741,234156.98530805885 9098500.504994262,234120.36478812282 9098514.106609235,233966.34609592793 9098565.778975176,233876.0567746134 9098598.866265701,233827.31861734716 9098616.168465665,233778.14730817924 9098633.988094904,233590.76219962677 9098704.281707767,233496.7460839086 9098739.094393728,233403.4986006769 9098776.246275848))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((234944.69279451016 9097105.694348248,234911.9858745262 9097095.57393254,234899.44457078737 9097090.951391833,234889.99481099454 9097089.279528206,234880.3732119283 9097090.538878266,234874.74349743896 9097091.678192955,234869.99624197243 9097094.59318084,234861.22119255073 9097103.647380397,234855.7405440103 9097105.672787497,234850.85213768168 9097106.37391967,234843.47506261937 9097104.714411369,234830.48529938213 9097099.49166107,234818.83965706883 9097094.431836525,234761.64648851118 9097076.75160059,234755.00194768503 9097076.125498235,234749.59840481618 9097076.314551305,234743.98274633748 9097076.944940602,234684.0390958913 9097085.992459254,234658.6852615312 9097088.939324629,234615.08126031182 9097097.962588593,234601.15573725017 9097099.893282723,234584.88077162544 9097101.998049414,234575.6948540585 9097104.145145407,234559.54919861548 9097108.59647364,234547.11486601672 9097111.9081286,234503.01319818443 9097123.01962569))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((236887.90297561622 9098412.597889923,236890.31542251504 9098427.881718632,236890.9637867249 9098443.166184321,236888.62729564763 9098461.663959125,236885.45022983052 9098475.0115851,236863.01742433925 9098543.326494535,236861.0445962808 9098550.661931189,236851.92164406244 9098594.380777253,236847.96660491877 9098612.503847182,236845.01117149036 9098623.794713378))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((239755.5341968047 9099363.161539864,239759.07698240184 9099336.117999446,239781.32934514765 9099158.183920873,239785.0736893258 9099130.61045738,239786.0991300659 9099123.048199862,239789.40103307544 9099101.380696757,239794.21667430986 9099069.719557803,239804.87976813928 9098999.63172106,239808.13106062164 9098973.416337978,239813.64965640905 9098929.001723986,239814.00823865572 9098926.126999872,239815.17037053534 9098883.844550068,239818.83104543673 9098855.496075943,239820.87523635328 9098839.630191257,239823.43580851966 9098793.881600635,239828.47201581814 9098758.437635483,239831.69121842974 9098735.829157671,239833.28930991926 9098724.607836852,239836.55500462124 9098701.590237955,239839.0501535021 9098684.02302826,239848.66256362415 9098616.385436542,239849.99628431123 9098607.01037496))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((238454.8389757539 9100168.862675535,238461.55544661087 9100157.284043508,238466.9101960959 9100150.411022266,238473.97557357512 9100143.2603479,238479.55504119227 9100137.550445747,238482.82992815058 9100133.752300883,238485.5020491662 9100129.330993757,238497.03048061626 9100107.545657767,238516.27627151224 9100070.834930586,238528.28272910084 9100048.377446497,238537.40051148192 9100031.546060476,238542.4858335292 9100021.728227688,238554.84605885716 9099997.225834776,238566.10555725155 9099968.645151708,238573.67126997322 9099949.49212876,238579.21562832373 9099936.600981066,238583.57086304665 9099925.307253657,238587.78010675812 9099914.466326125,238592.12684319136 9099902.741023097,238594.83546140997 9099895.852486039,238599.17687344662 9099886.915474558,238605.48294154232 9099875.743833184,238611.8758476676 9099864.8050611,238621.56241713383 9099850.621491626,238632.1557192637 9099835.989582019,238636.92088021574 9099829.998283446,238641.3832313757 9099824.879326263,238644.3569640527 9099821.665847046,238647.03541055895 9099819.922250899,238653.15175302225 9099818.541816337,238684.26105125132 9099817.562374877,238689.5545915786 9099719.548513465,238693.45253302465 9099656.4800681))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((236010.18836339784 9097935.723376941,236109.8007677046 9097967.74992961,236226.38754276675 9098006.183881145,236237.59860311117 9098010.211600311,236244.6747394753 9098014.303323187,236234.31204576057 9098066.169723665,236225.87721298373 9098092.26621005,236207.1680769206 9098155.314068375,236182.0993310564 9098244.039193736,236178.5309389523 9098247.10516316,236173.6508781786 9098248.249118784,236167.45592977817 9098246.154310843,236110.1227632219 9098212.76333516,236105.69328656513 9098212.294470016,236102.43477188144 9098213.304188509,236099.60328626778 9098216.67327648,236065.28389126598 9098318.411279341,236037.4096849346 9098432.093423758,236028.794254396 9098462.592709363,236021.2166326497 9098494.71363598,236019.68958613754 9098503.080761595,236016.4942623551 9098517.601181885,236012.84395387658 9098534.475742755,235993.04166620347 9098633.068908248,235977.44698086916 9098719.349593274))', 32750)),
    (ST_GeomFromText('MULTILINESTRING((233556.38297095476 9099323.724290801,233562.3269738232 9099216.616022807,233573.87362852105 9098978.386082903,233585.5033884102 9098794.49758481,233588.38089737872 9098741.092270087,233590.76219962677 9098704.281707767,233589.87557580415 9098690.30112194,233573.90472558874 9098488.54321991,233566.96590998577 9098415.460633583,233546.77737175772 9098281.075229272,233522.22333766392 9098109.79453063,233512.40899396746 9098047.449989371,233499.51029516128 9097964.39511532,233491.43041641725 9097918.061156034,233488.25983349985 9097904.37669058,233472.3838150241 9097814.056258356,233448.75432345952 9097735.208166515,233422.98736057477 9097659.810618926,233406.61868772324 9097611.269203601,233381.43343427835 9097530.829354959,233366.35044374428 9097470.157111062,233351.4494085245 9097404.893892834,233319.81734025932 9097279.877940439,233307.6631182427 9097223.593933519,233291.28300118278 9097156.816898309))', 32750))
  ) AS t (geom)
)
SELECT DISTINCT unnest(ARRAY[ST_GeometryN(geom, 1), ST_GeometryN(geom, 2)]) AS geom
FROM (
  SELECT ST_Boundary((ST_Dump(geom)).geom) AS geom
  FROM (
    SELECT ST_LineMerge(ST_Node(ST_Union(geom))) AS geom
    FROM network
  ) AS renoded
) AS startend

对正在做什么的一些解释:

  • 提供的样本数据存储在CTE“网络”中,其中添加了“id”列(尽管在本示例中未使用)。
  • 在最里面的子查询(名为“重新节点”)中,来自 CTE“网络”的所有几何图形都使用
    ST_Union
    进行聚合,使用
    ST_Node
    重新节点并使用
    ST_LineMerge
    进行清理。结果是单个 MultiLineString。
  • 在封装子查询(名为“startend”)中,使用
    ST_Dump
    将 MultiLineString 分解为单个 LineString,并使用
    ST_Boundary
    从每个 LineString 中提取起点和终点。这会为每个线串生成 2 点多点。
  • 在主查询中,使用
    ST_GeometryN
    提取这 2 个点并将其收集到一个数组中,使用
    unnest
    立即将其分成 2 条记录。这样做可以避免联合查询的必要性。
  • 结果将包含重复点,因此主查询使用
    SELECT DISTINCT
© www.soinside.com 2019 - 2024. All rights reserved.