Update WikiIndexer
This commit is contained in:
parent
1ad3e42f93
commit
6ccac8ee6e
8 changed files with 545 additions and 9 deletions
|
@ -121,6 +121,9 @@ public class Algoritms {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean removeAllFiles(File f) {
|
public static boolean removeAllFiles(File f) {
|
||||||
|
if (f == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (f.isDirectory()) {
|
if (f.isDirectory()) {
|
||||||
for (File c : f.listFiles()) {
|
for (File c : f.listFiles()) {
|
||||||
removeAllFiles(c);
|
removeAllFiles(c);
|
||||||
|
|
|
@ -17,6 +17,7 @@ public class Amenity extends MapObject {
|
||||||
private AmenityType type;
|
private AmenityType type;
|
||||||
private String openingHours;
|
private String openingHours;
|
||||||
private String phone;
|
private String phone;
|
||||||
|
private String description;
|
||||||
private String site;
|
private String site;
|
||||||
|
|
||||||
public Amenity(Entity entity, AmenityType type, String subtype){
|
public Amenity(Entity entity, AmenityType type, String subtype){
|
||||||
|
@ -47,6 +48,7 @@ public class Amenity extends MapObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.description = entity.getTag(OSMTagKey.DESCRIPTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -151,6 +153,14 @@ public class Amenity extends MapObject {
|
||||||
this.phone = phone;
|
this.phone = phone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doDataPreparation() {
|
public void doDataPreparation() {
|
||||||
|
|
|
@ -30,7 +30,9 @@ public enum AmenityType {
|
||||||
EMERGENCY("emergency"), // [TAG] emergency //$NON-NLS-1$ //$NON-NLS-2$
|
EMERGENCY("emergency"), // [TAG] emergency //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
MILITARY("military"), // [TAG] military //$NON-NLS-1$ //$NON-NLS-2$
|
MILITARY("military"), // [TAG] military //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
ADMINISTRATIVE("administrative"), // [TAG] administrative //$NON-NLS-1$ //$NON-NLS-2$
|
ADMINISTRATIVE("administrative"), // [TAG] administrative //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
GEOCACHE("geocache"), //$NON-NLS-1$//$NON-NLS-2$
|
GEOCACHE("geocache"), //$NON-NLS-1$
|
||||||
|
OSMWIKI("osmwiki"), //$NON-NLS-1$
|
||||||
|
USER_DEFINED("user_defined"), //$NON-NLS-1$
|
||||||
OTHER("amenity"), // grave-yard, police, post-office [+Internet_access] //$NON-NLS-1$ //$NON-NLS-2$
|
OTHER("amenity"), // grave-yard, police, post-office [+Internet_access] //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
510
DataExtractionOSM/src/net/osmand/data/index/WikiIndexer.java
Normal file
510
DataExtractionOSM/src/net/osmand/data/index/WikiIndexer.java
Normal file
|
@ -0,0 +1,510 @@
|
||||||
|
package net.osmand.data.index;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import javax.xml.stream.XMLOutputFactory;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.XMLStreamWriter;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.tools.bzip2.CBZip2InputStream;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import net.osmand.Algoritms;
|
||||||
|
import net.osmand.LogUtil;
|
||||||
|
import net.osmand.Version;
|
||||||
|
import net.osmand.data.preparation.IndexCreator;
|
||||||
|
import net.osmand.impl.ConsoleProgressImplementation;
|
||||||
|
|
||||||
|
public class WikiIndexer {
|
||||||
|
private static final Log log = LogUtil.getLog(WikiIndexer.class);
|
||||||
|
private final File srcPath;
|
||||||
|
private final File workPath;
|
||||||
|
private final File targetPath;
|
||||||
|
public static class WikiIndexerException extends Exception {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
public WikiIndexerException(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
public WikiIndexerException(String string, Exception e) {
|
||||||
|
super(string, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public WikiIndexer(File srcPath, File targetPath, File workPath) {
|
||||||
|
this.srcPath = srcPath;
|
||||||
|
this.targetPath = targetPath;
|
||||||
|
this.workPath = workPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
File srcPath = extractDirectory(args, 0);
|
||||||
|
File targetPath = extractDirectory(args, 1);
|
||||||
|
File workPath = extractDirectory(args, 2);
|
||||||
|
|
||||||
|
WikiIndexer wikiIndexer = new WikiIndexer(srcPath, targetPath, workPath);
|
||||||
|
wikiIndexer.run();
|
||||||
|
|
||||||
|
} catch (WikiIndexerException e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static File extractDirectory(String[] args, int ind) throws WikiIndexerException {
|
||||||
|
if (args.length <= ind) {
|
||||||
|
throw new WikiIndexerException("Usage: WikiIndexer src_directory target_directory work_directory [--description={full|normal|minimum}]" + " missing " + (ind + 1));
|
||||||
|
} else {
|
||||||
|
File fs = new File(args[ind]);
|
||||||
|
fs.mkdir();
|
||||||
|
if(!fs.exists() || !fs.isDirectory()) {
|
||||||
|
throw new WikiIndexerException("Specified directory doesn't exist : " + args[ind]);
|
||||||
|
}
|
||||||
|
return fs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
File[] listFiles = srcPath.listFiles();
|
||||||
|
for(File f : listFiles) {
|
||||||
|
try {
|
||||||
|
if (f.isFile() && (f.getName().endsWith(".xml") || f.getName().endsWith(".xml.bz2"))) {
|
||||||
|
log.info("About to process " + f.getName());
|
||||||
|
File outFile = process(f);
|
||||||
|
if (outFile != null) {
|
||||||
|
|
||||||
|
IndexCreator ic = new IndexCreator(workPath);
|
||||||
|
ic.setIndexPOI(true);
|
||||||
|
ic.setIndexMap(false);
|
||||||
|
ic.setIndexTransport(false);
|
||||||
|
ic.setIndexAddress(false);
|
||||||
|
ic.generateIndexes(outFile, new ConsoleProgressImplementation(3), null, null, null, log);
|
||||||
|
// final step
|
||||||
|
new File(workPath, ic.getMapFileName()).renameTo(new File(targetPath, ic.getMapFileName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (WikiIndexerException e) {
|
||||||
|
log.error("Error processing "+f.getName(), e);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
log.error("Error processing "+f.getName(), e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error processing "+f.getName(), e);
|
||||||
|
} catch (SAXException e) {
|
||||||
|
log.error("Error processing "+f.getName(), e);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
log.error("Error processing "+f.getName(), e);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error("Error processing "+f.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected File process(File f) throws WikiIndexerException {
|
||||||
|
InputStream fi = null;
|
||||||
|
BufferedWriter out = null;
|
||||||
|
try {
|
||||||
|
int in = f.getName().indexOf('.');
|
||||||
|
File osmOut = new File(workPath, f.getName().substring(0, in) + ".osm");
|
||||||
|
fi = new BufferedInputStream(new FileInputStream(f));
|
||||||
|
InputStream progressStream = fi;
|
||||||
|
if(f.getName().endsWith(".bz2")){
|
||||||
|
if (fi.read() != 'B' || fi.read() != 'Z') {
|
||||||
|
throw new RuntimeException("The source stream must start with the characters BZ if it is to be read as a BZip2 stream."); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
fi = new CBZip2InputStream(fi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ConsoleProgressImplementation progress = new ConsoleProgressImplementation();
|
||||||
|
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(osmOut), "UTF-8"));
|
||||||
|
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
|
||||||
|
WikiOsmHandler wikiOsmHandler = new WikiOsmHandler(saxParser, out, progress, progressStream);
|
||||||
|
saxParser.parse(fi, wikiOsmHandler);
|
||||||
|
|
||||||
|
if(wikiOsmHandler.getCount() < 1){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return osmOut;
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
throw new WikiIndexerException("Parse exception", e);
|
||||||
|
} catch (SAXException e) {
|
||||||
|
throw new WikiIndexerException("Parse exception", e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new WikiIndexerException("Parse exception", e);
|
||||||
|
} catch (XMLStreamException e) {
|
||||||
|
throw new WikiIndexerException("Parse exception", e);
|
||||||
|
} finally {
|
||||||
|
Algoritms.closeStream(out);
|
||||||
|
Algoritms.closeStream(fi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class WikiOsmHandler extends DefaultHandler {
|
||||||
|
long id = 1;
|
||||||
|
private final SAXParser saxParser;
|
||||||
|
private boolean page = false;
|
||||||
|
private StringBuilder ctext = null;
|
||||||
|
|
||||||
|
private StringBuilder title = new StringBuilder();
|
||||||
|
private StringBuilder text = new StringBuilder();
|
||||||
|
|
||||||
|
private final ConsoleProgressImplementation progress;
|
||||||
|
private final InputStream progIS;
|
||||||
|
private XMLStreamWriter streamWriter;
|
||||||
|
|
||||||
|
WikiOsmHandler(SAXParser saxParser, BufferedWriter outOsm, ConsoleProgressImplementation progress, InputStream progIS) throws IOException, XMLStreamException {
|
||||||
|
this.saxParser = saxParser;
|
||||||
|
this.progress = progress;
|
||||||
|
this.progIS = progIS;
|
||||||
|
XMLOutputFactory xof = XMLOutputFactory.newInstance();
|
||||||
|
streamWriter = xof.createXMLStreamWriter(outOsm);
|
||||||
|
streamWriter.writeStartDocument();
|
||||||
|
streamWriter.writeCharacters("\n");
|
||||||
|
streamWriter.writeStartElement("osm");
|
||||||
|
streamWriter.writeAttribute("version", "0.6");
|
||||||
|
streamWriter.writeAttribute("generator", Version.APP_MAP_CREATOR_VERSION);
|
||||||
|
|
||||||
|
|
||||||
|
progress.startTask("Parse wiki xml", progIS.available());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return (int) (id - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
String name = saxParser.isNamespaceAware() ? localName : qName;
|
||||||
|
if (!page) {
|
||||||
|
page = name.equals("page");
|
||||||
|
} else {
|
||||||
|
if(name.equals("title")) {
|
||||||
|
title.setLength(0);
|
||||||
|
ctext = title;
|
||||||
|
} else if(name.equals("text")) {
|
||||||
|
text.setLength(0);
|
||||||
|
ctext = text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
if (page) {
|
||||||
|
if(ctext != null) {
|
||||||
|
ctext.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
String name = saxParser.isNamespaceAware() ? localName : qName;
|
||||||
|
try {
|
||||||
|
if (page) {
|
||||||
|
if(name.equals("page")) {
|
||||||
|
page = false;
|
||||||
|
progress.remaining(progIS.available());
|
||||||
|
} else if(name.equals("title")) {
|
||||||
|
ctext = null;
|
||||||
|
} else if(name.equals("text")) {
|
||||||
|
analyzeTextForGeoInfo();
|
||||||
|
ctext = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new SAXException(e);
|
||||||
|
} catch (XMLStreamException e) {
|
||||||
|
throw new SAXException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String readProperty(String prop, int s, int e){
|
||||||
|
int res = -1;
|
||||||
|
for (int i = s; i < e - prop.length(); i++) {
|
||||||
|
if(prop.charAt(0) == text.charAt(i)) {
|
||||||
|
boolean neq = false;
|
||||||
|
for (int j = 0; j < prop.length(); j++) {
|
||||||
|
if(prop.charAt(j) != text.charAt(i + j)) {
|
||||||
|
neq = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!neq){
|
||||||
|
res = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(res == -1){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int sr = -1;
|
||||||
|
int se = e;
|
||||||
|
for(int i = res + prop.length() + 1; i<e; i++){
|
||||||
|
if(sr == -1 ) {
|
||||||
|
if(text.charAt(i) != '=' && !Character.isWhitespace(text.charAt(i))) {
|
||||||
|
sr = i;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(text.charAt(i) == '|') {
|
||||||
|
se = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(sr != -1) {
|
||||||
|
return text.substring(sr, se).trim();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float zeroParseFloat(String s) {
|
||||||
|
return s.length() == 0 ? 0 : Float.parseFloat(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int findOpenBrackets(int i) {
|
||||||
|
int h = text.indexOf("{{", i);
|
||||||
|
boolean check = true;
|
||||||
|
while(check){
|
||||||
|
int startComment = text.indexOf("<!--", i);
|
||||||
|
check = false;
|
||||||
|
if (startComment != -1 && startComment < h) {
|
||||||
|
i = text.indexOf("-->", startComment);
|
||||||
|
h = text.indexOf("{{", i);
|
||||||
|
check = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int findClosedBrackets(int i){
|
||||||
|
if(i == -1){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int stack = 1;
|
||||||
|
int h = text.indexOf("{{", i+2);
|
||||||
|
int e = text.indexOf("}}", i+2);
|
||||||
|
while(stack != 0 && e != -1) {
|
||||||
|
if(h!= -1 && h<e){
|
||||||
|
i = h;
|
||||||
|
stack++;
|
||||||
|
} else {
|
||||||
|
i = e;
|
||||||
|
stack--;
|
||||||
|
}
|
||||||
|
if(stack != 0) {
|
||||||
|
h = text.indexOf("{{", i+2);
|
||||||
|
e = text.indexOf("}}", i+2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(stack == 0){
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void analyzeTextForGeoInfo() throws XMLStreamException {
|
||||||
|
// fast precheck
|
||||||
|
if(title.toString().endsWith("/doc")) {
|
||||||
|
// Looks as template article no information in it
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int ls = text.indexOf("lat_dir");
|
||||||
|
if(ls != -1 && text.charAt(ls + 1 + "lat_dir".length()) != '|') {
|
||||||
|
float lat = 0;
|
||||||
|
float lon = 0;
|
||||||
|
String subcategory = "";
|
||||||
|
StringBuilder description = new StringBuilder();
|
||||||
|
|
||||||
|
int h = findOpenBrackets(0);
|
||||||
|
int e = findClosedBrackets(h);
|
||||||
|
// 1. Find main header section {{ ... lat, lon }}
|
||||||
|
while (h != -1 && e != -1) {
|
||||||
|
String lat_dir = readProperty("lat_dir", h, e);
|
||||||
|
// continue if nothing was found
|
||||||
|
if (lat_dir != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
h = findOpenBrackets(e);
|
||||||
|
e = findClosedBrackets(h);
|
||||||
|
}
|
||||||
|
if (h == -1 || e == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Parse lat lon
|
||||||
|
try {
|
||||||
|
String lat_dir = readProperty("lat_dir", h, e);
|
||||||
|
String lon_dir = readProperty("lon_dir", h, e);
|
||||||
|
float lat_deg = Float.parseFloat(readProperty("lat_deg", h, e));
|
||||||
|
float lon_deg = Float.parseFloat(readProperty("lon_deg", h, e));
|
||||||
|
float lat_min = zeroParseFloat(readProperty("lat_min", h, e));
|
||||||
|
float lon_min = zeroParseFloat(readProperty("lon_min", h, e));
|
||||||
|
float lat_sec = zeroParseFloat(readProperty("lat_sec", h, e));
|
||||||
|
float lon_sec = zeroParseFloat(readProperty("lon_sec", h, e));
|
||||||
|
lat = (("S".equals(lat_dir))? -1 : 1) * (lat_deg + (lat_min + lat_sec/60)/60);
|
||||||
|
lon = (("E".equals(lon_dir))? -1 : 1) * (lon_deg + (lon_min + lon_sec/60)/60);
|
||||||
|
} catch (RuntimeException es) {
|
||||||
|
log.debug("Article " + title, es);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 3. Parse main subcategory name
|
||||||
|
for (int j = h + 2; j < e; j++) {
|
||||||
|
if (Character.isWhitespace(text.charAt(j)) || text.charAt(j) == '|') {
|
||||||
|
subcategory = text.substring(h + 2, j).trim();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Special case
|
||||||
|
|
||||||
|
|
||||||
|
// 4. Parse main subcategory name
|
||||||
|
processDescription(description, e + 3);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(description.length() > 0) {
|
||||||
|
writeNode(lat, lon, subcategory, description);
|
||||||
|
}
|
||||||
|
System.out.println("Point " + title + " " + subcategory + " Lon:" + lat + " Lon:" + lon + " " );
|
||||||
|
System.out.println("Description : " + description.toString().trim());
|
||||||
|
System.out.println("---------------------");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int checkAndParse(int i, String start, String end, StringBuilder d, boolean add){
|
||||||
|
if(text.charAt(i) != start.charAt(0)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (int j = 1 ; j < start.length(); j++) {
|
||||||
|
if(text.charAt(i + j) != start.charAt(j)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int st = i+start.length();
|
||||||
|
int en = text.length();
|
||||||
|
boolean colon = false;
|
||||||
|
for (int j = i + start.length(); j < text.length(); j++) {
|
||||||
|
if (text.charAt(j) == '|') {
|
||||||
|
st = j + 1;
|
||||||
|
if(colon){
|
||||||
|
// Special case to prevent adding
|
||||||
|
// [[File:av.png|thumb|220|220]]
|
||||||
|
add = false;
|
||||||
|
}
|
||||||
|
} else if (j + end.length() <= text.length()) {
|
||||||
|
boolean eq = true;
|
||||||
|
if (text.charAt(j) == ':') {
|
||||||
|
colon = true;
|
||||||
|
}
|
||||||
|
for (int k = 0; k < end.length(); k++) {
|
||||||
|
if (text.charAt(j + k) != end.charAt(k)) {
|
||||||
|
eq = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (eq) {
|
||||||
|
en = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(add){
|
||||||
|
d.append(text, st, en);
|
||||||
|
}
|
||||||
|
return en + end.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void processDescription(StringBuilder description, int start) {
|
||||||
|
for (int j = start ; j < text.length();) {
|
||||||
|
if (text.charAt(j) == '=' && text.charAt(j+1) == '=') {
|
||||||
|
break;
|
||||||
|
} else if (text.charAt(j) == '\n' && j - start > 2048) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
int r = -1;
|
||||||
|
if(r == -1) {
|
||||||
|
r = checkAndParse(j, "<ref", "</ref>", description, false);
|
||||||
|
}
|
||||||
|
if (r == -1) {
|
||||||
|
r = checkAndParse(j, "[[", "]]", description, true);
|
||||||
|
}
|
||||||
|
if(r == -1) {
|
||||||
|
r = checkAndParse(j, "{{", "}}", description, true);
|
||||||
|
}
|
||||||
|
if(r == -1) {
|
||||||
|
r = checkAndParse(j, "''", "''", description,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(r == -1) {
|
||||||
|
description.append(text.charAt(j));
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
j = r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeNode(double lat, double lon, String subcategory, StringBuilder description) throws XMLStreamException {
|
||||||
|
streamWriter.writeCharacters("\n");
|
||||||
|
streamWriter.writeStartElement("node");
|
||||||
|
streamWriter.writeAttribute("id", "-" + id++);
|
||||||
|
streamWriter.writeAttribute("lat", lat+"");
|
||||||
|
streamWriter.writeAttribute("lon", lon+"");
|
||||||
|
|
||||||
|
streamWriter.writeCharacters("\n ");
|
||||||
|
streamWriter.writeStartElement("tag");
|
||||||
|
streamWriter.writeAttribute("k", "name");
|
||||||
|
streamWriter.writeAttribute("v", title.toString());
|
||||||
|
streamWriter.writeEndElement();
|
||||||
|
|
||||||
|
streamWriter.writeCharacters("\n ");
|
||||||
|
streamWriter.writeStartElement("tag");
|
||||||
|
streamWriter.writeAttribute("k", "osmwiki");
|
||||||
|
streamWriter.writeAttribute("v", subcategory);
|
||||||
|
streamWriter.writeEndElement();
|
||||||
|
|
||||||
|
streamWriter.writeCharacters("\n ");
|
||||||
|
streamWriter.writeStartElement("tag");
|
||||||
|
streamWriter.writeAttribute("k", "description");
|
||||||
|
streamWriter.writeAttribute("v", description.toString().trim());
|
||||||
|
streamWriter.writeEndElement();
|
||||||
|
|
||||||
|
streamWriter.writeEndElement();
|
||||||
|
streamWriter.writeCharacters("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endDocument() throws SAXException {
|
||||||
|
try {
|
||||||
|
streamWriter.writeEndElement();
|
||||||
|
streamWriter.writeCharacters("\n");
|
||||||
|
streamWriter.writeEndDocument();
|
||||||
|
} catch (XMLStreamException e) {
|
||||||
|
throw new SAXException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -893,7 +893,7 @@ public class BinaryMapIndexWriter {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writePoiDataAtom(long id, int x24shift, int y24shift, String nameEn, String name, TIntArrayList types, String openingHours,
|
public void writePoiDataAtom(long id, int x24shift, int y24shift, String nameEn, String name, TIntArrayList types, String openingHours,
|
||||||
String site, String phone) throws IOException {
|
String site, String phone, String description) throws IOException {
|
||||||
checkPeekState(POI_DATA);
|
checkPeekState(POI_DATA);
|
||||||
|
|
||||||
OsmAndPoiBoxDataAtom.Builder builder = OsmandOdb.OsmAndPoiBoxDataAtom.newBuilder();
|
OsmAndPoiBoxDataAtom.Builder builder = OsmandOdb.OsmAndPoiBoxDataAtom.newBuilder();
|
||||||
|
@ -920,6 +920,9 @@ public class BinaryMapIndexWriter {
|
||||||
if(!Algoritms.isEmpty(phone)){
|
if(!Algoritms.isEmpty(phone)){
|
||||||
builder.setPhone(phone);
|
builder.setPhone(phone);
|
||||||
}
|
}
|
||||||
|
if(!Algoritms.isEmpty(description)){
|
||||||
|
builder.setNote(description);
|
||||||
|
}
|
||||||
|
|
||||||
codedOutStream.writeMessage(OsmandOdb.OsmAndPoiBoxData.POIDATA_FIELD_NUMBER, builder.build());
|
codedOutStream.writeMessage(OsmandOdb.OsmAndPoiBoxData.POIDATA_FIELD_NUMBER, builder.build());
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
poiPreparedStatement.setString(8, amenity.getOpeningHours());
|
poiPreparedStatement.setString(8, amenity.getOpeningHours());
|
||||||
poiPreparedStatement.setString(9, amenity.getSite());
|
poiPreparedStatement.setString(9, amenity.getSite());
|
||||||
poiPreparedStatement.setString(10, amenity.getPhone());
|
poiPreparedStatement.setString(10, amenity.getPhone());
|
||||||
|
poiPreparedStatement.setString(11, amenity.getDescription());
|
||||||
addBatch(poiPreparedStatement);
|
addBatch(poiPreparedStatement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,8 +148,8 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
// create database structure
|
// create database structure
|
||||||
Statement stat = poiConnection.createStatement();
|
Statement stat = poiConnection.createStatement();
|
||||||
stat.executeUpdate("create table " + IndexConstants.POI_TABLE + //$NON-NLS-1$
|
stat.executeUpdate("create table " + IndexConstants.POI_TABLE + //$NON-NLS-1$
|
||||||
"(id bigint, x int, y int, name_en varchar(1024), name varchar(1024), "
|
" (id bigint, x int, y int, name_en varchar(1024), name varchar(1024), "
|
||||||
+ "type varchar(1024), subtype varchar(1024), opening_hours varchar(1024), phone varchar(1024), site varchar(1024),"
|
+ "type varchar(1024), subtype varchar(1024), opening_hours varchar(1024), phone varchar(1024), site varchar(1024), description varchar(4096), "
|
||||||
+ "primary key(id, type, subtype))");
|
+ "primary key(id, type, subtype))");
|
||||||
stat.executeUpdate("create index poi_loc on poi (x, y, type, subtype)");
|
stat.executeUpdate("create index poi_loc on poi (x, y, type, subtype)");
|
||||||
stat.executeUpdate("create index poi_id on poi (id, type, subtype)");
|
stat.executeUpdate("create index poi_id on poi (id, type, subtype)");
|
||||||
|
@ -157,8 +158,8 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
|
|
||||||
// create prepared statment
|
// create prepared statment
|
||||||
poiPreparedStatement = poiConnection
|
poiPreparedStatement = poiConnection
|
||||||
.prepareStatement("INSERT INTO " + IndexConstants.POI_TABLE + "(id, x, y, name_en, name, type, subtype, opening_hours, site, phone) " + //$NON-NLS-1$//$NON-NLS-2$
|
.prepareStatement("INSERT INTO " + IndexConstants.POI_TABLE + "(id, x, y, name_en, name, type, subtype, opening_hours, site, phone, description) " + //$NON-NLS-1$//$NON-NLS-2$
|
||||||
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
pStatements.put(poiPreparedStatement, 0);
|
pStatements.put(poiPreparedStatement, 0);
|
||||||
|
|
||||||
poiConnection.setAutoCommit(false);
|
poiConnection.setAutoCommit(false);
|
||||||
|
@ -204,7 +205,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
// 0. process all entities
|
// 0. process all entities
|
||||||
ResultSet rs;
|
ResultSet rs;
|
||||||
if(useInMemoryCreator) {
|
if(useInMemoryCreator) {
|
||||||
rs = poiConnection.createStatement().executeQuery("SELECT x,y,name,name_en,type,subtype, id, opening_hours, site, phone from poi");
|
rs = poiConnection.createStatement().executeQuery("SELECT x,y,name,name_en,type,subtype,id,opening_hours,site, phone, description from poi");
|
||||||
} else {
|
} else {
|
||||||
rs = poiConnection.createStatement().executeQuery("SELECT x,y,name,name_en,type,subtype from poi");
|
rs = poiConnection.createStatement().executeQuery("SELECT x,y,name,name_en,type,subtype from poi");
|
||||||
}
|
}
|
||||||
|
@ -276,6 +277,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
poiData.openingHours = rs.getString(8);
|
poiData.openingHours = rs.getString(8);
|
||||||
poiData.site = rs.getString(9);
|
poiData.site = rs.getString(9);
|
||||||
poiData.phone = rs.getString(10);
|
poiData.phone = rs.getString(10);
|
||||||
|
poiData.description = rs.getString(11);
|
||||||
prevTree.getNode().poiData.add(poiData);
|
prevTree.getNode().poiData.add(poiData);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -342,7 +344,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
buildTypeIds(type, subtype, categories, catIndexes, types);
|
buildTypeIds(type, subtype, categories, catIndexes, types);
|
||||||
int x24shift = (x31 >> 7) - (x << (24 - z));
|
int x24shift = (x31 >> 7) - (x << (24 - z));
|
||||||
int y24shift = (y31 >> 7) - (y << (24 - z));
|
int y24shift = (y31 >> 7) - (y << (24 - z));
|
||||||
writer.writePoiDataAtom(poi.id, x24shift, y24shift, poi.nameEn, poi.name, types, poi.openingHours, poi.site, poi.phone);
|
writer.writePoiDataAtom(poi.id, x24shift, y24shift, poi.nameEn, poi.name, types, poi.openingHours, poi.site, poi.phone, poi.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -368,8 +370,9 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
String openingHours = rset.getString(8);
|
String openingHours = rset.getString(8);
|
||||||
String site = rset.getString(9);
|
String site = rset.getString(9);
|
||||||
String phone = rset.getString(10);
|
String phone = rset.getString(10);
|
||||||
|
String description = rset.getString(11);
|
||||||
|
|
||||||
writer.writePoiDataAtom(id, x24shift, y24shift, nameEn, name, types, openingHours, site, phone);
|
writer.writePoiDataAtom(id, x24shift, y24shift, nameEn, name, types, openingHours, site, phone, description);
|
||||||
}
|
}
|
||||||
rset.close();
|
rset.close();
|
||||||
}
|
}
|
||||||
|
@ -458,6 +461,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
||||||
String openingHours;
|
String openingHours;
|
||||||
String phone;
|
String phone;
|
||||||
String site;
|
String site;
|
||||||
|
String description;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PoiTileBox {
|
public static class PoiTileBox {
|
||||||
|
|
|
@ -969,6 +969,9 @@ public class MapRenderingTypes {
|
||||||
amenityTagValToType.put("amenity", AmenityType.OTHER); //$NON-NLS-1$
|
amenityTagValToType.put("amenity", AmenityType.OTHER); //$NON-NLS-1$
|
||||||
amenityTagValToType.put("place", AmenityType.ADMINISTRATIVE); //$NON-NLS-1$
|
amenityTagValToType.put("place", AmenityType.ADMINISTRATIVE); //$NON-NLS-1$
|
||||||
amenityTagValToType.put("sport", AmenityType.SPORT); //$NON-NLS-1$
|
amenityTagValToType.put("sport", AmenityType.SPORT); //$NON-NLS-1$
|
||||||
|
|
||||||
|
amenityTagValToType.put("osmwiki", AmenityType.OSMWIKI); //$NON-NLS-1$
|
||||||
|
amenityTagValToType.put("user_defined", AmenityType.USER_DEFINED); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ public class OSMSettings {
|
||||||
|
|
||||||
OPENING_HOURS("opening_hours"), //$NON-NLS-1$
|
OPENING_HOURS("opening_hours"), //$NON-NLS-1$
|
||||||
PHONE("phone"), //$NON-NLS-1$
|
PHONE("phone"), //$NON-NLS-1$
|
||||||
|
DESCRIPTION("description"), //$NON-NLS-1$
|
||||||
WEBSITE("website"), //$NON-NLS-1$
|
WEBSITE("website"), //$NON-NLS-1$
|
||||||
URL("url"), //$NON-NLS-1$
|
URL("url"), //$NON-NLS-1$
|
||||||
WIKIPEDIA("wikipedia"), //$NON-NLS-1$
|
WIKIPEDIA("wikipedia"), //$NON-NLS-1$
|
||||||
|
|
Loading…
Reference in a new issue