1 votos

Cómo convertir db.ListProperty(GeoPt) a GeoJSON Polígono

Mi aplicación Python Google App Engine (¿sin etiqueta?) tiene un modelo de almacén de datos de un Área de Interés, simplificado como

import geojson
class AreaOfInterest(db.Model):
    name = db.StringProperty(required=True)
    #Geometry of area boundary
    coordinates = db.ListProperty(db.GeoPt, default=None) #convex polygon without holes

Deseo exportar esto como GeoJSON, pero no estoy seguro de una manera (preferiblemente Pythonic) para convertir la Lista de GeoPt a un objeto geojson.Polygon. Aunque puedo convertir a una matriz de puntos con

coords = []
for c in self.coordinates:
    p = geojson.Point((c.lat, c.lon))
    coords.append(p)

Deseo incrustar un polígono en un GeoJson FeatureCollection así:

def geojsonArea(self):
    polygon = geojson.Polygon((self.coordinates)) 
    #ValueError: Expect __geo_interface__' or a mapping, got datastore_types.GeoPt
    geojson_obj =   { 
        "type": "FeatureCollection",
        "area_name" :self.name,
        "features": [
          { "type": "Feature",
             "geometry": {
               "type": "Polygon",
               "coordinates": polygon
             },
             "properties": {
                "name": "boundary"
           }
        }
        ]
    }
    return geojson.dumps(geojson_obj)

Pero el llamamiento a geojson.Polygon espera algo como Polígono([[(2,38, 57,322), (23,194, -20,28), (-120,43, 19,15), (2,38, 57,322)]])

¿Cuál es la forma más limpia de hacer esta conversión? ¿Es posible sin recorrer la lista mientras se construye una cadena para pasarla a Polygon()?

1voto

sargant Puntos 116

Puede que no sea la solución más pitónica, pero funciona. La cadena resultante cumple http://geojsonlint.com/ .

def geojsonArea(self):
    coords = []
    for c in self.coordinates:
        p = {'lat': c.lat, 'lng': c.lon}
        coords.append(p)

    geojson_obj =   { 
        "type": "FeatureCollection",
        "area_name" :self.name,
        "features": [
          { "type": "Feature",
             "geometry": {
                 "type": "Polygon", 
                 "coordinates" : coords
            },
             "properties": {
                "name": "boundary"
           }
        }
        ]
    }
    return geojson.dumps(geojson_obj)

Convertir un db.GeoPt en un Punto tiene una sintaxis diferente a Polígono.

map_center = db.GeoPtProperty()     

def geojsonArea(self):
    center = []
    center.append(geojson.Point({'lat': self.map_center.lat, 'lng': self.map_center.lon}))
    #... 
    { 
      "type": "ViewPort",
      "geometry": center, 
    }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X