class GeoHydra::Transform
Facilitates XSLT
stylesheet transformations for ISO 19139 import/export
Constants
Public Class Methods
Extracts an inline thumbnail from the ESRI ArcCatalog metadata format @param [String] fn the metadata @param [String] thumbnail_fn the file into which to write JPEG image @param [String] property_type is the EsriPropertyType to select @raise [ArgumentError] if cannot find a thumbnail
# File lib/geohydra/transform.rb, line 76 def self.extract_thumbnail fn, thumbnail_fn, property_type = 'PictureX' doc = Nokogiri::XML(File.read(fn)) doc.xpath('//Binary/Thumbnail/Data').each do |node| if property_type.nil? or node['EsriPropertyType'] == property_type image = Base64.decode64(node.text) File.open(thumbnail_fn, 'wb') {|f| f << image } return end end raise ArgumentError, "No thumbnail embedded within #{fn}" end
Converts an ESRI ArcCatalog metadata.xml into ISO 19139 @param [String] fn Input file @param [String] ofn Output file @param [String] ofn_fc Output file for the Feature Catalog (optional)
# File lib/geohydra/transform.rb, line 53 def self.from_arcgis fn, ofn, ofn_fc = nil, ofn_fgdc = nil system("#{XSLTPROC} #{XSLT[:arcgis]} '#{fn}' | #{XMLLINT} -o '#{ofn}' -") unless ofn_fc.nil? system("#{XSLTPROC} #{XSLT[:arcgis_fc]} '#{fn}' | #{XMLLINT} -o '#{ofn_fc}' -") end unless ofn_fgdc.nil? system("#{XSLTPROC} #{XSLT[:arcgis_fgdc]} '#{fn}' | #{XMLLINT} -o '#{ofn_fgdc}' -") end end
Reads the shapefile to determine geometry type
@return [String] Point, Polygon, LineString as appropriate
# File lib/geohydra/transform.rb, line 156 def self.geometry_type(shp_filename) begin RGeo::Shapefile::Reader.open(shp_filename) do |shp| shp.each do |record| return record.geometry.geometry_type.to_s.gsub(/^Multi/,'') end end rescue RGeo::Error::RGeoError => e puts e.message end nil end
@param zipfn [String] ZIP file
# File lib/geohydra/transform.rb, line 108 def self.reproject druid, zipfn, flags puts "Extracting #{druid.id} data from #{zipfn}" if flags[:verbose] tmp = "#{flags[:tmpdir]}/#{druid.id}" FileUtils.rm_rf tmp if File.directory? tmp FileUtils.mkdir_p tmp system("unzip -q -j '#{zipfn}' -d '#{tmp}'") shpfn = nil Dir.glob("#{tmp}/**/*.shp") do |fn| shpfn = File.basename(fn) end [4326].each do |srid| ifn = File.join(tmp, shpfn) raise ArgumentError, "#{ifn} is missing" unless File.exist? ifn odr = File.join(flags[:tmpdir], 'EPSG_' + srid.to_s) ofn = File.join(odr, shpfn) puts "Projecting #{ifn} -> #{odr}/#{ofn}" if flags[:verbose] # reproject FileUtils.mkdir_p odr unless File.directory? odr system("ogr2ogr -progress -t_srs '#{flags[:wkt][srid.to_s]}' '#{ofn}' '#{ifn}'") # normalize prj file if flags[:overwrite_prj] and not flags[:wkt][srid.to_s].nil? prj_fn = ofn.gsub(%r{\.shp}, '.prj') puts "Overwriting #{prj_fn}" if flags[:verbose] File.open(prj_fn, 'w') {|f| f.write(flags[:wkt][srid.to_s])} end # package up reprojection ozip = File.join(druid.content_dir, "data_EPSG_#{srid}.zip") puts "Repacking #{ozip}" if flags[:verbose] system("zip -q -Dj '#{ozip}' #{odr}/#{File.basename(shpfn, '.shp')}.*") # cleanup FileUtils.rm_rf odr end # cleanup FileUtils.rm_rf tmp end
XXX hardcoded paths
# File lib/geohydra/transform.rb, line 9 def self.search_for_xsl(filename) path = %w{ lib lib/geohydra lib/geomdtk /usr/share/tomcat6/webapps/geonetwork/xsl/conversion/import /var/geonetwork/2.8.0/lib /opt/staging/s_gis_services } path.unshift(File.dirname(__FILE__)) path.each do |d| fn = File.join(d, filename) if File.exist?(fn) return fn end end nil end
Converts a ISO 19139 into RDF-bundled document geoMetadataDS @param [Nokogiri::XML::Document] isoXml ISO 19193 MD_Metadata node @param [Nokogiri::XML::Document] fcXml ISO 19193 feature catalog @param [String] flags flags @return [Nokogiri::XML::Document] the geoMetadataDS with RDF
# File lib/geohydra/transform.rb, line 93 def self.to_geoMetadataDS isoXml, fcXml, flags = {} raise ArgumentError, "PURL is required" if flags['purl'].nil? raise ArgumentError, "ISO 19139 is required" if isoXml.nil? or isoXml.root.nil? Nokogiri::XML(" <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"> <rdf:Description rdf:about=\"#{flags['purl']}\"> #{isoXml.root.to_s} </rdf:Description> <rdf:Description rdf:about=\"#{flags['purl']}\"> #{fcXml.nil?? '' : fcXml.root.to_s} </rdf:Description> </rdf:RDF>") end
Converts a ISO 19139 into MODS v3 @param [String] fn with data as ISO 19139 XML. @return [Nokogiri::XML::Document] the MODS v3 metadata @deprecated Use to_geoMetadataDS
instead
# File lib/geohydra/transform.rb, line 44 def self.to_mods fn doc = Dor::GeoMetadataDS.from_xml File.open(fn) doc.to_mods end
@return [Hash] @deprecated
# File lib/geohydra/transform.rb, line 66 def self.to_solr fn doc = Dor::GeoMetadataDS.from_xml File.read(fn) doc.to_solr end
Private Class Methods
# File lib/geohydra/transform.rb, line 170 def self.do_xslt xslt, fn, params = {} cmd = XSLTPROC params.each do |k,v| cmd += " --stringparam '#{k}' '#{v}'" end # ap({:cmd => cmd, :xslt => xslt}) IO::popen("#{cmd} #{xslt} #{fn} | #{XMLLINT} -", 'r') do |f| return Nokogiri::XML(f.read) end end