Skip to content

mygeopackage module

Main module.

Geo

__init__(self, uri, request=True, x=None, y=None, header=False, output_geojson=None, file_type='geojson') special

Instantiate the GEO object.

Parameters:

Name Type Description Default
uri string

Local or online URI for GeoJson data.

required
request bool

If set to true, the program will request the data online from the given URL, and save it in local folder. Defaults to True.

True
file_type str

If the value is set to 'geojson', then the function will call GeoJsonToArray(). If the value is set to 'shp', then the function will call ShpToArray(). Defaults to 'geojson'.

'geojson'
x str

Field name for X in csv.

None
y str

Field name for Y in csv.

None
header bool

Whether csv file contains a header. Defaults to True.

False
output_geojson str,optional

File path to output geojson for csv.

None
Source code in mygeopackage/mygeopackage.py
def __init__(self,uri,request=True,x=None,y=None,header=False,output_geojson=None,file_type='geojson'):
    """Instantiate the GEO object.

    Args:
        uri (string): Local or online URI for GeoJson data.
        request (bool, optional): If set to true, the program will request the data online from the given URL, and save it in local folder. Defaults to True.
        file_type (str, optional): If the value is set to 'geojson', then the function will call GeoJsonToArray(). If the value is set to 'shp', then the function will call ShpToArray(). Defaults to 'geojson'.
        x (str, optional): Field name for X in csv.
        y (str, optional): Field name for Y in csv.
        header (bool, optional): Whether csv file contains a header. Defaults to True.
        output_geojson (str,optional): File path to output geojson for csv.
    """
    self.uri = uri
    if file_type == 'geojson':
        self.GeojsonToArray(request)
    if file_type == 'shp':
        self.ShpToArray()
    if file_type == 'csv':
        self.CsvToArray(x,y,header,output_geojson)

CsvToArray(self, x, y, header, output_geojson=None)

Convert Csv to array.

Parameters:

Name Type Description Default
x str

Field name for X in csv.

required
y str

Field name for Y in csv.

required
header bool

Whether csv file contains a header. Defaults to True.

required
output_geojson str,optional

File path to output geojson for csv. Defaults to None.

None
Source code in mygeopackage/mygeopackage.py
def CsvToArray(self,x,y,header,output_geojson=None):
    """Convert Csv to array.

    Args:
        x (str): Field name for X in csv.
        y (str): Field name for Y in csv.
        header (bool, optional): Whether csv file contains a header. Defaults to True.
        output_geojson (str,optional): File path to output geojson for csv. Defaults to None.
    """
    with open(self.uri,'r',encoding='utf8') as csvfile:
        reader = csv.reader(csvfile,delimiter=',')
        i = 0
        geojson = dict()
        geojson['type'] = 'FeatureCollection'
        geojson['features'] = []
        for row in reader:
            if i == 0:
                if header == True:
                    fields = row
                    x_index = fields.index(x)
                    y_index = fields.index(y)
                else:
                    fields = ['Field_'+ str(i) for i in range(len(row))+1]
                i += 1
            else:
                record = dict()
                record['type'] = 'Feature'
                record['properties'] = dict(zip(fields,row))
                record['geometry'] = dict()
                record['geometry']['type'] = 'Point'
                record['geometry']['coordinates'] = [row[x_index],row[y_index]]
                geojson['features'].append(record)


        if os.path.exists(r'data/json_to_load_from_csv.geojson') == True:
            os.remove(r'data/json_to_load_from_csv.geojson')
        with open(r'data/json_to_load_from_csv.geojson','w') as f:                
            json.dump(geojson,f)

        if output_geojson is not None:
            with open(output_geojson,'w') as f:
                json.dump(output_geojson,f)
        self.uri = r'data/json_to_load_from_csv.geojson'
        self.GeojsonToArray(request=False)

GeojsonToArray(self, request=True)

Convert GeoJson data to numpy array.

Parameters:

Name Type Description Default
request bool

If set to true, the program will request the data online from the given URL, and save it in local folder. Defaults to True.

True
Source code in mygeopackage/mygeopackage.py
def GeojsonToArray(self,request=True):
    """Convert GeoJson data to numpy array.

    Args:
        request (bool, optional): If set to true, the program will request the data online from the given URL, and save it in local folder. Defaults to True.
    """
    if os.path.exists(r'data/json_to_load.geojson') == True:
        os.remove(r'data/json_to_load.geojson')

    file_source = ''
    if request == True:
        response = requests.get(self.uri)
        file_source = r'data/json_to_load.geojson'
        with open(file_source,'w') as f:
            json_data = json.loads(response.text)
            json.dump(json_data,f)
    else:
        file_source = self.uri

    with open(file_source) as f:
        data = json.load(f)
        if 'crs' in data:
            crs = data['crs']['properties']['name']
            self.crs = crs
        fields = list(data['features'][0]['properties'].keys())
        arr_list = []
        for feature in data['features']:
            arr_list.append((feature['geometry']['coordinates'][0],feature['geometry']['coordinates'][1],*list(feature['properties'].values())))
        arr = np.array(arr_list)

        self.attributes = fields
        self.data = arr

show(self, map=None, top=0, kernel='folium')

Draw the class object on the map with Folium.

Parameters:

Name Type Description Default
map Folium map object

If set to None, the function will create a new map object. If given the map object, the layer will be drawn on the map. Defaults to None.

None
top int

The top number of records will be drawn on map. If top is set to 0, then all records will be drawn. Defaults to 0.

0
Source code in mygeopackage/mygeopackage.py
def show(self, map=None, top = 0, kernel = 'folium'):
    """Draw the class object on the map with Folium.

    Args:
        map (Folium map object, optional): If set to None, the function will create a new map object. If given the map object, the layer will be drawn on the map. Defaults to None.
        top (int): The top number of records will be drawn on map. If top is set to 0, then all records will be drawn. Defaults to 0.
    """
    if top != 0:
        data = self.data[0:top]
    else:
        data = self.data
    if map == None:

        if kernel == 'folium':
            m = folium.Map(location=[data[0][1],data[0][0]])
            for record in data:
                folium.Marker([record[1],record[0]]).add_to(m)
            display(m)
        if kernel == 'ipyleaflet':
            m = ipyleaflet.Map(center=[data[0][1],data[0][0]])
            markers = []
            for record in data:
                marker = ipyleaflet.Marker(location=([record[1],record[0]]))
                markers.append(marker)
            layer_group = ipyleaflet.LayerGroup(layers=(markers))
            m.add_layer(layer_group)
    else:
        markers = []
        for record in data:
            if kernel == 'folium':
                folium.Marker([record[1],record[0]]).add_to(map)
            if kernel == 'ipyleaflet':
                marker = ipyleaflet.Marker(location=([record[1],record[0]]))
                markers.append(marker)
        layer_group = ipyleaflet.LayerGroup(layers=(markers))
        map.add_layer(layer_group)

ShpToArray(self)

Convert ESRI shapefile to numpy array.

Source code in mygeopackage/mygeopackage.py
def ShpToArray(self):
    """Convert ESRI shapefile to numpy array.
    """
    if os.path.exists(self.uri):
        sf = shapefile.Reader(self.uri)
        geo_json = sf.__geo_interface__
        if os.path.exists(r'data/json_to_load_from_shp.geojson') == True:
            os.remove(r'data/json_to_load_from_shp.geojson')
        with open(r'data/json_to_load_from_shp.geojson','w') as f:                
            json.dump(geo_json,f)
        self.uri = r'data/json_to_load_from_shp.geojson'
        self.GeojsonToArray(request=False)

ToShp(self, out)

Convert Geo class to shapefile.

Parameters:

Name Type Description Default
out str

File path to save shp.

required
Source code in mygeopackage/mygeopackage.py
def ToShp(self,out):
    """Convert Geo class to shapefile.

    Args:
        out (str): File path to save shp.
    """
    w = shapefile.Writer(out)
    for field in self.attributes:
        w.field(field,'C')
    for row in self.data:
        w.record(row[2:])
        w.point(float(row[0]),float(row[1]))

    w.close()

Map

__init__(self, **kwargs) special

Map class

Source code in mygeopackage/mygeopackage.py
def __init__(self,**kwargs):
    """Map class
    """
    if "center" not in kwargs:
        kwargs["center"] = [40,-100]
    if "zoom" not in kwargs:
        kwargs['zoom'] = 4
    if "scroll_wheel_zoom" not in kwargs:
        kwargs["scroll_wheel_zoom"] = True

    super().__init__(**kwargs)

    if "height" not in kwargs:
        self.layout.height = "600px"
    else:
        self.layout.height = kwargs['height']

    self.add_control(FullScreenControl())
    self.add_control(LayersControl(position="bottomright"))
    self.add_control(DrawControl(position="topleft"))
    self.add_control(MeasureControl())
    self.add_control(ScaleControl(position="bottomleft"))

    main_toolbar(self)

    if "google_map" not in kwargs or kwargs["google_map"] == "ROADMAP":
        layer = TileLayer(
            url="https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}",
            attribution="Google",
            name="Google Maps"
        )
        self.add_layer(layer)
    elif kwargs["google_map"] == "HYBRID":
        layer = TileLayer(
            url="https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}",
            attribution="Google",
            name="Google Satellite"
        )
        self.add_layer(layer)

    if 'in_csv' in kwargs:
        in_csv = kwargs['in_csv']
        x = kwargs['x']
        y = kwargs['y']
        header = kwargs['header']
        self.add_points_from_csv(in_csv,x,y,header)

add_points_from_csv(self, in_csv, x, y, header)

[summary]

Parameters:

Name Type Description Default
in_csv str

File path to csv file.

required
x str

Field name for X in csv.

required
y str

Field name for Y in csv.

required
header bool

Whether csv file contains a header. Defaults to True.

required
Source code in mygeopackage/mygeopackage.py
def add_points_from_csv(self,in_csv,x,y,header):
    """[summary]

    Args:
        in_csv (str): File path to csv file.
        x (str): Field name for X in csv.
        y (str): Field name for Y in csv.
        header (bool, optional): Whether csv file contains a header. Defaults to True.
    """
    with open(in_csv,encoding='utf8') as csvfile:
        reader = csv.reader(csvfile,delimiter=',')
        i = 0
        markers = []
        for row in reader:
            if i == 0:
                if header == True:
                    fields = row
                    x_index = fields.index(x)
                    y_index = fields.index(y)
                i += 1
            else:
                markers.append(ipyleaflet.Marker(location=(row[y_index],row[x_index])))
        marker_cluster = ipyleaflet.MarkerCluster(markers=markers)
        self.add_layer(marker_cluster)

Last update: 2021-05-03