Как отфильтровать данные из столбца hstore с помощью GeoTools?
Я пытаюсь отфильтровать объекты из таблицы объектов в базе данных с поддержкой PostGIS с помощью GeoTools.
Моя конфигурация:
- PostgreSQL 8.4
- PostGIS 1.5
- Осмос 0.40.1
- ОСМембранная сборка 845
- GeoTools 2.7.4
Настроить
Я настроил свою базу данных с поддержкой postgis, выполнив эти сценарии sql в следующем порядке:
- [PATH_TO_POSTGRESQL_8.4] /share/contrib/postgis-1.5/postgis.sql
- [PATH_TO_POSTGRESQL_8.4] /share/contrib/postgis-1.5/spatial_ref_sys.sql
- [PATH_TO_POSTGRESQL_8.4] /postgresql/8.4/contrib/hstore.sql
- [PATH_TO_OSMOSIS_0_40_1 / скрипт /pgsnapshot_schema_0.6.sql
Затем я импортирую некоторые данные.osm, которые я извлек из europe.osm, используя OSMembrane.
Пока все хорошо. Все таблицы содержат некоторые данные. Затем я пытаюсь прочитать таблицу функций, например, "way", которая выглядит следующим образом:
CREATE TABLE ways
(
id bigint NOT NULL,
"version" integer NOT NULL,
user_id integer NOT NULL,
tstamp timestamp without time zone NOT NULL,
changeset_id bigint NOT NULL,
tags hstore,
nodes bigint[],
CONSTRAINT pk_ways PRIMARY KEY (id)
)
В частности, столбец 'tags' содержит пары ключ / значение, которые я хотел бы использовать для фильтрации. При попытке отфильтровать строки по "естественной = береговой линии" в SQL я получаю ~550 результирующих строк.
SELECT tags FROM ways where tags @> 'natural => coastline'
Example result: '"source"=>"PGS", "natural"=>"coastline", "created_by"=>"almien_coastlines"'
Попытка этого с GeoTools не работает должным образом, как мы надеемся, этот пример покажет вам.
package getfeaturesapplication;
import java.util.HashMap;
import java.util.Map;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.postgis.PostgisNGDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureSource;
public class GetFeaturesApplication {
public static void main(String[] args) {
try {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
parameters.put(PostgisNGDataStoreFactory.HOST.key, "localhost");
parameters.put(PostgisNGDataStoreFactory.PORT.key, new Integer(5432));
parameters.put(PostgisNGDataStoreFactory.DATABASE.key, "postgis");
parameters.put(PostgisNGDataStoreFactory.SCHEMA.key, "public");
parameters.put(PostgisNGDataStoreFactory.USER.key, "osm");
parameters.put(PostgisNGDataStoreFactory.PASSWD.key, "osm");
DataStore dataStore = DataStoreFinder.getDataStore(parameters);
String featureName = "ways";
SimpleFeatureSource featureSource = dataStore.getFeatureSource(featureName); //=> WARNINGS
SimpleFeatureCollection features1 = featureSource.getFeatures();
System.out.println("Feature count: " + features1.size()); //406391
FilterFactory2 filterFactory = CommonFactoryFinder.getFilterFactory2(null);
Filter filter = filterFactory.equals(filterFactory.literal("natural"), filterFactory.literal("coastline"));
SimpleFeatureCollection features2 = featureSource.getFeatures(filter);
System.out.println("Features found after filtering: " + !features2.isEmpty()); //SEEMS TO BE ALWAYS EMPTY
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
При запуске этого приложения я получаю:
31.01.2012 15:27:49 org.geotools.jdbc.JDBCFeatureSource buildFeatureType
WARNING: Could not find mapping for 'tags', ignoring the column and setting the feature type read only
31.01.2012 15:27:49 org.geotools.jdbc.JDBCFeatureSource buildFeatureType
WARNING: Could not find mapping for 'nodes', ignoring the column and setting the feature type read only
Feature count: 406391
Features found after filtering: false
Есть ли проблема со столбцами hstore и bigint[] или я неправильно использую GeoTools? Может быть, вы можете дать мне несколько советов.
2 ответа
Я не уверен, что читатель GeoTools PostGIS поддерживает столбцы hstore. Вот некоторые замечания, которые я сделал по импорту данных OSM в PostGIS. Моя цель состояла в том, чтобы отобразить их в GeoServer, который использует хранилище данных GeoTools для его чтения. Я разделил данные по тегам, чтобы они работали.
Хотя мне никогда не удавалось заставить geoServer использовать hstore напрямую (в слое на основе представления SQL), я смог добавить вспомогательную функцию в БД, и это позволило отображать содержимое. Функция
CREATE OR REPLACE FUNCTION hstore_to_text(h hstore)
RETURNS text AS
$BODY$
DECLARE
txt text;
BEGIN
txt := cast(h as text);
return txt;
END $BODY$
LANGUAGE 'plpgsql' volatile
COST 1;
ALTER FUNCTION hstore_to_text(hstore)
OWNER TO postgres;
Затем вы можете конвертировать hstore в запрос, используя что-то вроде
выберите id, hstore_to_text(hst_var), mygeom из mytable
И FWIW - выполнение приведения (или любой из нескольких других вариантов непосредственно в запросе - не через функцию) НЕ работает.