Create GeoPackage from Data Frame¶
This example shows how to create a GeoPackage (.gpkg) file from a Pandas DataFrame. A geopackage must contain at least one vector layer, but can contain multiple layers. In this example, we will create two vector layers from two data frames. To achieve this, you must first create a column containing the geometries and call it 'geom' for each dataframe. You can also add more columns, each containing additional information about the geometry in the 'geom' column. In this example, points are used as geometries. However, the next subsection introduces other types of geometry and explains how to create them.
Import Modules and Packages¶
In [1]:
Copied!
import geokit.core.srs
import geokit.core.vector
import geokit.core.geom
import pandas as pd
import numpy as np
import geokit.core.srs
import geokit.core.vector
import geokit.core.geom
import pandas as pd
import numpy as np
Create Points¶
In [2]:
Copied!
# Choose an srs for the geometries
srs = geokit.core.srs.EPSG3035
# Create random point geometries
geoms = []
for i in range(200):
geoms.append(geokit.core.geom.point(np.random.random(2), srs=srs))
# Choose an srs for the geometries
srs = geokit.core.srs.EPSG3035
# Create random point geometries
geoms = []
for i in range(200):
geoms.append(geokit.core.geom.point(np.random.random(2), srs=srs))
In [3]:
Copied!
# Create two DataFrames with column called "geom" for the geometries
df_1 = pd.DataFrame({"geom": geoms[:100]})
df_2 = pd.DataFrame({"geom": geoms[100:]})
# Create two DataFrames with column called "geom" for the geometries
df_1 = pd.DataFrame({"geom": geoms[:100]})
df_2 = pd.DataFrame({"geom": geoms[100:]})
Create DataFrames¶
In [4]:
Copied!
# Add Attributes for each geometry
size = np.random.randint(50, size=int(len(geoms) / 2))
df_1["size"] = size
df_2["size"] = size
color = [["blue", "green", "red", "yellow"][i] for i in np.random.randint(4, size=int(len(geoms) / 2))]
df_1["color"] = color
df_2["color"] = color
# Add Attributes for each geometry
size = np.random.randint(50, size=int(len(geoms) / 2))
df_1["size"] = size
df_2["size"] = size
color = [["blue", "green", "red", "yellow"][i] for i in np.random.randint(4, size=int(len(geoms) / 2))]
df_1["color"] = color
df_2["color"] = color
Show Contents of the DataFrames for clarification¶
In [5]:
Copied!
df_1.head()
df_1.head()
Out[5]:
| geom | size | color | |
|---|---|---|---|
| 0 | POINT Z (0.814925043864683 0.571753872265218 0) | 31 | green |
| 1 | POINT Z (0.610383043939744 0.000246422135748 0) | 2 | red |
| 2 | POINT Z (0.484455561206935 0.044532347003943 0) | 18 | red |
| 3 | POINT Z (0.96332158910646 0.200786793249126 0) | 12 | green |
| 4 | POINT Z (0.19420739582263 0.913033179892991 0) | 27 | blue |
In [6]:
Copied!
df_2.head()
df_2.head()
Out[6]:
| geom | size | color | |
|---|---|---|---|
| 0 | POINT Z (0.640126789249103 0.215223765209792 0) | 31 | green |
| 1 | POINT Z (0.664507263510019 0.305168853345408 0) | 2 | red |
| 2 | POINT Z (0.290726100986037 0.858602822092033 0) | 18 | red |
| 3 | POINT Z (0.368165665717348 0.885863770895202 0) | 12 | green |
| 4 | POINT Z (0.344731602269499 0.711839699888847 0) | 27 | blue |
Store the Data Frames as GeoPackage¶
In [7]:
Copied!
# Save the first DataFrame to a geopackage
geokit.core.vector.createVector(df_1, output="outputGeoPackage.gpkg", driverName="GPKG", layerName="layer1")
# Save the second DataFrame to the same geopackage without overwriting the first layer
geokit.core.vector.createVector(
df_2,
output="outputGeoPackage.gpkg",
driverName="GPKG",
layerName="layer2",
overwrite=False,
)
# Save the first DataFrame to a geopackage
geokit.core.vector.createVector(df_1, output="outputGeoPackage.gpkg", driverName="GPKG", layerName="layer1")
# Save the second DataFrame to the same geopackage without overwriting the first layer
geokit.core.vector.createVector(
df_2,
output="outputGeoPackage.gpkg",
driverName="GPKG",
layerName="layer2",
overwrite=False,
)
Warning 1: Layer 'layer1' has been declared with non-Z geometry type Point, but it does contain geometries with Z. Setting the Z=2 hint into gpkg_geometry_columns Warning 1: Layer 'layer2' has been declared with non-Z geometry type Point, but it does contain geometries with Z. Setting the Z=2 hint into gpkg_geometry_columns
Out[7]:
'outputGeoPackage.gpkg'
Check that the Layers have been set Properly.¶
In [8]:
Copied!
# Read from the saved geopackage
# Check the layer names
geokit.core.vector.listLayers("outputGeoPackage.gpkg")
# Read from the saved geopackage
# Check the layer names
geokit.core.vector.listLayers("outputGeoPackage.gpkg")
Out[8]:
['layer1', 'layer2']