4

我正在尝试使用 GeoTools 从启用 PostGIS 的数据库中的特征表中过滤特征。

我的配置:

  • PostgreSQL 8.4
  • 地理信息系统 1.5
  • 渗透 0.40.1
  • OSMembrane 构建 845
  • 地理工具 2.7.4

设置

我通过按顺序执行这些 sql 脚本来设置启用 postgis 的数据库:

  1. [PATH_TO_POSTGRESQL_8.4]/share/contrib/postgis-1.5/postgis.sql
  2. [PATH_TO_POSTGRESQL_8.4]/share/contrib/postgis-1.5/spatial_ref_sys.sql
  3. [PATH_TO_POSTGRESQL_8.4]/postgresql/8.4/contrib/hstore.sql
  4. [PATH_TO_OSMOSIS_0_40_1/script/pgsnapshot_schema_0.6.sql

然后我导入一些我使用 OSMembrane 从 europe.osm 提取的 .osm 数据。

到目前为止,一切都很好。所有表都包含一些数据。然后我尝试阅读一个特征表,例如“方式”,它看起来像这样:

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)
)

特别是“标签”列包含我想用于过滤的键/值对。当尝试在 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?也许,你可以给我一些提示。

4

2 回答 2

2

虽然我永远无法让 geoServer 直接使用 hstore(在基于 SQL 视图的层中),但我能够向 DB 添加一个辅助函数,这允许显示内容。功能是

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

从 mytable 中选择 id、hstore_to_text(hst_var)、mygeom

并且 FWIW - 进行强制转换(或直接在查询中的任何其他变体 - 不是通过函数)不起作用。

于 2014-02-13T01:06:59.990 回答
1

我不确定 GeoTools PostGIS 阅读器是否支持 hstore 列。以下是我在 PostGIS 中导入 OSM 数据时所做的一些说明。我的目标是在 GeoServer 中显示它们,它使用 GeoTools 数据存储来读取它。我按标签拆分数据以使其工作。

于 2012-01-31T15:31:34.830 回答