geologyidea.com
Viac

Zistite bod, ktorý spadá medzi dve rovnobežné čiary

Zistite bod, ktorý spadá medzi dve rovnobežné čiary


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


V ArcGIS sa stretávam s jedným problémom. Pracujem na navigačnej databáze. V našej databáze sú jednoprúdové ulice predstavované jednou čiarou, zatiaľ čo viacpruhové ulice (ulica s rozdeľovačom v strede) sú znázornené dvoma rovnobežnými čiarami (na obrázku červeno zafarbené čiary).

Mám bodový tvarový súbor s niektorými bodmi padajúcimi do ulice multi-Lane a niektorými von.

Chcem vytvoriť skript ArcPy, ktorý by našiel body, ktoré spadajú do viacprúdových ulíc. teda medzi týmito rovnobežnými čiarami (vyznačené na obrázku).

Neviem, ako to dosiahnuť. Môže mi niekto pomôcť?

Urobil som na tom nejaké cvičenie a zistil som, že vytváranie medzipamäte na jednej strane čiary môže vytvoriť vnútri viacprúdového polygónu (zobrazené na obrázku).

ale teraz je problém, že mnohouholník v skutočnosti prekračuje čiaru (tj. prekrýva viacprúdovú hranicu). tak chytí zbytočné body. existuje nejaký spôsob, ako tento polygón zarovnať s uličnou čiarou?

Poznámka: integrácia tu nebude fungovať, pretože tiež posúva uličnú čiaru. Potrebujem len zarovnať mnohouholník pozdĺž čiary ulice.


Skúsil by som pod arcpy (aj manuálnym!) Algoritmom -

  1. Nájdite správnu šírku dvoch jazdných pruhov - tu budete pravdepodobne potrebovať zoskupiť ulice s rovnakou šírkou a postupujte podľa nižšie uvedeného postupu pre každú zhluk.
  2. Vytvorte nárazník obidvoch línií v oboch smeroch (vpravo a vľavo) s touto šírkou (alebo o niečo menšou, ako je táto - aby ste zaistili plochu cesty).
  3. Spustením nástroja Križovatka získate prekrývajúcu sa oblasť.
  4. Spustiť Výber podľa umiestnenia vyberte body, ktoré spadajú do tohto mnohouholníka.

Povedal by som, že toto je geometrické cvičenie.

KÓD PSEUDO:

  • Pre každý bod (čierny bod) vyhľadajte najbližšiu cestu a nájdite priemet bodu na túto cestu (červený bod).
  • Nakreslite krátku čiaru (prerušovanú) v opačnom smere a začnite od čierneho bodu
  • Zistite, či existuje križovatka medzi krátkou čiarou a rovnakou cestou, modrou hviezdou. Ak existuje, čierny bod je ten, za ktorým ideme.

Ako vidno, existujú špeciálne prípady - zakrúžkované čierne body:

  1. Veľmi krútivá cesta jednej línie. To je možné vylúčiť a) prácou iba s 2 líniovými cestami alebo b) zaistením toho, aby FID ciest, ktoré pretínajú červenú bodku a hviezdu, boli odlišné. Ak je však na ostrej ceste križovatka s ďalšou líniovou cestou, nemusí to fungovať.
  2. Čierny bod sedí na predĺžení presne kolmej cesty 1. V takom prípade existuje šanca, že ako najbližší sused môžete zvoliť 1 jazdnú cestu.
  3. Na čiare sedí čierny bod.

Všetky vyššie uvedené prípady sú veľmi nepravdepodobné, napriek tomu sa zdá, že najbezpečnejšou možnosťou je pracovať iba s 2 líniovými cestami, t. J. Exportovať ich do samostatnej triedy prvkov. Prípad 3 je zábavný, necháme ho na náhodu, pretože najkratšia vzdialenosť od priamky nie je nikdy skutočná nula, takže možno nájsť „opačný“ smer lúča spájajúceho 2 body.

Implementácia Pythonu:

import arcpy, traceback, os, sys z arcpy import env env.overwriteoutput = True # vecí na zmenu --------- maxD = 30 mxd = arcpy.mapping.MapDocument ("AKTUÁLNY") pointLR = arcpy.mapping .ListLayers (mxd, "NODES") [0] lineLR = arcpy.mapping.ListLayers (mxd, "LINKY") [0] sjOneToMany = r'D:  scratch  sj2.shp 'RDNAME = "ulica" # - ----------------------- dDest = arcpy.Describe (lineLR) SR = dDest.spatialReference try: def showPyMessage (): arcpy.AddMessage (str (čas .ctime ()) + "-" + správa) g = arcpy.Geometry () geometryList = arcpy.CopyFeatures_management (pointLR, g) n = len (geometryList) endPoint = arcpy.Point () arcpy.SpatialJoin_analysis (pointLR, lineLR, sjOneToMany, "JOIN_ONE_TO_MANY", "KEEP_COMMON", "", "WITHIN_A_DISTANCE", maxD) initFidList = (- 1,) pre fid v rozsahu (n): TARGET_FID "=% s"% str (fid) nearTable = arcpy.da .TableToNumPyArray (sjOneToMany, ("TARGET_FID", "JOIN_FID"), dotaz), ak len (nearTable) <2: continue fidLines = [int (riadok [1]) pre riadok v nearTable] FID "v% s"% str ( n-tica (fidLines)) listOfLines = {} blackPoint = geometryLis t [fid] s arcpy.da.SearchCursor (lineLR, ("FID", "Shape @", "STREET"), dopyt) ako riadky: dMin = 100000 pre riadok v riadkoch: shp = riadok [1]; dCur = blackPoint.distanceTo (shp) listOfLines [riadok [0]] = riadok [-2:], ak dCur

Existuje ďalšie možné riešenie, možno elegantnejšie. Zahŕňa to trianguláciu. Dajte mi vedieť, ak to má záujem, a aktualizujem svoju odpoveď


Pretože sú ulice paralelné, predpokladal som, že boli vytvorené sKopírovať paralelnenástroj na paneli nástrojov Upraviť, čím sa dvojica riadkov bude riadiť rovnakým smerom. Potom môžeme iterovať cez súradnice prvého riadku a pridať ich do mnohouholníka a potom iterovať nad obrátiť druhého riadku. Určite existuje lepší spôsob, ako sa priblížiť k párom čiar; prístup OID funguje, ale nie je to veľmi pekné.

import zbierok import arcpy FC = "fc" points = "points" pgons = "pgons" arcpy.env.overwriteOutput = True def buildpoly (oid_coords): #create ddict formulára OID: ddict = collections.defaultdict (zoznam) pre k, v v oid_coords: ddict [k] .append (v) line1, line2 = ddict.keys () # Predpokladajme, že paralelné čiary majú rovnaký smer, preto obráťte druhú arr = arcpy .Array () arr.extend (arcpy.Point (* pt) pre pt v ddict [line1]) arr.extend (arcpy.Point (* pt) pre pt v ddict [line2] [:: - 1]) návrat arcpy .Polygon (arr) #id je celé číslo, ktoré páruje paralelné čiary dohromady unique = list (set (t [0] for t in arcpy.da.SearchCursor (FC, "id"))) polygons = [] for uni in unique: polygons.append (buildpoly ([r pre r v rade) pre riadok v arcpy.da.SearchCursor (FC, ["OID @", "SHAPE @ XY"], "id = {}". format (uni) , explode_to_points = True))) arcpy.CopyFeatures_management (polygóny, pgóny)

Odtiaľ je to hovor Intersect / Select Layer by location / what you have. Všimnite si, žeSpolygón nie je dokonalý, pretože som ho nakreslil od ruky a sú nejaké oblúky, ktoréexplode_to_pointsnespracováva správne. Proste bež Zahustiť alebo ekvivalent.