2016-08-22 13 views
0

EDIT zu berechnen: Git Repo für Beispieldateienhttps://github.com/tpubben/lineIntersectVersuch mehrzeilige Kreuzungen unter Verwendung von Listen von Tupeln Python

ich versuche die Linienschnittpunkte in x zu berechnen, Y-Koordinaten auf einer Reihe von einander schneidenden Linien auf Basis der Kreuzung eine durchgehende Linie aus mehreren Segmenten.

Die durchgezogene Linie durch eine Liste von Tupeln dargestellt wird, wie folgt, wobei jedes Segment mit der x beginnt/y des Endpunkts des vorherigen Segments Koordinaten:

lineA = [((x1, y1),(x2,y2)), ((x2,y2),(x3,y3))....] 

Die Kreuzungslinien in der gleichen Weise dargestellt werden, jedoch jedes eine diskrete Leitung (keine gemeinsame Punkte):

lineB = [((x1, y1),(x2,y2))...] 

I durch die durchgehende Linie (linea) und überprüfen, um zu sehen, welche kreuzenden Linien schneiden, welche Segmente von linea iterieren versuche.

Ein Beispiel Bild von dem, was die Linienkreuzungen wie hier aussehen: Crossing lines

bisher habe ich versucht, die folgenden:

from __future__ import print_function 

def newSurveys(nintyin, injectorin): 
    # pull data out of pre-prepared CSV files 
    fh = open(nintyin) 
    fho = open(injectorin) 
    rlines = fho.readlines() 
    rlines90 = fh.readlines() 

    segA = [] 
    segB = [] 
    segA90 = [] 
    segB90 = [] 

    for item in rlines: 
     if not item.startswith('M'): 
      item = item.split(',') 
      segA.append((float(item[4]),float(item[5])))#easting northing 
      segB.append((float(item[4]),float(item[5])))#easting northing 

    segB.pop(0) 
    z = len(segA)-1 
    segA.pop(z) 

    for item in rlines90: 
     if not item.startswith('N'): 
      item = item.split(',') 
      segA90.append((float(item[1]),float(item[0])))#easting northing 
      segB90.append((float(item[3]),float(item[2])))#easting northing 

    activeWellSegs = [] 
    injector90Segs = [] 

    for a, b in zip(segA, segB): 
     activeWellSegs.append((a,b)) 

    for c, d in zip(segA90, segB90): 
     injector90Segs.append((c,d)) 


    if len(activeWellSegs) >= len(injector90Segs): 
     lineA = activeWellSegs 
     lineB = injector90Segs 
    else: 
     lineA = injector90Segs 
     lineB = activeWellSegs 


    for l1 in lineA:   
     for l2 in lineB: 
      ##### Use differential equation to calculate line intersections, 
      ##### taken from another user's post  
      def line_intersection(line1, line2): 
       xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0]) 
       ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) 

       def det(a, b): 
        return a[0] * b[1] - a[1] * b[0] 

       div = det(xdiff, ydiff) 
       if div == 0: 
        raise Exception('lines do not intersect') 

       d = (det(*line1), det(*line2)) 
       x = det(d, xdiff)/div 
       y = det(d, ydiff)/div 
       return x, y 

      print (line_intersection(l1, l2), file=lprint) 



    newSurveys('producer90.csv', 'injector.csv') 
+3

Sie haben das versucht und ...? Was ist die eigentliche Frage? Ich habe wenig Motivation, Testdaten zu generieren, Code auszuführen und dann * rate *, was deine Frage ist. Was ist das Problem mit deinem Code? Einige tatsächliche Testdaten mit erwarteter Ausgabe wären nett. –

+0

Wollen Sie wirklich, dass die Definition von 'line_intersection' innerhalb der Schleife liegt? –

+0

Ich bin ziemlich neu dazu ... mein Arbeitgeber hat mich sozusagen ins Feuer geworfen, weil ich etwas Erfahrung mit HTML und CSS habe (anscheinend Markup-Sprachen == Programmierung). Ich weiß nicht, ob ich das in einer verschachtelten Schleife will, leistungsmäßig ist es wahrscheinlich suboptimal, aber rohe Leistung spielt wahrscheinlich keine Rolle. Wie kann ich die Testdateien für Sie anhängen, die akzeptabel sind? – haplessgeo

Antwort

-1

Ihr Code sieht aus wie es ist mit einem bestimmten Satz von Umgang Daten (dh ich habe keine Ahnung, worauf sich "startsWith ('N')" und dergleichen beziehen), daher kann ich diese Frage nur abstrakt beantworten.

Versuchen Sie, den Code in mehrere Funktionen aufzuteilen, die eine bestimmte Aufgabe erledigen, anstatt eine große Funktion, die alles versucht. Sie werden es viel einfacher finden, mit zu arbeiten und Fehler zu beheben.

def getScalar(lineSegment): 
    return (lineSegment[1][0] - lineSegment[0][0], 
      lineSegment[1][1] - lineSegment[0][1]) 

def doTheyIntersect(lineA, lineB): 
    scalarA = getScalar(lineA) 
    scalarB = getScalar(lineB) 

    s = (-1.0 * scalarA[1] * (lineA[0][0] - lineB[0][0]) + scalarA[0] * (lineA[0][1] - lineB[0][1]))/(-1.0 * scalarB[0] * scalarA[1] + scalarA[0] * scalarB[1]) 
    t = (scalarB[0] * (lineA[0][1] - lineB[0][1]) - scalarB[1] * (lineA[0][0] - lineB[0][0]))/(-1.0 * scalarB[0] * scalarA[1] + scalarA[0] * scalarB[1]) 

    if 0.0 <= s <= 1.0 and 0.0 <= t <= 1.0: 
     return True 
    else: 
     return False 

lineA = [(x, y), (x1, y1), ...] 
lineB = [(x, y), (x1, y1), ...] 

for index, segment in enumerate(lineA): 
    if index + 1 < len(lineA): 
     for index2 in range(0, len(lineB), 2): 
      if doTheyIntersect((lineA[index], lineA[index + 1]), (lineB[index2], lineB[index2+1])): 
       print("lineB ({0}, {1}) intersects lineA at ({2}, {3})".format(str(lineB[index2]),str(lineB[index2+1]), str(lineA[index]), str(lineA[index + 1])) 

Dies ist die allgemeine Idee. Ich habe die Geometrie Formeln aus:

How do you detect where two line segments intersect?

+0

Danke für die Rückmeldung an mich. Ich arbeite meinen Kopf durch das, was du gepostet hast, und ich renne in eine Straßensperre. Nachdem ich die (bemerkenswert wenigen) Syntaxfehler behoben habe, bekomme ich eine Traceback, die mir sagt, dass Ihre getScalar-Funktion nicht mit Tupeln funktioniert. FYI, danke für die Erinnerung daran, es in Funktionen zu brechen, viel einfacher zu lesen. – haplessgeo

+0

Für die Funktion getScalar muss ein Tupeltupel (z. B. ((1,2), (2,3))) übergeben werden, wobei jedes Tupel einen Punkt des Liniensegments darstellt. Es gab noch ein paar andere Fehler, die mir auffielen: Ich habe vergessen, Klammern für s und t um den Zähler zu setzen, der erste Wert in der t-Formel sollte skalarB [0] sein, die if-Anweisung verwendet "> =" anstelle von "<=" , und die print-Anweisung am Ende verwendet die falsche Formatierungssyntax. Ich werde diese im ursprünglichen Beispiel korrigieren. – TripleD

Verwandte Themen