Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [geomesa-users] GeoMesa Command Line Tools and HBase

Hi Marcin,

Right now our Hbase data store only supports Points, not polygons. We'd like to add that feature, but we haven't had time yet. If you're interested in contributing, I could give you some pointers on what to do - most of the code has already been implemented in other places, but not adapted for Hbase yet.

Thanks,

Emilio

On 07/13/2016 10:08 AM, Marjasiewicz, Marcin wrote:

Hi Emilio,

 

I’m trying to create hbase importer which can import Polygons stored as WKT in CSV files.

Everything is building fine but when I try to import file I can see Exception like my geometry was taken as Point :

 

Exception in thread “main” java.lang.ClassCastException: com.vividsolutions.jts.geom.Polygon cannot be cast to com.vividsolutions.jts.geom.Point

 

imap://elahrvivaz%40ccri%2Ecom@xxxxxxxxxxxxx:143/fetch%3EUID%3E.INBOX.geomesa-lists%3E2842?header=quotebody&part=1.1.2&filename=image001.png

 

I can’t find solution for this problem.

 

Application code:

 

/**

* Copyright 2016 Commonwealth Computer Research, Inc.

*

* Licensed under the Apache License, Version 2.0 (the License);

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an AS IS BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

               

//                           

 

package com.example.geomesa.hbase;

 

import com.beust.jcommander.internal.Lists;

import com.google.common.base.Joiner;

import com.vividsolutions.jts.geom.Geometry;

import com.vividsolutions.jts.geom.Polygon;

import com.vividsolutions.jts.geom.Point;

import com.vividsolutions.jts.geom.GeometryFactory;

import com.vividsolutions.jts.io.WKTReader;

import org.apache.commons.cli.*;

import org.geotools.data.*;

import org.geotools.factory.Hints;

import org.geotools.feature.DefaultFeatureCollection;

import org.geotools.feature.FeatureCollection;

import org.geotools.feature.FeatureIterator;

import org.geotools.feature.SchemaException;

import org.geotools.feature.simple.SimpleFeatureBuilder;

import org.geotools.filter.text.cql2.CQL;

import org.geotools.filter.text.cql2.CQLException;

import org.geotools.geometry.jts.JTSFactoryFinder;

import org.joda.time.DateTime;

import org.joda.time.DateTimeZone;

import org.locationtech.geomesa.utils.text.WKTUtils$;

import org.geotools.swing.data.JFileDataStoreChooser;

import org.opengis.feature.Feature;

import org.opengis.feature.simple.SimpleFeature;

import org.opengis.feature.simple.SimpleFeatureType;

import org.opengis.filter.Filter;

 

import java.io.IOException;

import java.io.Serializable;

import java.io.File;

import java.io.BufferedReader;

import java.io.BufferedReader.*;

import java.io.FileReader;

import java.io.FileReader.*;

 

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Random;

 

public class HBaseImporter {

                static String TABLE_NAME = "bigtable.table.name".replace(".", "_");

 

                // sub-set of parameters that are used to create the HBase DataStore

                static String[] HBASE_CONNECTION_PARAMS = new String[]{

                TABLE_NAME

                };

 

                /**

                * Creates a common set of command-line options for the parser.  Each option

                * is described separately.

                */

                static Options getCommonRequiredOptions() {

                Options options = new Options();

 

                Option tableNameOpt = OptionBuilder.withArgName(TABLE_NAME)

                .hasArg()

                .isRequired()

                .withDescription("table name")

                .create(TABLE_NAME);

                options.addOption(tableNameOpt);

 

                return options;

                }

 

                static Map<String, Serializable> getHBaseDataStoreConf(CommandLine cmd) {

                Map<String , Serializable> dsConf = new HashMap<>();

                for (String param : HBASE_CONNECTION_PARAMS) {

                dsConf.put(param.replace("_", "."), cmd.getOptionValue(param));

                }

                System.out.println( "DataStore Config: " + dsConf);

                return dsConf;

                }

 

                static SimpleFeatureType createSimpleFeatureType(String simpleFeatureTypeName)

                throws SchemaException {

 

                // list the attributes that constitute the feature type

                List<String> attributes = Lists.newArrayList(

                "ID:Integer",

                "*WKT:Polygon:srid=4326",  // the "*" denotes the default geometry (used for indexing)                

                //"What:java.lang.Long", // some types require full qualification (see DataUtilities docs)

                "date:Date",                         // a date-time field is optional, but can be indexed

                "osm_id:String",                 

                "name:String",                    

                "type:String"        

                );

 

                // create the bare simple-feature type

                String simpleFeatureTypeSchema = Joiner.on(",").join(attributes);

                SimpleFeatureType simpleFeatureType =

                DataUtilities.createType(simpleFeatureTypeName, simpleFeatureTypeSchema);

                System.out.println( "SimpleFeatureType: " + simpleFeatureType);

                return simpleFeatureType;

                }

   

static FeatureCollection createNewFeatures(SimpleFeatureType simpleFeatureType, File file) throws IOException {    

   /*

                * We create a FeatureCollection into which we will put each Feature created from a record

                * in the input csv data file

                */

   

                DefaultFeatureCollection featureCollection = new DefaultFeatureCollection();    

   

                /*

                * GeometryFactory will be used to create the geometry attribute of each feature (a Point

                * object for the location)

                */

 

                GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);

 

                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(simpleFeatureType);

                WKTReader georeader = new WKTReader( geometryFactory );

   

               

                java.io.FileReader infile = new java.io.FileReader(file);

                java.io.BufferedReader reader = new java.io.BufferedReader(infile);

                try {

                /* First line of the data file is the header */

                String line = reader.readLine();

                System.out.println("Header: " + line);

                               System.out.println( "Feature Collection creation start");

                               int lines = 0;

                for (line = reader.readLine(); line != null; line = reader.readLine()) {

                if (line.trim().length() > 0) { // skip blank lines

                String tokens[] = line.split("\\;");

 

                int ID = Integer.parseInt(tokens[0].trim());    

 

                                                               //Geometry WKT = WKTUtils$.MODULE$.read(tokens[1]);

                Polygon WKT = (Polygon) georeader.read(tokens[1]);

                String osm_id = tokens[2].trim();

                String name = tokens[3].trim();

                String type = tokens[4].trim();                                                         

                                                              

                                                               featureBuilder.add(ID);

                featureBuilder.add(WKT);                                                                

                featureBuilder.add(osm_id);

                featureBuilder.add(name);

                featureBuilder.add(type);

                SimpleFeature feature = featureBuilder.buildFeature(null);

                featureCollection.add(feature);

               

                                               /*    System.out.println( ".  " +

                feature.getProperty("ID").getValue() + "|" +

                feature.getProperty("WKT").getValue() + "|" +

                feature.getProperty("osm_id").getValue() + "|" +

                feature.getProperty("name").getValue() + "|" +

                feature.getProperty("type").getValue());*/

                                                              

                                                              

                                                               lines++;

                                                              

                }

                }

                               System.out.println( "Feature Count: " + lines);                            

                } finally {

 

                reader.close();

                               System.out.println( "Feature Collection creation finished");

                               return featureCollection;

                              

                }

}

   

                static void insertFeatures(String simpleFeatureTypeName,

                               DataStore dataStore,

                               FeatureCollection featureCollection)

                throws IOException {

 

                FeatureStore featureStore = (FeatureStore)dataStore.getFeatureSource(simpleFeatureTypeName);

                System.out.println("getFeatureSource: " + featureStore);    

                System.out.println("featureCollection: " + featureCollection);

                featureStore.addFeatures(featureCollection);

                System.out.println("Insert finished");

                }

 

                public static void main(String[] args) throws Exception {

                // find out where -- in HBase -- the user wants to store data

                CommandLineParser parser = new BasicParser();

                Options options = getCommonRequiredOptions();

                CommandLine cmd = parser.parse( options, args);

 

                // verify that we can see this HBase destination in a GeoTools manner

                Map<String, Serializable> dsConf = getHBaseDataStoreConf(cmd);

                DataStore dataStore = DataStoreFinder.getDataStore(dsConf);

                assert dataStore != null;

 

                // establish specifics concerning the SimpleFeatureType to store

                String simpleFeatureTypeName = "ImporterDev2";

                SimpleFeatureType simpleFeatureType = createSimpleFeatureType(simpleFeatureTypeName);

 

                // write Feature-specific metadata to the destination table in HBase

                // (first creating the table if it does not already exist); you only need

                // to create the FeatureType schema the *first* time you write any Features

                // of this type to the table

                System.out.println("Creating feature-type (schema):  " + simpleFeatureTypeName);

                dataStore.createSchema(simpleFeatureType);

 

               

                File file = JFileDataStoreChooser.showOpenFile("csv", null);

                if (file == null) {

                               //System.out.println("Chosen CSV File:  " + file);  //.getSelectedFile().getName()

                return;

                }

 

                System.out.println("Chosen CSV File:  " + file);

               

               

                // create new features locally, and add them to this table

                System.out.println("Creating new features");

                FeatureCollection featureCollection = createNewFeatures(simpleFeatureType, file);

                System.out.println("Inserting new features");

                insertFeatures(simpleFeatureTypeName, dataStore, featureCollection);

 

                }

}

 

 

From: geomesa-users-bounces@xxxxxxxxxxxxxxxx [mailto:geomesa-users-bounces@xxxxxxxxxxxxxxxx] On Behalf Of Emilio Lahr-Vivaz
Sent: Monday, July 04, 2016 4:26 PM
To: geomesa-users@xxxxxxxxxxxxxxxx
Subject: Re: [geomesa-users] GeoMesa Command Line Tools and HBase

 

Hi Marcin,

The command line tools currently support accumulo and (to a lesser degree) kafka. For ingesting data into hbase, you have to use the geotools API for creating simple features. We have several tutorials on how to do this using accumulo - those would be a good place to start. You should be able to adapt them to hbase by replacing the accumulo data store with an hbase data store. Because they are both geotools DataStore implementations, almost all of the code would remain the same.


Single process ingest/query:

    http://www.geomesa.org/documentation/tutorials/geomesa-quickstart-accumulo.html

Map/reduce ingest:

    http://www.geomesa.org/documentation/tutorials/geomesa-examples-gdelt.html

Streaming ingest using storm:

    http://www.geomesa.org/documentation/tutorials/geomesa-quickstart-storm.html



The hbase documentation describes how to get an hbase data store:

    http://www.geomesa.org/documentation/user/hbase_datastore.html

Thanks,

Emilio

On 07/04/2016 04:34 AM, Marjasiewicz, Marcin wrote:

Line Tools and HBase

 

Good morning,

 

I would like to ask a question about using Command Line Tools with HBase. Is it supported or it is only tool for Accumulo?

If not what is proper format to storage geometry in HBase? For example if I will import CSV with geometry as WKT will it work with Geomesa Hbase Geoserver plugin?  

I have already configured Geoserver plugin to work with my HBase. Now I am looking for some solution to load geospatial data into it.

 

My sample data row in HBase table looks that:

imap://elahrvivaz%40ccri%2Ecom@xxxxxxxxxxxxx:143/fetch%3EUID%3E.INBOX.geomesa-lists%3E2842?header=quotebody&part=1.1.3&filename=image002.png

 

Best Regards

_______________________________

Marcin Marjasiewicz

 




_______________________________________________
geomesa-users mailing list
geomesa-users@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://www.locationtech.org/mailman/listinfo/geomesa-users

 



_______________________________________________
geomesa-users mailing list
geomesa-users@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://www.locationtech.org/mailman/listinfo/geomesa-users


Back to the top