Example #1
0
def main(*args):
  # Test pq con original phrase no funciona
  store = gvsig.currentLayer().getFeatureStore()
  dm = DALLocator.getDataManager()
  filterExpression = ExpressionEvaluatorLocator.getManager().createExpression()
  filterExpression.setPhrase("")
  spatialGeometry = geom.createGeometryFromWKT("POLYGON ((-74.26662451007567 40.497289998, -74.26662451007567 40.517289997999995, -74.24930400199999 40.527289998, -74.2319834939243 40.517289997999995, -74.2319834939243 40.497289998, -74.24930400199999 40.487289997999994, -74.26662451007567 40.497289998))")
  spatialGeometry.setProjection(gvsig.currentLayer().getProjection())
  
  ## store, exp, spatialGeometry
  print "Spatial"
  builder = ExpressionEvaluatorLocator.getManager().createExpressionBuilder()
  """
  expr1 = builder.and(
      builder.custom(exp.getPhrase()),
      builder.ST_Intersects(
        builder.geometry(spatialGeometry),
        builder.column("GEOMETRY")
      )
  ).toString()
  """
  expr1 = builder.ST_Intersects(
      builder.geometry(spatialGeometry),
      builder.column("GEOMETRY")
    ).toString()
  ## Creating new expression
  eva = ExpressionEvaluatorLocator.getManager().createExpression()
  eva.setPhrase(expr1)
  evaluator = DALLocator.getDataManager().createExpresion(eva)
  
  # Query
  fq = store.createFeatureQuery()
  fq.addFilter(evaluator)
  fq.retrievesAllAttributes()
  fset = store.getFeatureSet(fq)
  print "SIZE: ",fset.getSize()

  ### Reusing expression
  
  cloneExpression = filterExpression.clone()
  print "not cloning"
  cloneExpression.setPhrase(expr1)
  evaluator = DALLocator.getDataManager().createExpresion(cloneExpression)
  
  ## Query
  fq = store.createFeatureQuery()
  fq.addFilter(evaluator)
  fq.retrievesAllAttributes()
  fset = store.getFeatureSet(fq)
  print "SIZE: ",fset.getSize()
def loadLayerFromJSON(jsonlayer):
    store = createMemoryStore()
    if not store.isEditing(): store.edit()
    f = store.createNewFeature()
    jsonfeatures = jsonlayer.getJSONArray("features")
    ftype = store.getDefaultFeatureType()
    geomAttributeName = ftype.getDefaultGeometryAttributeName()
    for jsonfeature in jsonfeatures:
        f = store.createNewFeature()
        for key in jsonfeature.keys():
            value = jsonfeature.get(key)
            if key == geomAttributeName:
                if value != "":
                    wktGeom = createGeometryFromWKT(value)
                else:
                    wktGeom = None
                f.set(key, wktGeom)
            else:
                f.set(key, value)
        store.insert(f)
    return store
Example #3
0
def main2(*args):
  store = gvsig.currentLayer().getFeatureStore()
  dm = DALLocator.getDataManager()
  i="True"
  evaluator = dm.createExpresion(i)
  fq = store.createFeatureQuery()
  fq.addFilter(evaluator)
  fq.retrievesAllAttributes()
  fset = store.getFeatureSet(fq)
  count = 0
  for f in fset:
    count+=1
  print count
  ###
  print "Spatial"
  spatialGeometry = geom.createGeometryFromWKT("POLYGON ((-74.26662451007567 40.497289998, -74.26662451007567 40.517289997999995, -74.24930400199999 40.527289998, -74.2319834939243 40.517289997999995, -74.2319834939243 40.497289998, -74.24930400199999 40.487289997999994, -74.26662451007567 40.497289998))")
  spatialGeometry.setProjection(gvsig.currentLayer().getProjection())
  builder = ExpressionEvaluatorLocator.getManager().createExpressionBuilder()
  expr1 = builder.and(
      builder.custom(i),
      builder.ST_Intersects(
        builder.geometry(spatialGeometry),
        builder.column("GEOMETRY")
      )
  ).toString()
  eva = ExpressionEvaluatorLocator.getManager().createExpression()
  eva.setPhrase(expr1)
  
  evaluator = DALLocator.getDataManager().createExpresion(eva)
  fq = store.createFeatureQuery()
  fq.addFilter(evaluator)
  fq.retrievesAllAttributes()
  fset = store.getFeatureSet(fq)
  count = 0
  for f in fset:
    count+=1
  print count
    def execute(self, rule, line, parameters):
        #TopologyRule rule, TopologyReportLine line, DynObject parameters
        try:

            #logger("2", LOGGER_INFO)
            dataSet = rule.getDataSet1()

            while True:
                try:
                    d = float(
                        commonsdialog.inputbox("Enter a distance",
                                               title="",
                                               messageType=IDEA,
                                               initialValue="",
                                               root=None))
                    print "Dialog box: ", d
                    if d == 0:
                        print "entra en d=0"
                        envelope = dataSet.getFeatureStore().getEnvelope()

                        if envelope is not None or not envelope.isEmpty():
                            print "entra en if del envelope"
                            d = envelope.getLowerCorner().distance(
                                envelope.getUpperCorner())
                            print d
                        else:
                            print "entra al else del raise"
                            raise Throwable("Not valid envelope")
                    break
                except ValueError:
                    print("The entered values are not correct. Try again")

            vertexError = geom.createGeometryFromWKT(line.getData())
            print vertexError

            reference = line.getFeature1()
            feature1 = reference.getFeature()
            lineToSnap = feature1.getDefaultGeometry()

            geoManager = GeometryLocator.getGeometryManager()
            subtype = lineToSnap.getGeometryType().getSubType()
            snappedLine = geoManager.createLine(subtype)

            numVertex = lineToSnap.getNumVertices()

            store = dataSet.getFeatureStore()
            features = store.getFeatureSet()

            distance = float('inf')
            for feature in features:
                otherLine = feature.getDefaultGeometry()
                print feature.Name

                if not vertexError.intersects(otherLine):
                    dist = vertexError.distance(otherLine)

                    if dist < distance:
                        distance = dist
                        geoNearest = otherLine
                        featureToEdit = feature
                        print distance
                        geoName = feature.Name

            print "nearest geometry ", geoName

            numVertexOtherLine = geoNearest.getNumVertices()
            print numVertexOtherLine

            def segmentNearest(geometry, numVertexLine):
                disToSegment = float('inf')
                for i in range(0, numVertexLine - 1):
                    print "index ", i
                    vertex1 = geometry.getVertex(i)
                    vertex2 = geometry.getVertex(i + 1)
                    segment = geoManager.createLine(subtype)
                    segment.addVertex(vertex1)
                    segment.addVertex(vertex2)
                    print segment.getNumVertices()

                    dToSegment = vertexError.distance(segment)

                    if dToSegment < disToSegment:
                        disToSegment = dToSegment
                        segmentNearest = segment
                        numSegment = i + 1
                        print disToSegment

                return disToSegment, segmentNearest

            #disToSegment = float('inf')
            if GeometryUtils.isSubtype(geom.MULTICURVE,
                                       geoNearest.getGeometryType().getType()):
                for x in range(0, geoNearest.getNumPrimitives()):
                    geox = geoNearest.getPrimitiveAt(x)
                    numVertexMulti = geox.getNumVertices()
                    disToSegment, segmentNearest = segmentNearest(
                        geox, numVertexMulti)
            else:
                disToSegment, segmentNearest = segmentNearest(
                    geoNearest, numVertexOtherLine)

            #print "Segment nearest is ", numSegment
            print "Distance nearest to segment is ", disToSegment

            dToVertex1 = vertexError.distance(segmentNearest.getVertex(0))
            print "dToVertex1 ", dToVertex1
            dToVertex2 = vertexError.distance(segmentNearest.getVertex(1))
            print "dToVertex2 ", dToVertex2

            perpendicular = False

            if dToVertex1 < d or dToVertex2 < d:
                if dToVertex1 < dToVertex2:
                    vertex = segmentNearest.getVertex(0)
                    print "vertex 1"
                elif dToVertex1 > dToVertex2:
                    vertex = segmentNearest.getVertex(1)
                    print "vertex 2"
                elif dToVertex1 == dToVertex2:
                    vertex = segmentNearest.getVertex(0)
                    print "vertex 1"
            elif disToSegment < d:
                perpendicular = True
                print "perpendicular"

                Iy = segmentNearest.getVertex(
                    1).getY() - segmentNearest.getVertex(0).getY()
                Ix = segmentNearest.getVertex(
                    1).getX() - segmentNearest.getVertex(0).getX()

                if Ix == 0:
                    slope1 = float('inf')
                else:
                    slope1 = Iy / Ix

                b1 = segmentNearest.getVertex(
                    0).getY() - slope1 * segmentNearest.getVertex(0).getX()
                print "straight line 1"
                print slope1, b1

                if slope1 == 0:
                    slope2 = float('-inf')
                else:
                    slope2 = -(1 / slope1)

                b2 = vertexError.getY() - slope2 * vertexError.getX()

                print "straight line 2"
                print slope2, b2

                x = (b2 - b1) / (slope1 - slope2)
                if math.isnan(x):
                    if slope1 == 0:
                        x = vertexError.getX()
                    elif slope1 == float('inf'):
                        x = segmentNearest.getVertex(0).getX()
                print "x", x
                y = slope1 * x + b1
                if math.isnan(y):
                    y = vertexError.getY()
                print "y", y

                vertex = createPoint(subtype, x, y)
                print vertex

            else:
                vertex = None

            if vertex != None:
                if lineToSnap.getVertex(0) == vertexError:
                    print "start"
                    #      if typeLine == "start":
                    snappedLine.addVertex(vertex)

                for i in range(0, numVertex):
                    print i
                    if lineToSnap.getVertex(i) == vertexError:
                        print "continue"
                        continue
                    else:
                        print "else"
                        snappedLine.addVertex(lineToSnap.getVertex(i))
                        print snappedLine.getNumVertices()

                if lineToSnap.getVertex(numVertex - 1) == vertexError:
                    print "end"
                    #      if typeLine == "end":
                    snappedLine.addVertex(vertex)

                #print "update lineToSnap"
                #feature1 = feature1.getEditable()
                #feature1.set("GEOMETRY", snappedLine)
                #dataSet.update(feature1)

                if perpendicular == True:
                    subtype = geoNearest.getGeometryType().getSubType()
                    intersectedLine = geoManager.createLine(subtype)
                    for i in range(0, geoNearest.getNumVertices() - 1):
                        vertex1 = geoNearest.getVertex(i)
                        vertex2 = geoNearest.getVertex(i + 1)
                        segment = geoManager.createLine(subtype)
                        segment.addVertex(vertex1)
                        segment.addVertex(vertex2)
                        print segment.getNumVertices()

                        if vertex.intersects(segment):
                            print "intersecta"
                            intersectedLine.addVertex(vertex1)
                            intersectedLine.addVertex(vertex)
                            intersectedLine.addVertex(vertex2)
                        else:
                            print "no intersecta"
                            intersectedLine.addVertex(vertex1)
                            intersectedLine.addVertex(vertex2)

                    print "update intersectedLine"
                    print intersectedLine.getNumVertices()
                    featureToEdit = featureToEdit.getEditable()
                    featureToEdit.set("GEOMETRY", intersectedLine)
                    dataSet.update(featureToEdit)

                print "update lineToSnap"
                feature1 = feature1.getEditable()
                feature1.set("GEOMETRY", snappedLine)
                dataSet.update(feature1)

            else:
                print "It can't snap"

        except:
            ex = sys.exc_info()[1]
            print "Error", ex.__class__.__name__, str(ex)
Example #5
0
    def execute(self, rule, line, parameters):
        #TopologyRule rule, TopologyReportLine line, DynObject parameters
        try:

            dataSet = rule.getDataSet1()

            while True:
                try:
                    d = float(
                        commonsdialog.inputbox("Enter a distance",
                                               title="",
                                               messageType=IDEA,
                                               initialValue="",
                                               root=None))
                    if d == 0:
                        envelope = dataSet.getFeatureStore().getEnvelope()

                        if envelope is not None or not envelope.isEmpty():
                            d = envelope.getLowerCorner().distance(
                                envelope.getUpperCorner())
                        else:
                            raise Throwable("Not valid envelope")
                    break
                except ValueError:
                    print("The entered values are not correct. Try again")

            vertexError = geom.createGeometryFromWKT(line.getData())

            reference = line.getFeature1()
            feature1 = reference.getFeature()
            lineToTrim = feature1.getDefaultGeometry()

            geoManager = GeometryLocator.getGeometryManager()
            subtype = lineToTrim.getGeometryType().getSubType()
            trimmedLine = geoManager.createLine(subtype)

            numVertex = lineToTrim.getNumVertices()

            store = dataSet.getFeatureStore()
            features = store.getFeatureSet()

            distance = float('inf')
            for feature in features:
                otherLine = feature.getDefaultGeometry()
                print feature.Name

                if (lineToTrim.intersects(otherLine)
                        and not lineToTrim.equals(otherLine)):
                    iP = lineToTrim.intersection(otherLine)
                    dist = vertexError.distance(iP)

                    if dist < distance:
                        distance = dist
                        intersectionPoint = iP

            print "final intersection ", intersectionPoint

            if lineToTrim.getVertex(0) == vertexError:
                #typeLine == "start"
                trimmedLine.addVertex(intersectionPoint)

            for i in range(0, numVertex):
                if lineToTrim.getVertex(i) == vertexError:
                    continue
                else:
                    trimmedLine.addVertex(lineToTrim.getVertex(i))

            if lineToTrim.getVertex(numVertex - 1) == vertexError:
                #typeLine == "end"
                trimmedLine.addVertex(intersectionPoint)

            feature1 = feature1.getEditable()
            feature1.set("GEOMETRY", trimmedLine)
            dataSet.update(feature1)

        except:
            ex = sys.exc_info()[1]
            print "Error", ex.__class__.__name__, str(ex)
Example #6
0
    def execute(self, rule, line, parameters):
        #TopologyRule rule, TopologyReportLine line, DynObject parameters
        try:

            dataSet = rule.getDataSet1()

            while True:
                try:
                    d = float(
                        commonsdialog.inputbox("Enter a distance",
                                               title="",
                                               messageType=IDEA,
                                               initialValue="",
                                               root=None))
                    if d == 0:
                        envelope = dataSet.getFeatureStore().getEnvelope()

                        if envelope is not None or not envelope.isEmpty():
                            d = envelope.getLowerCorner().distance(
                                envelope.getUpperCorner())
                        else:
                            raise Throwable("Not valid envelope")
                    break
                except ValueError:
                    print("The entered values are not correct. Try again")

            vertexError = geom.createGeometryFromWKT(line.getData())
            print vertexError

            reference = line.getFeature1()
            feature1 = reference.getFeature()
            lineToExtend = feature1.getDefaultGeometry()

            geoManager = GeometryLocator.getGeometryManager()
            subtype = lineToExtend.getGeometryType().getSubType()
            extendedLine = geoManager.createLine(subtype)

            numVertex = lineToExtend.getNumVertices()

            if lineToExtend.getVertex(0) == vertexError:
                typeLine = "start"
                Iy = -(lineToExtend.getVertex(1).getY() -
                       lineToExtend.getVertex(0).getY())
                Ix = -(lineToExtend.getVertex(1).getX() -
                       lineToExtend.getVertex(0).getX())
            else:
                typeLine = "end"
                Iy = lineToExtend.getVertex(numVertex - 1).getY(
                ) - lineToExtend.getVertex(numVertex - 2).getY()
                Ix = lineToExtend.getVertex(numVertex - 1).getX(
                ) - lineToExtend.getVertex(numVertex - 2).getX()

            if Ix == 0 or Ix == -0:
                if Iy > 0:
                    slope = float('inf')
                else:
                    slope = float('-inf')
            else:
                slope = Iy / Ix

            if slope > 0:
                if Iy > 0:
                    ang = math.degrees(math.atan(slope))
                else:
                    ang = math.degrees(math.atan(slope)) + 180
            elif slope < 0:
                if Iy > 0:
                    ang = math.degrees(math.atan(slope)) + 180
                else:
                    ang = math.degrees(math.atan(slope)) + 360
            elif slope == 0:
                if Ix > 0:
                    ang = math.degrees(math.atan(slope))
                else:
                    ang = math.degrees(math.atan(slope)) + 180
            elif slope == float('inf'):
                ang = math.degrees(math.atan(slope))
            elif slope == float('-inf'):
                ang = math.degrees(math.atan(slope)) + 360
            print ang

            vertex = createPoint(
                subtype,
                vertexError.getX() + d * math.cos(math.radians(ang)),
                vertexError.getY() + d * math.sin(math.radians(ang)))
            print vertex

            segment = geoManager.createLine(subtype)
            segment.addVertex(vertexError)
            segment.addVertex(vertex)

            store = dataSet.getFeatureStore()
            features = store.getFeatureSet()

            distance = float('inf')
            for feature in features:
                otherLine = feature.getDefaultGeometry()
                print feature.Name

                if (segment.intersects(otherLine)
                        and not vertexError.intersects(otherLine)):
                    iP = segment.intersection(otherLine)
                    dist = vertexError.distance(otherLine)

                    if dist < distance:
                        distance = dist
                        intersectionPoint = iP

            print "final intersection ", intersectionPoint

            if typeLine == "start":
                extendedLine.addVertex(intersectionPoint)

            for i in range(0, numVertex):
                extendedLine.addVertex(lineToExtend.getVertex(i))

            if typeLine == "end":
                extendedLine.addVertex(intersectionPoint)

            feature1 = feature1.getEditable()
            feature1.set("GEOMETRY", extendedLine)
            dataSet.update(feature1)

        except:
            ex = sys.exc_info()[1]
            print "Error", ex.__class__.__name__, str(ex)