Uploaded image for project: 'Apache Sedona'
  1. Apache Sedona
  2. SEDONA-456

SedonaKepler cannot work with geopandas >= 0.13.0 correctly

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 1.5.0
    • 1.5.1

    Description

      The following exception is raised when adding a dataframe with a geometry column not named "geometry" to the map. If the geometry column is renamed to "geometry" before adding to the map, then everything goes well.

      ---------------------------------------------------------------------------
      AttributeError                            Traceback (most recent call last)
      File ~/Library/Python/3.9/lib/python/site-packages/geopandas/geodataframe.py:436, in GeoDataFrame.crs(self)
          435 try:
      --> 436     return self.geometry.crs
          437 except AttributeError:
      
      File ~/Library/Python/3.9/lib/python/site-packages/pandas/core/generic.py:5487, in NDFrame.__getattr__(self, name)
         5486     return self[name]
      -> 5487 return object.__getattribute__(self, name)
      
      File ~/Library/Python/3.9/lib/python/site-packages/geopandas/geodataframe.py:235, in GeoDataFrame._get_geometry(self)
          229         msg += (
          230             "\nThere are no existing columns with geometry data type. You can "
          231             "add a geometry column as the active geometry column with "
          232             "df.set_geometry. "
          233         )
      --> 235     raise AttributeError(msg)
          236 return self[self._geometry_column_name]
      
      AttributeError: You are calling a geospatial method on the GeoDataFrame, but the active geometry column ('seg') is not present. 
      There are columns with geometry data type (['geometry']), and you can either set one as the active geometry with df.set_geometry("name") or access the column as a GeoSeries (df["name"]) and call the method directly on it.
      
      During handling of the above exception, another exception occurred:
      
      AttributeError                            Traceback (most recent call last)
      Cell In[16], line 3
            1 mapAll = SedonaKepler.create_map()
      ----> 3 SedonaKepler.add_df(mapAll, df, name="Segs")
            5 mapAll
      
      File ~/Library/Python/3.9/lib/python/site-packages/sedona/maps/SedonaKepler.py:52, in SedonaKepler.add_df(cls, kepler_map, df, name)
           44 """
           45 Adds a SedonaDataFrame to a given map object.
           46 :param kepler_map: Map object to add SedonaDataFrame to
         (...)
           49 :return: Does not return anything, adds df directly to the given map object
           50 """
           51 geo_df = SedonaMapUtils.__convert_to_gdf__(df)
      ---> 52 kepler_map.add_data(geo_df, name=name)
      
      File ~/Library/Python/3.9/lib/python/site-packages/keplergl/keplergl.py:140, in KeplerGl.add_data(self, data, name)
          129 def add_data(self, data, name="unnamed"):
          130     ''' Send data to Voyager
          131 
          132     Inputs:
         (...)
          137         keplergl.add_data(data_string, name="data_1")
          138     '''
      --> 140     normalized = _normalize_data(data)
          141     copy = self.data.copy()
          142     copy.update({name: normalized})
      
      File ~/Library/Python/3.9/lib/python/site-packages/keplergl/keplergl.py:50, in _normalize_data(data)
           48 def _normalize_data(data):
           49     if isinstance(data, pd.DataFrame):
      ---> 50         return _gdf_to_dict(data) if isinstance(data, geopandas.GeoDataFrame) else _df_to_dict(data)
           51     return data
      
      File ~/Library/Python/3.9/lib/python/site-packages/keplergl/keplergl.py:34, in _gdf_to_dict(gdf)
           25 ''' Create an input dict for kepler.gl using a GeoDataFrame object
           26 
           27 Inputs:
         (...)
           31 - dictionary: a dictionary variable that can be used in Kepler.gl
           32 '''
           33 # reproject to 4326 if needed
      ---> 34 if gdf.crs and not gdf.crs == 4326:
           35     gdf = gdf.to_crs(4326)
           37 # get name of the geometry column
           38 # will cause error if data frame has no geometry column
      
      File ~/Library/Python/3.9/lib/python/site-packages/pandas/core/generic.py:5487, in NDFrame.__getattr__(self, name)
         5480 if (
         5481     name not in self._internal_names_set
         5482     and name not in self._metadata
         5483     and name not in self._accessors
         5484     and self._info_axis._can_hold_identifiers_and_holds_name(name)
         5485 ):
         5486     return self[name]
      -> 5487 return object.__getattribute__(self, name)
      
      File ~/Library/Python/3.9/lib/python/site-packages/geopandas/geodataframe.py:438, in GeoDataFrame.crs(self)
          436     return self.geometry.crs
          437 except AttributeError:
      --> 438     raise AttributeError(
          439         "The CRS attribute of a GeoDataFrame without an active "
          440         "geometry column is not defined. Use GeoDataFrame.set_geometry "
          441         "to set the active geometry column."
          442     )
      
      AttributeError: The CRS attribute of a GeoDataFrame without an active geometry column is not defined. Use GeoDataFrame.set_geometry to set the active geometry column.
      
      

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              kontinuation Kristin Cowalcijk
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 20m
                  20m